diff options
author | Adrian Thurston <thurston@complang.org> | 2013-03-24 17:03:42 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-03-24 17:03:42 -0400 |
commit | b4854c7a53f2d5938ee0c4edbe3d4c941b741164 (patch) | |
tree | e84598a79eeae0b367d94815d336e466f53b8c90 | |
parent | 31b77c1b63dbac603053153c270844019baee055 (diff) | |
download | colm-b4854c7a53f2d5938ee0c4edbe3d4c941b741164.tar.gz |
added global, fixed export and added tilde to constructor and accumulator
-rw-r--r-- | colm/colm.lm | 10 | ||||
-rw-r--r-- | colm/load.cc | 45 |
2 files changed, 51 insertions, 4 deletions
diff --git a/colm/colm.lm b/colm/colm.lm index e173b34e..ebbe7e7a 100644 --- a/colm/colm.lm +++ b/colm/colm.lm @@ -40,6 +40,7 @@ lex token COMMIT / 'commit' / token NEW / 'new' / token PREEOF / 'preeof' / + token GLOBAL / 'global' / token MAKE_TOKEN / 'make_token' / token MAKE_TREE / 'make_tree' / @@ -193,7 +194,7 @@ def root_item | [FunctionDef: function_def] | [IterDef: iter_def] | [Statement: statement] -#| [global_def] +| [GlobalDef: global_def] | [ExportDef: export_def] | [PreEof: pre_eof] | [PrecedenceDef: precedence_def] @@ -243,6 +244,9 @@ def context_item def export_def [EXPORT VarDef: var_def OptDefInit: opt_def_init] +def global_def + [GLOBAL VarDef: var_def OptDefInit: opt_def_init] + def iter_def [ITER Id: id POPEN ParamVarDefList: param_var_def* PCLOSE COPEN LangStmtList: lang_stmt_list CCLOSE] @@ -538,6 +542,7 @@ def lit_cons_term def cons_el [RegionQual: region_qual Lit: lit] +| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] | [DQ LitConsElList: lit_cons_el* Term: lit_cons_term] | [CodeExpr: code_expr] @@ -547,6 +552,7 @@ def lit_cons_el def cons_top_el [DQ LitConsElList: lit_cons_el* Term: lit_cons_term] +| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] | [SQOPEN ConsElList: cons_el* SQCLOSE] def cons_list @@ -592,6 +598,7 @@ def cstring def accum_el [CodeExpr: code_expr] +| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] | [DQ LitAccumElList: lit_accum_el* Term: lit_cons_term] def lit_accum_el @@ -600,6 +607,7 @@ def lit_accum_el def accum_top_el [DQ LitAccumElList: lit_accum_el* Term: lit_cons_term] +| [TILDE TildeData: opt_tilde_data Nl: TILDE_NL] | [SQOPEN AccumElList: accum_el* SQCLOSE] def accum_list diff --git a/colm/load.cc b/colm/load.cc index 521d0e67..fc477cbe 100644 --- a/colm/load.cc +++ b/colm/load.cc @@ -150,7 +150,7 @@ struct LoadSource LangExpr *left = walkCodeExpr( codeExpr.Expr() ); LangExpr *right = walkCodeRelational( codeExpr.Relational() ); - char type; + char type = -1; if ( codeExpr.BarBar() != 0 ) type = OP_LogicalOr; else if ( codeExpr.AmpAmp() != 0 ) @@ -358,7 +358,7 @@ struct LoadSource LangExpr *walkCodeMultiplicitive( code_multiplicitive mult ) { - LangExpr *expr; + LangExpr *expr = 0; if ( mult.Multiplicitive() != 0 ) { LangExpr *left = walkCodeMultiplicitive( mult.Multiplicitive() ); LangExpr *right = walkCodeUnary( mult.Unary() ); @@ -523,6 +523,14 @@ struct LoadSource return exportStmt( objField, LangStmt::AssignType, expr ); } + LangStmt *walkGlobalDef( global_def GlobalDef ) + { + ObjectField *objField = walkVarDef( GlobalDef.VarDef() ); + LangExpr *expr = walkOptDefInit( GlobalDef.OptDefInit() ); + + return globalDef( objField, expr, LangStmt::AssignType ); + } + void walkAliasDef( alias_def aliasDef ) { String id = aliasDef.Id().text().c_str(); @@ -1042,6 +1050,12 @@ struct LoadSource String lit = consEl.Lit().text().c_str(); list = consElLiteral( internal, lit, nspaceQual ); } + else if ( consEl.TildeData() != 0 ) { + String consData = consEl.TildeData().text().c_str(); + consData += '\n'; + ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); + list = ConsItemList::cons( consItem ); + } else if ( consEl.CodeExpr() != 0 ) { LangExpr *consExpr = walkCodeExpr( consEl.CodeExpr() ); ConsItem *consItem = ConsItem::cons( internal, ConsItem::ExprType, consExpr ); @@ -1069,6 +1083,12 @@ struct LoadSource ConsItemList *list = 0; if ( consTopEl.LitConsElList() != 0 ) list = walkLitConsElList( consTopEl.LitConsElList(), consTopEl.Term().Nl() ); + else if ( consTopEl.TildeData() != 0 ) { + String consData = consTopEl.TildeData().text().c_str(); + consData += '\n'; + ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); + list = ConsItemList::cons( consItem ); + } else if ( consTopEl.ConsElList() != 0 ) { list = walkConsElList( consTopEl.ConsElList() ); } @@ -1238,6 +1258,12 @@ struct LoadSource if ( accumEl.LitAccumElList() != 0 ) { list = walkLitAccumElList( accumEl.LitAccumElList(), accumEl.Term().Nl() ); } + else if ( accumEl.TildeData() != 0 ) { + String consData = accumEl.TildeData().text().c_str(); + consData += '\n'; + ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); + list = ConsItemList::cons( consItem ); + } else if ( accumEl.CodeExpr() != 0 ) { LangExpr *accumExpr = walkCodeExpr( accumEl.CodeExpr() ); ConsItem *consItem = ConsItem::cons( internal, ConsItem::ExprType, accumExpr ); @@ -1262,6 +1288,12 @@ struct LoadSource ConsItemList *list = 0; if ( accumTopEl.LitAccumElList() != 0 ) list = walkLitAccumElList( accumTopEl.LitAccumElList(), accumTopEl.Term().Nl() ); + else if ( accumTopEl.TildeData() != 0 ) { + String consData = accumTopEl.TildeData().text().c_str(); + consData += '\n'; + ConsItem *consItem = ConsItem::cons( internal, ConsItem::InputText, consData ); + list = ConsItemList::cons( consItem ); + } else if ( accumTopEl.AccumElList() != 0 ) { list = walkAccumElList( accumTopEl.AccumElList() ); } @@ -1747,7 +1779,9 @@ struct LoadSource walkPreEof( rootItem.PreEof() ); } else if ( rootItem.ExportDef() != 0 ) { - walkExportDef( rootItem.ExportDef() ); + LangStmt *stmt = walkExportDef( rootItem.ExportDef() ); + if ( stmt != 0 ) + stmtList->append( stmt ); } else if ( rootItem.AliasDef() != 0 ) { walkAliasDef( rootItem.AliasDef() ); @@ -1759,6 +1793,11 @@ struct LoadSource StmtList *includeList = walkInclude( rootItem.Include() ); stmtList->append( *includeList ); } + else if ( rootItem.GlobalDef() != 0 ) { + LangStmt *stmt = walkGlobalDef( rootItem.GlobalDef() ); + if ( stmt != 0 ) + stmtList->append( stmt ); + } } bool walkOptNoIgnore( opt_no_ignore OptNoIngore ) |