diff options
author | Adrian Thurston <thurston@complang.org> | 2013-03-20 21:53:13 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-03-20 21:53:13 -0400 |
commit | 083912ecea176c54e06db5667f251e902a6de55c (patch) | |
tree | 8a2e3d2a1bbeb6a1f6473c6d74e795d404a2dbce | |
parent | a47b8090b381d747d5cb6d305ecdf5c965d94c08 (diff) | |
download | colm-083912ecea176c54e06db5667f251e902a6de55c.tar.gz |
some work on context definitions
-rw-r--r-- | colm/colm.lm | 21 | ||||
-rw-r--r-- | colm/load.cc | 53 | ||||
-rw-r--r-- | colm/load.h | 8 |
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 ®ionDef ) +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 ®ionDef ); + 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(); }; |