git: 9front

Download patch

ref: d4bd43e5d1cec8f0c498e4e344abeccab20f5ad5
parent: e243750f8f47bb6a7d69c2d2ddaa1f0719148d22
author: aiju <devnull@localhost>
date: Sat Mar 31 08:30:48 EDT 2018

forp: fix precedence for []

--- a/sys/src/cmd/forp/parse.c
+++ b/sys/src/cmd/forp/parse.c
@@ -291,12 +291,8 @@
 	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 @@
 		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 @@
 			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('?')){
--