summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandrewc <andrew_chambers@trimble.com>2016-01-20 15:13:42 +1300
committerandrewc <andrew_chambers@trimble.com>2016-01-20 15:19:51 +1300
commit8eef2702d6533ca399758c38acedf0f086b93e13 (patch)
tree62b8e4a86074caeb4820ef56b98083d1c8dbd8bf
parentd73d54388b6c16e61ecceecb21a3df258f33c434 (diff)
downloadmc-8eef2702d6533ca399758c38acedf0f086b93e13.tar.gz
fix decl for with no cond and add more tests
-rw-r--r--parse/gram.y15
-rw-r--r--test/fornocond.myr14
-rw-r--r--test/foroptexpr.myr65
-rw-r--r--test/tests2
4 files changed, 74 insertions, 22 deletions
diff --git a/parse/gram.y b/parse/gram.y
index 52d0a19..0fdfed1 100644
--- a/parse/gram.y
+++ b/parse/gram.y
@@ -143,7 +143,7 @@ static void setupinit(Node *n);
%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 @@ optexpr : expr {$$ = $1;}
| /* empty */ {$$ = NULL;}
;
+loopcond : exprln {$$ = $1;}
+ | Tendln {$$ = mkboollit($1->loc, 1);}
+ ;
+
optexprln: exprln {$$ = $1;}
| Tendln {$$ = NULL;}
;
@@ -870,14 +874,11 @@ continue : Tcontinue
{$$ = 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");
diff --git a/test/fornocond.myr b/test/fornocond.myr
deleted file mode 100644
index 7c43d38..0000000
--- a/test/fornocond.myr
+++ /dev/null
@@ -1,14 +0,0 @@
-use std
-
-const main = {
- var i
-
- for i = 0; ; i++
- if i == 10
- break;
- ;;
- ;;
- if i == 10
- std.put("pass\n")
- ;;
-}
diff --git a/test/foroptexpr.myr b/test/foroptexpr.myr
new file mode 100644
index 0000000..2f56727
--- /dev/null
+++ b/test/foroptexpr.myr
@@ -0,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")
+}
diff --git a/test/tests b/test/tests
index 3594238..28775e6 100644
--- a/test/tests
+++ b/test/tests
@@ -149,4 +149,4 @@ F aritylow
F arityhigh
F badop
B voideffect P pass
-B fornocond P pass
+B foroptexpr P pass