summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--colm/colm.lm12
-rw-r--r--colm/loadsrc.cc58
-rw-r--r--colm/loadsrc.h8
-rw-r--r--test/forloop2.lm19
-rw-r--r--test/forloop3.lm21
5 files changed, 99 insertions, 19 deletions
diff --git a/colm/colm.lm b/colm/colm.lm
index 2188f906..83c7d0ec 100644
--- a/colm/colm.lm
+++ b/colm/colm.lm
@@ -119,18 +119,18 @@ def statement
[Print: print_stmt]
| [Expr: expr_stmt]
| [VarDef: var_def OptDefInit: opt_def_init]
-| [FOR ForDecl: id COLON TypeRef: type_ref IN IterCall: id BlockOrSingle: block_or_single]
+| [FOR ForDecl: id COLON TypeRef: type_ref IN IterCall: iter_call BlockOrSingle: block_or_single]
def iter_call
-# [VarRef: var_ref POPEN CodeExpr: code_expr* PCLOSE]
- [Id: id]
+ [VarRef: var_ref POPEN CodeExprList: code_expr* PCLOSE]
+| [Id: id]
def block_or_single
-# [COPEN lang_stmt_list CCLOSE]
- [Statement: statement]
+ [COPEN LangStmtList: lang_stmt_list CCLOSE]
+| [Statement: statement]
def lang_stmt_list
- [statement*]
+ [StmtList: statement*]
def opt_def_init
[EQUALS CodeExpr: code_expr]
diff --git a/colm/loadsrc.cc b/colm/loadsrc.cc
index 7f728fc8..6e8b41f9 100644
--- a/colm/loadsrc.cc
+++ b/colm/loadsrc.cc
@@ -69,11 +69,34 @@ TypeRef *LoadSource::walkTypeRef( type_ref typeRefTree )
return TypeRef::cons( internal, nspaceQual, id, repeatType );
}
+StmtList *LoadSource::walkLangStmtList( lang_stmt_list langStmtList )
+{
+ StmtList *retList = new StmtList;
+ _repeat_statement stmtList = langStmtList.StmtList();
+
+ /* Walk the list of items. */
+ while ( !stmtList.end() ) {
+ statement Statement = stmtList.value();
+ LangStmt *stmt = walkStatement( Statement );
+ retList->append( stmt );
+ stmtList = stmtList.next();
+ }
+
+ return retList;
+}
+
StmtList *LoadSource::walkBlockOrSingle( block_or_single blockOrSingle )
{
- LangStmt *stmt = walkStatement( blockOrSingle.Statement() );
- StmtList *stmtList = new StmtList;
- stmtList->append( stmt );
+ StmtList *stmtList = 0;
+ if ( blockOrSingle.Statement() != 0 ) {
+ stmtList = new StmtList;
+ LangStmt *stmt = walkStatement( blockOrSingle.Statement() );
+ stmtList->append( stmt );
+ }
+ else if ( blockOrSingle.LangStmtList() != 0 ) {
+ stmtList = walkLangStmtList( blockOrSingle.LangStmtList() );
+ }
+
return stmtList;
}
@@ -283,7 +306,7 @@ void LoadSource::walkCflDef( cfl_def &cflDef )
BaseParser::cflDef( ntDef, objectDef, defList );
}
-ExprVect *LoadSource::walkCodeExprList( _repeat_code_expr &codeExprList )
+ExprVect *LoadSource::walkCodeExprList( _repeat_code_expr codeExprList )
{
ExprVect *exprVect = new ExprVect;
while ( !codeExprList.end() ) {
@@ -318,7 +341,7 @@ QualItemVect *LoadSource::walkQual( qual &Qual )
return qualItemVect;
}
-LangVarRef *LoadSource::walkVarRef( var_ref &varRef )
+LangVarRef *LoadSource::walkVarRef( var_ref varRef )
{
qual Qual = varRef.Qual();
QualItemVect *qualItemVect = walkQual( Qual );
@@ -338,8 +361,7 @@ LangExpr *LoadSource::walkCodeExpr( code_expr codeExpr )
term = LangTerm::cons( internal, LangTerm::VarRefType, langVarRef );
}
else {
- _repeat_code_expr codeExprList = codeExpr.CodeExprList();
- ExprVect *exprVect = walkCodeExprList( codeExprList );
+ ExprVect *exprVect = walkCodeExprList( codeExpr.CodeExprList() );
term = LangTerm::cons( internal, langVarRef, exprVect );
}
@@ -391,6 +413,23 @@ ObjectField *LoadSource::walkVarDef( var_def varDef )
return ObjectField::cons( internal, typeRef, id );
}
+LangTerm *LoadSource::walkIterCall( iter_call IterCall )
+{
+ LangTerm *langTerm = 0;
+ if ( IterCall.Id() != 0 ) {
+ String tree = IterCall.Id().text().c_str();
+ langTerm = LangTerm::cons( internal,
+ LangTerm::VarRefType, LangVarRef::cons( internal, tree ) );
+ }
+ else {
+ LangVarRef *varRef = walkVarRef( IterCall.VarRef() );
+ ExprVect *exprVect = walkCodeExprList( IterCall.CodeExprList() );
+ langTerm = LangTerm::cons( internal, varRef, exprVect );
+ }
+
+ return langTerm;
+}
+
LangStmt *LoadSource::walkStatement( statement Statement )
{
LangStmt *stmt = 0;
@@ -410,16 +449,13 @@ LangStmt *LoadSource::walkStatement( statement Statement )
stmt = varDef( objField, expr, LangStmt::AssignType );
}
else if ( Statement.ForDecl() != 0 ) {
- std::cerr << "local: " << pd->curLocalFrame << std::endl;
pd->curLocalFrame->pushScope();
String forDecl = Statement.ForDecl().text().c_str();
TypeRef *typeRef = walkTypeRef( Statement.TypeRef() );
StmtList *stmtList = walkBlockOrSingle( Statement.BlockOrSingle() );
- String tree = Statement.IterCall().text().c_str();
- LangTerm *langTerm = LangTerm::cons( internal, LangTerm::VarRefType,
- LangVarRef::cons( internal, tree ) );
+ LangTerm *langTerm = walkIterCall( Statement.IterCall() );
stmt = forScope( internal, forDecl, typeRef, langTerm, stmtList );
diff --git a/colm/loadsrc.h b/colm/loadsrc.h
index dafce56a..47dfcba7 100644
--- a/colm/loadsrc.h
+++ b/colm/loadsrc.h
@@ -50,6 +50,8 @@ struct _repeat_root_item;
struct namespace_def;
struct var_def;
struct block_or_single;
+struct iter_call;
+struct lang_stmt_list;
struct LoadSource
:
@@ -73,21 +75,23 @@ struct LoadSource
LexFactorAug *walkLexFactorAug( lex_factor_rep &LexFactorRepTree );
LexTerm *walkLexTerm( lex_term &LexTerm );
LexExpression *walkLexExpr( lex_expr &LexExpr );
- ExprVect *walkCodeExprList( _repeat_code_expr &codeExprList );
+ ExprVect *walkCodeExprList( _repeat_code_expr codeExprList );
LangExpr *walkCodeExpr( code_expr codeExpr );
void walkTokenList( token_list &TokenList );
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 );
+ LangTerm *walkIterCall( iter_call IterCall );
LangStmt *walkStatement( statement Statement );
LangStmt *walkPrintStmt( print_stmt &PrintStmt );
LangStmt *walkExprStmt( expr_stmt &ExprStmt );
QualItemVect *walkQual( qual &Qual );
- LangVarRef *walkVarRef( var_ref &varRef );
+ LangVarRef *walkVarRef( var_ref varRef );
void walkRootItem( root_item &rootItem, StmtList *stmtList );
StmtList *walkRootItemList( _repeat_root_item rootItemList );
void walkNamespaceDef( namespace_def NamespaceDef );
+ StmtList *walkLangStmtList( lang_stmt_list LangStmtList );
StmtList *walkBlockOrSingle( block_or_single blockOrSingle );
void go();
};
diff --git a/test/forloop2.lm b/test/forloop2.lm
new file mode 100644
index 00000000..da6ad5d6
--- /dev/null
+++ b/test/forloop2.lm
@@ -0,0 +1,19 @@
+##### LM #####
+lex
+ token id / 'a' .. 'z' /
+ ignore / '\n' | '\t' | ' ' /
+end
+
+def start
+ [id*]
+
+parse P: start[stdin]
+Start: start = P.tree
+for Id: id in triter(Start)
+ print( Id '\n' )
+##### IN #####
+d e f
+##### EXP #####
+d
+e
+f
diff --git a/test/forloop3.lm b/test/forloop3.lm
new file mode 100644
index 00000000..e1a1fa3e
--- /dev/null
+++ b/test/forloop3.lm
@@ -0,0 +1,21 @@
+##### LM #####
+lex
+ token id / 'a' .. 'z' /
+ ignore / '\n' | '\t' | ' ' /
+end
+
+def start
+ [id*]
+
+parse P: start[stdin]
+Start: start = P.tree
+for Id: id in triter(Start) {
+ print( Id )
+ print( '\n' )
+}
+##### IN #####
+d e f
+##### EXP #####
+d
+e
+f