diff options
author | aiju <devnull@localhost> | 2018-03-31 12:30:48 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2018-03-31 12:30:48 +0000 |
commit | 20e695c1787144dd922002c55a3f0a2dc16cb198 (patch) | |
tree | 346fa36f421a9a25fd531d5aef3e0b90b3bc2a36 | |
parent | 7d18756b39cc33482f8cf5574b20a51331c4cea3 (diff) | |
download | plan9front-20e695c1787144dd922002c55a3f0a2dc16cb198.tar.xz |
forp: fix precedence for []
-rw-r--r-- | sys/src/cmd/forp/parse.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/sys/src/cmd/forp/parse.c b/sys/src/cmd/forp/parse.c index b813e696a..0aefbc70a 100644 --- a/sys/src/cmd/forp/parse.c +++ b/sys/src/cmd/forp/parse.c @@ -291,12 +291,8 @@ expr(int level) mpint *num; int t; - if(level == MAXPREC+1){ + if(level == MAXPREC+2){ switch(t = lex()){ - case '~': return node(ASTUN, OPCOM, expr(level)); - case '!': return node(ASTUN, OPNOT, expr(level)); - case '+': return expr(level); - case '-': return node(ASTUN, OPNEG, expr(level)); case '(': a = expr(0); expect(')'); @@ -318,7 +314,7 @@ expr(int level) default: error(nil, "unexpected %t", t); } - }else if(level == MAXPREC){ + }else if(level == MAXPREC+1){ a = expr(level + 1); if(got('[')){ b = expr(0); @@ -330,6 +326,14 @@ expr(int level) a = node(ASTIDX, a, b, c); } return a; + }else if(level == MAXPREC){ + switch(t = lex()){ + case '~': return node(ASTUN, OPCOM, expr(level)); + case '!': return node(ASTUN, OPNOT, expr(level)); + case '+': return expr(level); + case '-': return node(ASTUN, OPNEG, expr(level)); + default: superman(t); return expr(level+1); break; + } }else if(level == 3){ a = expr(level + 1); if(got('?')){ |