summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2018-03-31 12:30:48 +0000
committeraiju <devnull@localhost>2018-03-31 12:30:48 +0000
commit20e695c1787144dd922002c55a3f0a2dc16cb198 (patch)
tree346fa36f421a9a25fd531d5aef3e0b90b3bc2a36
parent7d18756b39cc33482f8cf5574b20a51331c4cea3 (diff)
downloadplan9front-20e695c1787144dd922002c55a3f0a2dc16cb198.tar.xz
forp: fix precedence for []
-rw-r--r--sys/src/cmd/forp/parse.c16
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('?')){