diff options
-rw-r--r-- | colm/colm.lm | 12 | ||||
-rw-r--r-- | colm/loadsrc.cc | 58 | ||||
-rw-r--r-- | colm/loadsrc.h | 8 | ||||
-rw-r--r-- | test/forloop2.lm | 19 | ||||
-rw-r--r-- | test/forloop3.lm | 21 |
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 ®ionDef ); 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 |