From f3b346c43ef2dde04fea81ebb7d882e141229204 Mon Sep 17 00:00:00 2001 From: Adrian Thurston Date: Thu, 21 Mar 2013 22:20:16 -0400 Subject: added while loops --- colm/colm.lm | 2 ++ colm/load.cc | 9 +++++++++ 2 files changed, 11 insertions(+) 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 ) { -- cgit v1.2.1