diff options
author | Adrian Thurston <thurston@complang.org> | 2013-03-21 22:20:16 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-03-21 22:20:16 -0400 |
commit | f3b346c43ef2dde04fea81ebb7d882e141229204 (patch) | |
tree | 714494c8be6f32f90ce6174b1ed1e6601519d3b1 | |
parent | e8d9cf2d25e1f2570e6edbd017d63ea5159eb99f (diff) | |
download | colm-f3b346c43ef2dde04fea81ebb7d882e141229204.tar.gz |
added while loops
-rw-r--r-- | colm/colm.lm | 2 | ||||
-rw-r--r-- | colm/load.cc | 9 |
2 files changed, 11 insertions, 0 deletions
diff --git a/colm/colm.lm b/colm/colm.lm index dce0f83b..e559209c 100644 --- a/colm/colm.lm +++ b/colm/colm.lm @@ -15,6 +15,7 @@ lex token NAMESPACE / 'namespace' / token FOR / 'for' / token IF / 'if' / + token WHILE / 'while' / token ELSIF / 'elsif' / token ELSE / 'else' / token IN / 'in' / @@ -219,6 +220,7 @@ def statement | [VarDef: var_def OptDefInit: opt_def_init] | [FOR ForDecl: id COLON TypeRef: type_ref IN IterCall: iter_call BlockOrSingle: block_or_single] | [IF IfExpr: code_expr BlockOrSingle: block_or_single ElsifList: elsif_list] +| [WHILE WhileExpr: code_expr BlockOrSingle: block_or_single] | [LhsVarRef: var_ref EQUALS CodeExpr: code_expr] def elsif_list diff --git a/colm/load.cc b/colm/load.cc index 74dad87a..baceb95e 100644 --- a/colm/load.cc +++ b/colm/load.cc @@ -962,9 +962,18 @@ LangStmt *LoadSource::walkStatement( statement Statement ) LangExpr *expr = walkCodeExpr( Statement.IfExpr() ); StmtList *stmtList = walkBlockOrSingle( Statement.BlockOrSingle() ); + + popScope(); + LangStmt *elsifList = walkElsifList( Statement.ElsifList() ); stmt = LangStmt::cons( LangStmt::IfType, expr, stmtList, elsifList ); + } + else if ( Statement.WhileExpr() != 0 ) { + pushScope(); + LangExpr *expr = walkCodeExpr( Statement.WhileExpr() ); + StmtList *stmtList = walkBlockOrSingle( Statement.BlockOrSingle() ); + stmt = LangStmt::cons( LangStmt::WhileType, expr, stmtList ); popScope(); } else if ( Statement.LhsVarRef() != 0 ) { |