From b8545a143b56b4a6e7e64d2cb28f51aff999734c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C5=A1per=20Dobrovoljc?= Date: Fri, 21 Mar 2025 16:16:45 +0100 Subject: [PATCH] Pretty syntax analysis errors --- grammar.txt | 6 +++- prg/pass.pins | 1 + prg/test.pins | 1 + src/module-info.java | 2 +- src/pins25/phase/LexAn.java | 2 +- src/pins25/phase/SynAn.java | 60 ++++++++++++++++++++++++++++++++----- 6 files changed, 61 insertions(+), 11 deletions(-) diff --git a/grammar.txt b/grammar.txt index b9e804d..4de9353 100644 --- a/grammar.txt +++ b/grammar.txt @@ -48,7 +48,11 @@ restmult -> MUL prefixexpr restmult | MOD prefixexpr restmult | . -prefixexpr -> NOT prefixexpr | ADD prefixexpr | SUB prefixexpr | PTR prefixexpr | postfixexpr . +prefixexpr -> NOT prefixexpr + | ADD prefixexpr + | SUB prefixexpr + | PTR prefixexpr + | postfixexpr . postfixexpr -> primary postfixop . postfixop -> PTR postfixop | . diff --git a/prg/pass.pins b/prg/pass.pins index 459fe2c..716c8c9 100644 --- a/prg/pass.pins +++ b/prg/pass.pins @@ -11,6 +11,7 @@ var e = 'a', "test", 4 var f = 1 * 3 var g = 1 * 'a' var h = 4 * "aaa" +var i = fun a() = 1, 'a', "a", diff --git a/prg/test.pins b/prg/test.pins index e69de29..0362a8a 100644 --- a/prg/test.pins +++ b/prg/test.pins @@ -0,0 +1 @@ +var \ No newline at end of file diff --git a/src/module-info.java b/src/module-info.java index efc6d9f..39fdd75 100644 --- a/src/module-info.java +++ b/src/module-info.java @@ -1,6 +1,6 @@ /** * Implementacija programskega jezika PINS'25. - * + * * @author bostjan.slivnik@fri.uni-lj.si */ module pins25 { diff --git a/src/pins25/phase/LexAn.java b/src/pins25/phase/LexAn.java index e9e44f8..c8a4287 100644 --- a/src/pins25/phase/LexAn.java +++ b/src/pins25/phase/LexAn.java @@ -130,7 +130,7 @@ public class LexAn implements AutoCloseable { Report.Location start = currentLocation(); switch (buffChar) { case -1: // EOF - buffToken = new Token(new Report.Location(0, 0), Token.Symbol.EOF, null); + buffToken = new Token(start, Token.Symbol.EOF, null); return; case '\'': diff --git a/src/pins25/phase/SynAn.java b/src/pins25/phase/SynAn.java index 6955e36..a010e5f 100644 --- a/src/pins25/phase/SynAn.java +++ b/src/pins25/phase/SynAn.java @@ -91,7 +91,7 @@ public class SynAn implements AutoCloseable { break; default: - throw new Report.Error(token, "Unexpected symbol '" + token.lexeme() + "', expected FUN or VAR."); + throw new Report.Error(token, "Unexpected symbol '" + token.lexeme() + "', expected definition."); } } @@ -198,25 +198,37 @@ public class SynAn implements AutoCloseable { check(Token.Symbol.END); break; - default: + case IDENTIFIER: + case LPAREN: + case ADD: + case SUB: + case NOT: + case PTR: + case INTCONST: + case CHARCONST: + case STRINGCONST: System.out.println("statement -> expression exprassign"); parseExpression(); parseExpressionAssign(); + break; + + default: + throw new Report.Error(token, "Unexpected symbol '" + token.lexeme() + "', expected statement."); } } private void parseRestStatementDefinitions() { switch (lexAn.peekToken().symbol()) { - case IN: - System.out.println("reststmtdefs -> ε"); - break; - case FUN: case VAR: System.out.println("reststmtdefs -> definition reststmtdefs"); parseDefinition(); parseRestStatementDefinitions(); break; + + case IN: + System.out.println("reststmtdefs -> ε"); + break; } } @@ -256,7 +268,7 @@ public class SynAn implements AutoCloseable { break; default: - throw new Report.Error(token, "Unexpected symbol '" + token.lexeme() + "', expected integer, character or string constant."); + throw new Report.Error(token, "Unexpected symbol '" + token.lexeme() + "', expected constant."); } } @@ -302,12 +314,32 @@ public class SynAn implements AutoCloseable { break; default: - throw new Report.Error(token, "Unexpected symbol '" + token.lexeme() + "', expected integer, character or string constant."); + throw new Report.Error(token, "Unexpected symbol '" + token.lexeme() + "', expected constant."); } } + private void checkExpression() { + Token token = lexAn.peekToken(); + switch (token.symbol()) { + case IDENTIFIER: + case LPAREN: + case ADD: + case SUB: + case NOT: + case PTR: + case INTCONST: + case CHARCONST: + case STRINGCONST: + return; + + default: + throw new Report.Error(token, "Unexpected symbol '" + token.lexeme() + "', expected expression."); + } + } private void parseExpression() { + checkExpression(); + System.out.println("expression -> conjexpr restdisj"); parseConjunctionExpression(); parseRestDisjunctions(); @@ -323,6 +355,8 @@ public class SynAn implements AutoCloseable { } private void parseConjunctionExpression() { + checkExpression(); + System.out.println("conjexpr -> cmpexpr restconj"); parseComparisonExpression(); parseRestConjunctionExpressions(); @@ -340,6 +374,8 @@ public class SynAn implements AutoCloseable { } private void parseComparisonExpression() { + checkExpression(); + System.out.println("cmpexpr -> addexpr restcmp"); parseAdditionExpression(); parseRestComparisons(); @@ -366,6 +402,8 @@ public class SynAn implements AutoCloseable { } private void parseAdditionExpression() { + checkExpression(); + System.out.println("addexpr -> multexpr restadd"); parseMultiplicationExpression(); parseRestAdditions(); @@ -389,6 +427,8 @@ public class SynAn implements AutoCloseable { } private void parseMultiplicationExpression() { + checkExpression(); + System.out.println("multexpr -> prefixexpr restmult"); parsePrefixExpression(); parseRestMultiplicationExpressions(); @@ -413,6 +453,8 @@ public class SynAn implements AutoCloseable { } private void parsePrefixExpression() { + checkExpression(); + Token token = lexAn.peekToken(); switch (token.symbol()) { case ADD: @@ -432,6 +474,8 @@ public class SynAn implements AutoCloseable { } private void parsePostfixExpression() { + checkExpression(); + System.out.println("postfixexpr -> primary postfixop"); parsePrimary(); parsePostfixOperator();