summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-03-21 22:20:16 -0400
committerAdrian Thurston <thurston@complang.org>2013-03-21 22:20:16 -0400
commitf3b346c43ef2dde04fea81ebb7d882e141229204 (patch)
tree714494c8be6f32f90ce6174b1ed1e6601519d3b1
parente8d9cf2d25e1f2570e6edbd017d63ea5159eb99f (diff)
downloadcolm-f3b346c43ef2dde04fea81ebb7d882e141229204.tar.gz
added while loops
-rw-r--r--colm/colm.lm2
-rw-r--r--colm/load.cc9
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 ) {