summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-24 17:03:42 -0400
committerAdrian Thurston <thurston@complang.org>2013-03-24 17:03:42 -0400
commitb4854c7a53f2d5938ee0c4edbe3d4c941b741164 (patch)
treee84598a79eeae0b367d94815d336e466f53b8c90
parent31b77c1b63dbac603053153c270844019baee055 (diff)
downloadcolm-b4854c7a53f2d5938ee0c4edbe3d4c941b741164.tar.gz
added global, fixed export and added tilde to constructor and accumulator
-rw-r--r--colm/colm.lm10
-rw-r--r--colm/load.cc45
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 )