From 7f7cf6a03254f0ab0ec58572adda1fc92b2506a6 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Mon, 12 Oct 2015 21:46:27 -0400 Subject: add for loops --- minic/minic.y | 36 ++++++++++++++++++++++++++++++++++-- minic/test/queen.c | 24 ++++++------------------ 2 files changed, 40 insertions(+), 20 deletions(-) (limited to 'minic') diff --git a/minic/minic.y b/minic/minic.y index 1564a1f..4087e9d 100644 --- a/minic/minic.y +++ b/minic/minic.y @@ -565,6 +565,31 @@ param(char *v, unsigned ctyp, Node *pl) return n; } +Stmt * +mkfor(Node *ini, Node *tst, Node *inc, Stmt *s) +{ + Stmt *s1, *s2; + + if (ini) + s1 = mkstmt(Expr, ini, 0, 0); + else + s1 = 0; + if (inc) { + s2 = mkstmt(Expr, inc, 0, 0); + s2 = mkstmt(Seq, s, s2, 0); + } else + s2 = s; + if (!tst) { + tst = mknode('N', 0, 0); + tst->u.n = 1; + } + s2 = mkstmt(While, tst, s2, 0); + if (s1) + return mkstmt(Seq, s1, s2, 0); + else + return s2; +} + %} %union { @@ -579,7 +604,7 @@ param(char *v, unsigned ctyp, Node *pl) %token PP MM LE GE SIZEOF %token TINT TLNG -%token IF ELSE WHILE BREAK RETURN +%token IF ELSE WHILE FOR BREAK RETURN %right '=' %left '&' @@ -590,7 +615,7 @@ param(char *v, unsigned ctyp, Node *pl) %type type %type stmt stmts -%type expr pref post arg0 arg1 par0 par1 +%type expr exp0 pref post arg0 arg1 par0 par1 %% @@ -686,6 +711,8 @@ stmt: ';' { $$ = 0; } | WHILE '(' expr ')' stmt { $$ = mkstmt(While, $3, $5, 0); } | IF '(' expr ')' stmt ELSE stmt { $$ = mkstmt(If, $3, $5, $7); } | IF '(' expr ')' stmt { $$ = mkstmt(If, $3, $5, 0); } + | FOR '(' exp0 ';' exp0 ';' exp0 ')' stmt + { $$ = mkfor($3, $5, $7, $9); } ; stmts: stmts stmt { $$ = mkstmt(Seq, $1, $2, 0); } @@ -708,6 +735,10 @@ expr: pref | expr '&' expr { $$ = mknode('&', $1, $3); } ; +exp0: expr + | { $$ = 0; } + ; + pref: post | '-' pref { $$ = mkneg($2); } | '*' pref { $$ = mknode('@', $2, 0); } @@ -745,6 +776,7 @@ yylex() { "long", TLNG }, { "if", IF }, { "else", ELSE }, + { "for", FOR }, { "while", WHILE }, { "return", RETURN }, { "break", BREAK }, diff --git a/minic/test/queen.c b/minic/test/queen.c index c998e2a..86058d2 100644 --- a/minic/test/queen.c +++ b/minic/test/queen.c @@ -8,18 +8,13 @@ print() { int x; int y; - y = 0; - while (y < 8) { - x = 0; - while (x < 8) { + for (y=0; y<8; y++) { + for (x=0; x<8; x++) if (t[x + 8*y]) printf(" Q"); else printf(" ."); - x++; - } printf("\n"); - y++; } printf("\n"); } @@ -29,8 +24,7 @@ chk(int x, int y) { int r; r = 0; - i = 0; - while (i < 8) { + for (i=0; i<8; i++) { r = r + t[x + 8*i]; r = r + t[i + 8*y]; if (x+i < 8 & y+i < 8) @@ -41,11 +35,8 @@ chk(int x, int y) { r = r + t[x-i + 8*(y+i)]; if (x-i >= 0 & y-i >= 0) r = r + t[x-i + 8*(y-i)]; - if (r) - return 1; - i++; } - return 0; + return r; } go(int n, int x, int y) { @@ -54,17 +45,14 @@ go(int n, int x, int y) { N++; return 0; } - while (y < 8) { - while (x < 8) { + for (; y<8; y++) { + for (; x<8; x++) if (chk(x, y) == 0) { t[x + 8*y]++; go(n+1, x, y); t[x + 8*y]--; } - x++; - } x = 0; - y++; } } -- cgit 1.4.1