diff --git a/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 b/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 index 6e068b2..a930eb1 100644 --- a/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 +++ b/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 @@ -20,11 +20,14 @@ braced_block : OBRK statement+ CBRK ; + +// Only the first child of a rule alternative will be visited! +// i.e. SCOL won't be visited, but thats unneccesary anyway statement : print | if_statement - | variable_declaration - | variable_assignment + | variable_declaration SCOL + | variable_assignment SCOL | return_statement | whileLoop | doWhileLoop @@ -39,11 +42,11 @@ if_statement ; variable_declaration - : LET IDENT (EQUAL expression)? SCOL + : LET IDENT (EQUAL expression)? ; variable_assignment - : IDENT EQUAL expression SCOL + : IDENT EQUAL expression ; return_statement diff --git a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java index 3ff9950..393b34f 100644 --- a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java +++ b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java @@ -23,12 +23,20 @@ public class ContextAnalysis extends KlangBaseVisitor { return new Program(funcs, expression); } + @Override + public Node visitStatement(KlangParser.StatementContext ctx) { + // The first child is the proper context we need to visit + // The second child is either null or just a SCOL! + return this.visit(ctx.getChild(0)); + } + @Override public Node visitBraced_block(KlangParser.Braced_blockContext ctx) { Statement[] statements = new Statement[ctx.statement().size()]; - + for (int i = 0; i < ctx.statement().size(); i++) { - Node currentStatement = this.visit(ctx.statement(i)); + var stmtCtx = ctx.statement(i); + Node currentStatement = this.visit(stmtCtx); statements[i] = (Statement) currentStatement; }