From 20e695c1787144dd922002c55a3f0a2dc16cb198 Mon Sep 17 00:00:00 2001 From: aiju Date: Sat, 31 Mar 2018 12:30:48 +0000 Subject: [PATCH] forp: fix precedence for [] --- sys/src/cmd/forp/parse.c | 16 ++++++++++------ 1 file 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('?')){