summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-23 13:24:12 -0400
committerAdrian Thurston <thurston@complang.org>2013-03-23 13:24:12 -0400
commit64303886013e4b0b84db46c4a447b41c8dab0596 (patch)
tree55f64c61ea01420a1e308c1dc8bad6570b0e97c7
parent6fe9c1d959264bcf25f35f9e67ed5db35bc9e073 (diff)
downloadcolm-64303886013e4b0b84db46c4a447b41c8dab0596.tar.gz
obj var lists
-rw-r--r--colm/colm.lm8
-rw-r--r--colm/load.cc36
-rw-r--r--test/superid.exp7
-rw-r--r--test/superid.in1
-rw-r--r--test/superid.lm11
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>