diff --git a/.gitignore b/.gitignore index 585d773..5545717 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,3 @@ out/ *.zip prg/**/*.ast prg/**/*.out -prg/**/*.pins25 \ No newline at end of file diff --git a/grammar.txt b/grammar.txt index 4de9353..7ff437a 100644 --- a/grammar.txt +++ b/grammar.txt @@ -39,8 +39,9 @@ restcmp -> EQU addexpr | . addexpr -> multexpr restadd . -restadd -> ADD multexpr restadd - | SUB multexpr restadd | . +restadd -> ADD addexpr + | SUB addexpr + | . multexpr -> prefixexpr restmult . restmult -> MUL prefixexpr restmult diff --git a/prg/test.pins25 b/prg/test.pins25 new file mode 100644 index 0000000..f816d1c --- /dev/null +++ b/prg/test.pins25 @@ -0,0 +1,3 @@ + +fun main() = + 3 - 2 - 1 \ No newline at end of file diff --git a/src/pins25/phase/SynAn.java b/src/pins25/phase/SynAn.java index e4f2304..a9801fd 100644 --- a/src/pins25/phase/SynAn.java +++ b/src/pins25/phase/SynAn.java @@ -540,20 +540,20 @@ public class SynAn implements AutoCloseable { Token token = lexAn.peekToken(); switch (token.symbol()) { case ADD: { - // restadd -> ADD multexpr restadd + // restadd -> ADD addexpr check(Token.Symbol.ADD); - AST.Expr right = parseMultiplicationExpression(); + AST.Expr right = parseAdditionExpression(); AST.Expr binExpr = new AST.BinExpr(AST.BinExpr.Oper.ADD, left, right); attrLoc.put(binExpr, new Report.Location(attrLoc.get(left), attrLoc.get(right))); - return parseRestAdditionExpressions(binExpr); + return binExpr; } case SUB: { - // restadd -> SUB multexpr restadd + // restadd -> ADD addexpr check(Token.Symbol.SUB); - AST.Expr right = parseMultiplicationExpression(); + AST.Expr right = parseAdditionExpression(); AST.Expr binExpr = new AST.BinExpr(AST.BinExpr.Oper.SUB, left, right); attrLoc.put(binExpr, new Report.Location(attrLoc.get(left), attrLoc.get(right))); - return parseRestAdditionExpressions(binExpr); + return binExpr; } default: