summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-20 21:53:13 -0400
committerAdrian Thurston <thurston@complang.org>2013-03-20 21:53:13 -0400
commit083912ecea176c54e06db5667f251e902a6de55c (patch)
tree8a2e3d2a1bbeb6a1f6473c6d74e795d404a2dbce
parenta47b8090b381d747d5cb6d305ecdf5c965d94c08 (diff)
downloadcolm-083912ecea176c54e06db5667f251e902a6de55c.tar.gz
some work on context definitions
-rw-r--r--colm/colm.lm21
-rw-r--r--colm/load.cc53
-rw-r--r--colm/load.h8
3 files changed, 71 insertions, 11 deletions
diff --git a/colm/colm.lm b/colm/colm.lm
index b6610fa6..f58f3510 100644
--- a/colm/colm.lm
+++ b/colm/colm.lm
@@ -15,6 +15,7 @@ lex
token IN / 'in' /
token LITERAL /'literal'/
+ token CONTEXT /'context'/
token NI /'ni'/
token NIL / 'nil' /
@@ -107,7 +108,7 @@ def root_item
| [IgnoreDef: ignore_def]
| [CflDef: cfl_def]
| [RegionDef: region_def]
-#| [context_def]
+| [ContextDef: context_def]
| [NamespaceDef: namespace_def]
#| [function_def]
#| [iter_def]
@@ -118,6 +119,24 @@ def root_item
#| [precedence]
#| [typedef]
+def context_item
+# [context_var_def]
+ [LiteralDef: literal_def]
+#| [rl_def]
+| [TokenDef: token_def]
+| [IgnoreDef: ignore_def]
+| [CflDef: cfl_def]
+| [RegionDef: region_def]
+| [ContextDef: context_def]
+#| [function_def]
+#| [iter_def]
+#| [export_def]
+#| [pre_eof]
+#| [precedence]
+
+def context_def
+ [CONTEXT Name: id ContextItemList: context_item* END]
+
def literal_def
[LITERAL LiteralList: literal_list]
diff --git a/colm/load.cc b/colm/load.cc
index 6f1973d8..f11a76b0 100644
--- a/colm/load.cc
+++ b/colm/load.cc
@@ -366,14 +366,14 @@ void LoadSource::walkIgnoreDef( ignore_def IgnoreDef )
defineToken( internal, 0, join, objectDef, 0, true, false, false );
}
-void LoadSource::walkLexRegion( region_def &regionDef )
+void LoadSource::walkLexRegion( region_def regionDef )
{
pushRegionSet( internal );
walkRootItemList( regionDef.RootItemList() );
popRegionSet();
}
-void LoadSource::walkCflDef( cfl_def &cflDef )
+void LoadSource::walkCflDef( cfl_def cflDef )
{
prod_list prodList = cflDef.ProdList();
@@ -622,6 +622,43 @@ LangStmt *LoadSource::walkStatement( statement Statement )
return stmt;
}
+void LoadSource::walkContextItem( context_item contextItem )
+{
+ if ( contextItem.TokenDef() != 0 ) {
+ walkTokenDef( contextItem.TokenDef() );
+ }
+ else if ( contextItem.IgnoreDef() != 0 ) {
+ walkIgnoreDef( contextItem.IgnoreDef() );
+ }
+ else if ( contextItem.LiteralDef() != 0 ) {
+ walkLiteralDef( contextItem.LiteralDef() );
+ }
+ else if ( contextItem.CflDef() != 0 ) {
+ walkCflDef( contextItem.CflDef() );
+ }
+ else if ( contextItem.RegionDef() != 0 ) {
+ walkLexRegion( contextItem.RegionDef() );
+ }
+ else if ( contextItem.ContextDef() != 0 ) {
+ walkContextDef( contextItem.ContextDef() );
+ }
+}
+
+void LoadSource::walkContextDef( context_def contextDef )
+{
+ String name = contextDef.Name().text().c_str();
+ contextHead( internal, name );
+
+ _repeat_context_item contextItemList = contextDef.ContextItemList();
+ while ( !contextItemList.end() ) {
+ walkContextItem( contextItemList.value() );
+ contextItemList = contextItemList.next();
+ }
+
+ contextStack.pop();
+ namespaceStack.pop();
+}
+
void LoadSource::walkNamespaceDef( namespace_def NamespaceDef )
{
String name = NamespaceDef.Name().text().c_str();
@@ -642,19 +679,19 @@ void LoadSource::walkRootItem( root_item &rootItem, StmtList *stmtList )
walkLiteralDef( rootItem.LiteralDef() );
}
else if ( rootItem.CflDef() != 0 ) {
- cfl_def cflDef = rootItem.CflDef();
- walkCflDef( cflDef );
+ walkCflDef( rootItem.CflDef() );
}
else if ( rootItem.RegionDef() != 0 ) {
- region_def regionDef = rootItem.RegionDef();
- walkLexRegion( regionDef );
+ walkLexRegion( rootItem.RegionDef() );
}
else if ( rootItem.Statement() != 0 ) {
- statement Statement = rootItem.Statement();
- LangStmt *stmt = walkStatement( Statement );
+ LangStmt *stmt = walkStatement( rootItem.Statement() );
if ( stmt != 0 )
stmtList->append( stmt );
}
+ else if ( rootItem.ContextDef() != 0 ) {
+ walkContextDef( rootItem.ContextDef() );
+ }
else if ( rootItem.NamespaceDef() != 0 ) {
walkNamespaceDef( rootItem.NamespaceDef() );
}
diff --git a/colm/load.h b/colm/load.h
index 77ecb8c1..d75c2b21 100644
--- a/colm/load.h
+++ b/colm/load.h
@@ -63,6 +63,8 @@ struct literal_list;
struct literal_def;
struct token_def;
struct ignore_def;
+struct context_def;
+struct context_item;
struct LoadSource
:
@@ -93,10 +95,10 @@ struct LoadSource
ExprVect *walkCodeExprList( _repeat_code_expr codeExprList );
LangExpr *walkCodeExpr( code_expr codeExpr );
void walkTokenList( token_list &TokenList );
- void walkLexRegion( region_def &regionDef );
+ void walkLexRegion( region_def regionDef );
void walkProdElList( ProdElList *list, prod_el_list &ProdElList );
void walkProdList( LelDefList *lelDefList, prod_list &ProdList );
- void walkCflDef( cfl_def &cflDef );
+ void walkCflDef( cfl_def cflDef );
LangTerm *walkIterCall( iter_call IterCall );
LangStmt *walkOptionalElse( optional_else optionalElse );
LangStmt *walkElsifClause( elsif_clause elsifClause );
@@ -119,6 +121,8 @@ struct LoadSource
void walkTokenDef( token_def TokenDef );
void walkIgnoreDef( ignore_def IgnoreDef );
+ void walkContextDef( context_def contextDef );
+ void walkContextItem( context_item contextItem );
void go();
};