From 083912ecea176c54e06db5667f251e902a6de55c Mon Sep 17 00:00:00 2001 From: Adrian Thurston Date: Wed, 20 Mar 2013 21:53:13 -0400 Subject: some work on context definitions --- colm/colm.lm | 21 ++++++++++++++++++++- colm/load.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++-------- 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(); }; -- cgit v1.2.1