summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-23 09:57:36 -0400
committerAdrian Thurston <thurston@complang.org>2013-03-23 09:57:36 -0400
commit0c280421ed17e4d93009f4a5acc3f553ba02495d (patch)
treea0e48241dadaeaa6dbab7519ee6100b7039aac26
parent3227ec613e5350c67972bb4d36e8dc39cf7494e1 (diff)
downloadcolm-0c280421ed17e4d93009f4a5acc3f553ba02495d.tar.gz
added export
-rw-r--r--colm/colm.lm8
-rw-r--r--colm/load.cc26
-rw-r--r--test/export1.exp0
-rw-r--r--test/export1.in0
-rw-r--r--test/export1.lm3
5 files changed, 32 insertions, 5 deletions
diff --git a/colm/colm.lm b/colm/colm.lm
index aff87c99..8dfee66f 100644
--- a/colm/colm.lm
+++ b/colm/colm.lm
@@ -28,6 +28,7 @@ lex
token PTR / 'ptr' /
token ITER / 'iter' /
token REF / 'ref' /
+ token EXPORT / 'export' /
token LITERAL /'literal'/
token CONTEXT /'context'/
@@ -153,7 +154,7 @@ def root_item
| [IterDef: iter_def]
| [Statement: statement]
#| [global_def]
-#| [export_def]
+| [ExportDef: export_def]
#| [pre_eof]
#| [precedence]
#| [typedef]
@@ -169,10 +170,13 @@ def context_item
| [ContextDef: context_def]
| [FunctionDef: function_def]
| [IterDef: iter_def]
-#| [export_def]
+| [ExportDef: export_def]
#| [pre_eof]
#| [precedence]
+def export_def
+ [EXPORT 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]
diff --git a/colm/load.cc b/colm/load.cc
index cf6c9df3..3828ec04 100644
--- a/colm/load.cc
+++ b/colm/load.cc
@@ -302,6 +302,22 @@ struct LoadSource
{
return walkPatternList( Pattern.PatternList() );
}
+
+ LangExpr *walkOptDefInit( opt_def_init optDefInit )
+ {
+ LangExpr *expr = 0;
+ if ( optDefInit.CodeExpr() != 0 )
+ expr = walkCodeExpr( optDefInit.CodeExpr() );
+ return expr;
+ }
+
+ LangStmt *walkExportDef( export_def exportDef )
+ {
+ ObjectField *objField = walkVarDef( exportDef.VarDef() );
+ LangExpr *expr = walkOptDefInit( exportDef.OptDefInit() );
+
+ return exportStmt( objField, LangStmt::AssignType, expr );
+ }
};
@@ -1317,9 +1333,7 @@ LangStmt *LoadSource::walkStatement( statement Statement )
}
else if ( Statement.VarDef() != 0 ) {
ObjectField *objField = walkVarDef( Statement.VarDef() );
- LangExpr *expr = 0;
- if ( Statement.OptDefInit().CodeExpr() != 0 )
- expr = walkCodeExpr( Statement.OptDefInit().CodeExpr() );
+ LangExpr *expr = walkOptDefInit( Statement.OptDefInit() );
stmt = varDef( objField, expr, LangStmt::AssignType );
}
else if ( Statement.ForDecl() != 0 ) {
@@ -1473,6 +1487,9 @@ void LoadSource::walkContextItem( context_item contextItem )
else if ( contextItem.IterDef() != 0 ) {
walkIterDef( contextItem.IterDef() );
}
+ else if ( contextItem.ExportDef() != 0 ) {
+ walkExportDef( contextItem.ExportDef() );
+ }
}
void LoadSource::walkContextDef( context_def contextDef )
@@ -1538,6 +1555,9 @@ void LoadSource::walkRootItem( root_item &rootItem, StmtList *stmtList )
else if ( rootItem.IterDef() != 0 ) {
walkIterDef( rootItem.IterDef() );
}
+ else if ( rootItem.ExportDef() != 0 ) {
+ walkExportDef( rootItem.ExportDef() );
+ }
}
bool walkOptNoIgnore( opt_no_ignore OptNoIngore )
diff --git a/test/export1.exp b/test/export1.exp
deleted file mode 100644
index e69de29b..00000000
--- a/test/export1.exp
+++ /dev/null
diff --git a/test/export1.in b/test/export1.in
deleted file mode 100644
index e69de29b..00000000
--- a/test/export1.in
+++ /dev/null
diff --git a/test/export1.lm b/test/export1.lm
index ae1e6c4b..8f42cec3 100644
--- a/test/export1.lm
+++ b/test/export1.lm
@@ -1,3 +1,4 @@
+##### LM #####
lex
token id /[a-z]+/
ignore /[ \t]+/
@@ -11,3 +12,5 @@ export Error: str
parse P: start[ stdin ]
Error = P.error
+##### IN #####
+##### EXP #####