diff options
author | Adrian Thurston <thurston@complang.org> | 2013-03-23 13:24:12 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-03-23 13:24:12 -0400 |
commit | 64303886013e4b0b84db46c4a447b41c8dab0596 (patch) | |
tree | 55f64c61ea01420a1e308c1dc8bad6570b0e97c7 | |
parent | 6fe9c1d959264bcf25f35f9e67ed5db35bc9e073 (diff) | |
download | colm-64303886013e4b0b84db46c4a447b41c8dab0596.tar.gz |
obj var lists
-rw-r--r-- | colm/colm.lm | 8 | ||||
-rw-r--r-- | colm/load.cc | 36 | ||||
-rw-r--r-- | test/superid.exp | 7 | ||||
-rw-r--r-- | test/superid.in | 1 | ||||
-rw-r--r-- | test/superid.lm | 11 |
5 files changed, 42 insertions, 21 deletions
diff --git a/colm/colm.lm b/colm/colm.lm index 714c90b8..cb9f2266 100644 --- a/colm/colm.lm +++ b/colm/colm.lm @@ -237,8 +237,11 @@ def opt_no_ignore def namespace_def [NAMESPACE Name: id RootItemList: root_item* END] +def obj_var_list + [] + def cfl_def - [DEF DefId: id ProdList: prod_list] + [DEF DefId: id VarDefList: var_def* ProdList: prod_list] def region_def [LEX RootItemList: root_item* END] @@ -251,7 +254,8 @@ def opt_lex_expr | [] def token_def - [TOKEN Id: id LEX_FSLASH OptExpr: opt_lex_expr LEX_FSLASH + [TOKEN Id: id VarDefList: var_def* + LEX_FSLASH OptExpr: opt_lex_expr LEX_FSLASH OptTranslate: opt_translate] def opt_translate diff --git a/colm/load.cc b/colm/load.cc index 7e6505af..c36868e7 100644 --- a/colm/load.cc +++ b/colm/load.cc @@ -161,7 +161,7 @@ struct LoadSource LangExpr *walkCodeExpr( code_expr codeExpr ); void walkLexRegion( region_def regionDef ); void walkProdElList( ProdElList *list, prod_el_list ProdElList ); - void walkProdList( LelDefList *lelDefList, prod_list &ProdList ); + void walkProdList( LelDefList *lelDefList, prod_list ProdList ); void walkCflDef( cfl_def cflDef ); LangTerm *walkIterCall( iter_call IterCall ); LangStmt *walkOptionalElse( optional_else optionalElse ); @@ -318,7 +318,8 @@ struct LoadSource { String name = TokenDef.Id().text().c_str(); - ObjectDef *objectDef = ObjectDef::cons( ObjectDef::UserType, name, pd->nextObjectId++ ); + ObjectDef *objectDef = walkVarDefList( TokenDef.VarDefList() ); + objectDef->name = name; LexJoin *join = 0; if ( TokenDef.OptExpr().Expr() != 0 ) { @@ -339,6 +340,20 @@ struct LoadSource return name; } + ObjectDef *walkVarDefList( _repeat_var_def varDefList ) + { + ObjectDef *objectDef = ObjectDef::cons( ObjectDef::UserType, + String(), pd->nextObjectId++ ); + + while ( !varDefList.end() ) { + ObjectField *varDef = walkVarDef( varDefList.value() ); + objVarDef( objectDef, varDef ); + varDefList = varDefList.next(); + } + + return objectDef; + } + void walkIgnoreDef( ignore_def IgnoreDef ) { String name = walkOptId( IgnoreDef.OptId() ); @@ -697,12 +712,10 @@ CodeBlock *LoadSource::walkOptReduce( opt_reduce optReduce ) return block; } -void LoadSource::walkProdList( LelDefList *lelDefList, prod_list &ProdList ) +void LoadSource::walkProdList( LelDefList *lelDefList, prod_list ProdList ) { - if ( ProdList.ProdList() != 0 ) { - prod_list RightProdList = ProdList.ProdList(); - walkProdList( lelDefList, RightProdList ); - } + if ( ProdList.ProdList() != 0 ) + walkProdList( lelDefList, ProdList.ProdList() ); ProdElList *list = new ProdElList; @@ -841,14 +854,15 @@ void LoadSource::walkLexRegion( region_def regionDef ) void LoadSource::walkCflDef( cfl_def cflDef ) { - prod_list prodList = cflDef.ProdList(); + String name = cflDef.DefId().text().c_str(); + ObjectDef *objectDef = walkVarDefList( cflDef.VarDefList() ); + objectDef->name = name; LelDefList *defList = new LelDefList; - walkProdList( defList, prodList ); + walkProdList( defList, cflDef.ProdList() ); - String name = cflDef.DefId().text().c_str(); NtDef *ntDef = NtDef::cons( name, namespaceStack.top(), contextStack.top(), false ); - ObjectDef *objectDef = ObjectDef::cons( ObjectDef::UserType, name, pd->nextObjectId++ ); + BaseParser::cflDef( ntDef, objectDef, defList ); } diff --git a/test/superid.exp b/test/superid.exp deleted file mode 100644 index 2bf95a48..00000000 --- a/test/superid.exp +++ /dev/null @@ -1,7 +0,0 @@ -old_id = NIL -new_id = 13 -old_id = NIL -new_id = 12 -this is item2 -<si::start><si::item2><si::e2></si::e2><si::_literal_0001>!</si::_literal_0001><si::_literal_0003>a</si::_literal_0003><si::super_id>b</si::super_id><si::super_id>b</si::super_id><si::_literal_0003>a</si::_literal_0003></si::item2><si::_literal_0005>; -</si::_literal_0005></si::start> diff --git a/test/superid.in b/test/superid.in deleted file mode 100644 index 4002630f..00000000 --- a/test/superid.in +++ /dev/null @@ -1 +0,0 @@ -!a b b a; diff --git a/test/superid.lm b/test/superid.lm index 00f05a47..2736c66d 100644 --- a/test/superid.lm +++ b/test/superid.lm @@ -1,3 +1,4 @@ +##### LM ##### context si lex literal '!', 'a', ';\n' @@ -61,3 +62,13 @@ cons SuperId: si[] parse S: si::start(SuperId)[stdin] print_xml( S.tree ) print( '\n' ) +##### IN ##### +!a b b a; +##### EXP ##### +old_id = NIL +new_id = 13 +old_id = NIL +new_id = 12 +this is item2 +<si::start><si::item2><si::e2></si::e2><si::_literal_0001>!</si::_literal_0001><si::_literal_0003>a</si::_literal_0003><si::super_id>b</si::super_id><si::super_id>b</si::super_id><si::_literal_0003>a</si::_literal_0003></si::item2><si::_literal_0005>; +</si::_literal_0005></si::start> |