From 4ab003b2c65f2e747e7c7a7ca109a0ba7643e1aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C5=A1per=20Dobrovoljc?= Date: Sun, 6 Apr 2025 12:16:39 +0200 Subject: [PATCH] AST Fixes --- src/pins25/phase/SynAn.java | 77 ++++++++++++++----------------------- 1 file changed, 29 insertions(+), 48 deletions(-) diff --git a/src/pins25/phase/SynAn.java b/src/pins25/phase/SynAn.java index 92d837c..e4f2304 100644 --- a/src/pins25/phase/SynAn.java +++ b/src/pins25/phase/SynAn.java @@ -53,8 +53,7 @@ public class SynAn implements AutoCloseable { this.attrLoc = attrLoc; final AST.Nodes defs = parseProgram(); if (lexAn.peekToken().symbol() != Token.Symbol.EOF) - Report.warning(lexAn.peekToken(), - "Unexpected text '" + lexAn.peekToken().lexeme() + "...' at the end of the program."); + Report.warning(lexAn.peekToken(), "Unexpected text '" + lexAn.peekToken().lexeme() + "...' at the end of the program."); return defs; } @@ -98,11 +97,11 @@ public class SynAn implements AutoCloseable { // definition -> VAR IDENTIFIER ASSIGN initializers Token var = check(Token.Symbol.VAR); Token id = check(Token.Symbol.IDENTIFIER); - check(Token.Symbol.ASSIGN); + Token assign = check(Token.Symbol.ASSIGN); List inits = parseInitializers(); AST.VarDef varDef = new AST.VarDef(id.lexeme(), inits); - attrLoc.put(varDef, new Report.Location(var, attrLoc.get(inits.getLast()))); + attrLoc.put(varDef, inits.isEmpty() ? new Report.Location(var, assign) : new Report.Location(var, attrLoc.get(inits.getLast()))); return varDef; } @@ -118,7 +117,7 @@ public class SynAn implements AutoCloseable { check(Token.Symbol.ASSIGN); return parseStatements(); } - + // funcassign -> ε return new ArrayList<>(); @@ -318,10 +317,7 @@ public class SynAn implements AutoCloseable { attrLoc.put(init, new Report.Location(value, attrLoc.get(multConst))); return init; } - AST.Init init = new AST.Init( - new AST.AtomExpr(AST.AtomExpr.Type.INTCONST, "1"), - intConst - ); + AST.Init init = new AST.Init(new AST.AtomExpr(AST.AtomExpr.Type.INTCONST, "1"), intConst); attrLoc.put(init, value); return init; } @@ -331,10 +327,7 @@ public class SynAn implements AutoCloseable { Token value = check(Token.Symbol.CHARCONST); AST.AtomExpr charConst = new AST.AtomExpr(AST.AtomExpr.Type.CHRCONST, value.lexeme()); attrLoc.put(charConst, value); - AST.Init init = new AST.Init( - new AST.AtomExpr(AST.AtomExpr.Type.INTCONST, "1"), - charConst - ); + AST.Init init = new AST.Init(new AST.AtomExpr(AST.AtomExpr.Type.INTCONST, "1"), charConst); attrLoc.put(init, value); return init; } @@ -344,10 +337,7 @@ public class SynAn implements AutoCloseable { Token value = check(Token.Symbol.STRINGCONST); AST.AtomExpr strConst = new AST.AtomExpr(AST.AtomExpr.Type.STRCONST, value.lexeme()); attrLoc.put(strConst, value); - AST.Init init = new AST.Init( - new AST.AtomExpr(AST.AtomExpr.Type.INTCONST, "1"), - strConst - ); + AST.Init init = new AST.Init(new AST.AtomExpr(AST.AtomExpr.Type.INTCONST, "1"), strConst); attrLoc.put(init, value); return init; } @@ -495,7 +485,7 @@ public class SynAn implements AutoCloseable { // restcmp -> NEQ addexpr check(Token.Symbol.NEQ); AST.Expr right = parseAdditionExpression(); - AST.BinExpr binExpr = new AST.BinExpr(AST.BinExpr.Oper.EQU, left, right); + AST.BinExpr binExpr = new AST.BinExpr(AST.BinExpr.Oper.NEQ, left, right); attrLoc.put(binExpr, new Report.Location(attrLoc.get(left), attrLoc.get(right))); return binExpr; } @@ -543,10 +533,10 @@ public class SynAn implements AutoCloseable { // addexpr -> multexpr restadd AST.Expr left = parseMultiplicationExpression(); - return parseRestAdditions(left); + return parseRestAdditionExpressions(left); } - private AST.Expr parseRestAdditions(AST.Expr left) { + private AST.Expr parseRestAdditionExpressions(AST.Expr left) { Token token = lexAn.peekToken(); switch (token.symbol()) { case ADD: { @@ -555,15 +545,15 @@ public class SynAn implements AutoCloseable { AST.Expr right = parseMultiplicationExpression(); 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 parseRestAdditions(binExpr); + return parseRestAdditionExpressions(binExpr); } case SUB: { - // restadd -> SUN multexpr restadd + // restadd -> SUB multexpr restadd check(Token.Symbol.SUB); AST.Expr right = parseMultiplicationExpression(); 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 parseRestAdditions(binExpr); + return parseRestAdditionExpressions(binExpr); } default: @@ -586,7 +576,7 @@ public class SynAn implements AutoCloseable { case MUL: { // restmult -> MUL prefixexpr restmult check(Token.Symbol.MUL); - AST.Expr right = parseMultiplicationExpression(); + AST.Expr right = parsePrefixExpression(); AST.Expr binExpr = new AST.BinExpr(AST.BinExpr.Oper.MUL, left, right); attrLoc.put(binExpr, new Report.Location(attrLoc.get(left), attrLoc.get(right))); return parseRestMultiplicationExpressions(binExpr); @@ -594,7 +584,7 @@ public class SynAn implements AutoCloseable { case DIV: { // restmult -> DIV prefixexpr restmult check(Token.Symbol.DIV); - AST.Expr right = parseMultiplicationExpression(); + AST.Expr right = parsePrefixExpression(); AST.Expr binExpr = new AST.BinExpr(AST.BinExpr.Oper.DIV, left, right); attrLoc.put(binExpr, new Report.Location(attrLoc.get(left), attrLoc.get(right))); return parseRestMultiplicationExpressions(binExpr); @@ -602,7 +592,7 @@ public class SynAn implements AutoCloseable { case MOD: { // restmult -> MOD prefixexpr restmult check(Token.Symbol.MOD); - AST.Expr right = parseMultiplicationExpression(); + AST.Expr right = parsePrefixExpression(); AST.Expr binExpr = new AST.BinExpr(AST.BinExpr.Oper.MOD, left, right); attrLoc.put(binExpr, new Report.Location(attrLoc.get(left), attrLoc.get(right))); return parseRestMultiplicationExpressions(binExpr); @@ -684,21 +674,27 @@ public class SynAn implements AutoCloseable { case IDENTIFIER: // primary -> IDENTIFIER exprargs Token id = check(Token.Symbol.IDENTIFIER); - List args = parseExpressionArguments(); - if (args != null) { + if (lexAn.peekToken().symbol() == Token.Symbol.LPAREN) { + // exprargs -> LPAREN arguments RPAREN + check(Token.Symbol.LPAREN); + List args = parseArguments(); + Token rParen = check(Token.Symbol.RPAREN); + AST.CallExpr callExpr = new AST.CallExpr(id.lexeme(), args); - attrLoc.put(callExpr, new Report.Location(id, attrLoc.get(args.getLast()))); + attrLoc.put(callExpr, new Report.Location(id, rParen)); return callExpr; } + AST.VarExpr varExpr = new AST.VarExpr(id.lexeme()); attrLoc.put(varExpr, id); return varExpr; case LPAREN: // primary -> LPAREN expression RPAREN - check(Token.Symbol.LPAREN); + Token lParen = check(Token.Symbol.LPAREN); AST.Expr expr = parseExpression(); - check(Token.Symbol.RPAREN); + Token rParen = check(Token.Symbol.RPAREN); + attrLoc.put(expr, new Report.Location(lParen, rParen)); return expr; case INTCONST: @@ -712,19 +708,6 @@ public class SynAn implements AutoCloseable { } } - private List parseExpressionArguments() { - if (lexAn.peekToken().symbol() == Token.Symbol.LPAREN) { - // exprargs -> LPAREN arguments RPAREN - check(Token.Symbol.LPAREN); - List args = parseArguments(); - check(Token.Symbol.RPAREN); - return args; - } - - // exprargs -> ε - return null; - } - private List parseArguments() { List args = new ArrayList<>(); @@ -761,10 +744,8 @@ public class SynAn implements AutoCloseable { System.out.println("This is PINS'25 compiler (syntax analysis):"); try { - if (cmdLineArgs.length == 0) - throw new Report.Error("No source file specified in the command line."); - if (cmdLineArgs.length > 1) - Report.warning("Unused arguments in the command line."); + if (cmdLineArgs.length == 0) throw new Report.Error("No source file specified in the command line."); + if (cmdLineArgs.length > 1) Report.warning("Unused arguments in the command line."); try (SynAn synAn = new SynAn(cmdLineArgs[0])) { synAn.parse(new HashMap<>());