ref: 506a23fd4d5794c30465a9e92c982c1e0f503914
parent: d73d54388b6c16e61ecceecb21a3df258f33c434
parent: 8eef2702d6533ca399758c38acedf0f086b93e13
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Jan 19 13:33:27 EST 2016
Merge pull request #54 from andrewchambers/foroptexpr fix decl for with no cond and add more tests
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -143,7 +143,7 @@
%type <node> bandexpr cmpexpr unionexpr addexpr mulexpr shiftexpr prefixexpr postfixexpr
%type <node> funclit seqlit tuplit name block stmt label use
%type <node> fnparam declbody declcore typedeclcore structent arrayelt structelt tuphead
-%type <node> ifstmt forstmt whilestmt matchstmt elifs optexprln optexpr
+%type <node> ifstmt forstmt whilestmt matchstmt elifs optexprln loopcond optexpr
%type <node> match
%type <node> castexpr
%type <ucon> unionelt
@@ -591,6 +591,10 @@
| /* empty */ {$$ = NULL;}
;
+loopcond : exprln {$$ = $1;}
+ | Tendln {$$ = mkboollit($1->loc, 1);}
+ ;
+
optexprln: exprln {$$ = $1;}
| Tendln {$$ = NULL;}
;
@@ -870,14 +874,11 @@
{$$ = mkexpr($1->loc, Ocontinue, NULL);}
;
-forstmt : Tfor optexprln optexprln optexprln block {
- if(!$3)
- $3 = mkboollit($1->loc, 1);
- $$ = mkloopstmt($1->loc, $2, $3, $4, $5);
- }
+forstmt : Tfor optexprln loopcond optexprln block
+ {$$ = mkloopstmt($1->loc, $2, $3, $4, $5);}
| Tfor expr Tin exprln block
{$$ = mkiterstmt($1->loc, $2, $4, $5);}
- | Tfor decl Tendln optexprln optexprln block {
+ | Tfor decl Tendln loopcond optexprln block {
//Node *init;
if ($2.nn != 1)
lfatal($1->loc, "only one declaration is allowed in for loop");
--- a/test/fornocond.myr
+++ /dev/null
@@ -1,14 +1,0 @@
-use std
-
-const main = {
- var i
-
- for i = 0; ; i++
- if i == 10
- break;
- ;;
- ;;
- if i == 10
- std.put("pass\n")
- ;;
-}
--- /dev/null
+++ b/test/foroptexpr.myr
@@ -1,0 +1,65 @@
+use std
+
+const main = {
+ var i
+
+ for i = 0; ; i++
+ if i == 10
+ break
+ ;;
+ ;;
+ if i != 10
+ std.exit(1)
+ ;;
+
+ i = 0
+ for var j = 0; ; j++
+ if j == 10
+ break
+ ;;
+ i++
+ ;;
+ if i != 10
+ std.exit(2)
+ ;;
+
+ i = 0
+ for ; ;
+ i++
+ if i == 10
+ break
+ ;;
+ ;;
+ if i != 10
+ std.exit(3)
+ ;;
+
+ i = 0
+ for ; i < 10;
+ i++
+ ;;
+ if i != 10
+ std.exit(4)
+ ;;
+
+ for i = 0 ; ;
+ if i == 10
+ break
+ ;;
+ i++
+ ;;
+ if i != 10
+ std.exit(5)
+ ;;
+
+ i = 0
+ for ; ; i++
+ if i == 10
+ break
+ ;;
+ ;;
+ if i != 10
+ std.exit(6)
+ ;;
+ std.put("pass\n")
+}
--- a/test/tests
+++ b/test/tests
@@ -149,4 +149,4 @@
F arityhigh
F badop
B voideffect P pass
-B fornocond P pass
+B foroptexpr P pass