From 38d34a7cbc12e5fe934471f627a9ea7ef2941052 Mon Sep 17 00:00:00 2001 From: nitrix Date: Mon, 11 Nov 2019 22:27:27 +0100 Subject: [PATCH] implement else if nesting --- src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 | 2 +- .../de/hsrm/compiler/Klang/ContextAnalysis.java | 13 ++++++++----- .../Klang/nodes/statements/IfStatement.java | 16 +++++++++++++++- .../compiler/Klang/visitors/EvalVisitor.java | 6 +++++- .../Klang/visitors/PrettyPrintVisitor.java | 3 +++ 5 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 b/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 index 6127283..d4249ea 100644 --- a/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 +++ b/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 @@ -22,7 +22,7 @@ print ; if_statement - : IF OPAR expression CPAR braced_block (ELSE braced_block)? + : IF OPAR cond = expression CPAR then = braced_block (ELSE (alt = braced_block | elif = if_statement) )? ; expression diff --git a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java index 72e4974..328ff76 100644 --- a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java +++ b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java @@ -42,14 +42,17 @@ public class ContextAnalysis extends KlangBaseVisitor { @Override public Node visitIf_statement(KlangParser.If_statementContext ctx) { - Node condition = this.visit(ctx.expression()); - Node thenBlock = this.visit(ctx.braced_block(0)); + Node condition = this.visit(ctx.cond); + Node thenBlock = this.visit(ctx.then); - if (ctx.braced_block().size() > 1) { - Node elseBlock = this.visit(ctx.braced_block(1)); + if (ctx.alt != null) { + Node elseBlock = this.visit(ctx.alt); return new IfStatement((Expression) condition, (Block) thenBlock, (Block) elseBlock); + } else if(ctx.elif != null) { + Node elif = this.visit(ctx.elif); + return new IfStatement((Expression) condition, (Block) thenBlock, (IfStatement) elif); } else { - return new IfStatement((Expression) condition, (Block) thenBlock, null); + return new IfStatement((Expression) condition, (Block) thenBlock); } } diff --git a/src/main/java/de/hsrm/compiler/Klang/nodes/statements/IfStatement.java b/src/main/java/de/hsrm/compiler/Klang/nodes/statements/IfStatement.java index 02eb480..87e4f54 100644 --- a/src/main/java/de/hsrm/compiler/Klang/nodes/statements/IfStatement.java +++ b/src/main/java/de/hsrm/compiler/Klang/nodes/statements/IfStatement.java @@ -9,11 +9,25 @@ public class IfStatement extends Statement { public Expression cond; public Block then; public Block alt; + public IfStatement elif; - public IfStatement(Expression cond, Block then, Block alt) { + public IfStatement(Expression cond, Block then, Block alt, IfStatement elif) { this.cond = cond; this.then = then; this.alt = alt; + this.elif = elif; + } + + public IfStatement(Expression cond, Block then, Block alt) { + this(cond, then, alt, null); + } + + public IfStatement(Expression cond, Block then, IfStatement elif) { + this(cond, then, null, elif); + } + + public IfStatement(Expression cond, Block then) { + this(cond, then, null, null); } @Override diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java index fbc06eb..52fca42 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java @@ -49,6 +49,8 @@ public class EvalVisitor implements Visitor { e.then.welcome(this); } else if (e.alt != null) { e.alt.welcome(this); + } else if (e.elif != null) { + e.elif.welcome(this); } return null; @@ -66,7 +68,9 @@ public class EvalVisitor implements Visitor { @Override public Value visit(Block e) { - // TODO Auto-generated method stub + for (var stmt: e.statements) { + stmt.welcome(this); + } return null; } diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java b/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java index fd73577..ada0573 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java @@ -99,6 +99,9 @@ public class PrettyPrintVisitor implements Visitor { if (e.alt != null) { ex.write(" else "); e.alt.welcome(this); + } else if (e.elif != null) { + ex.write(" else "); + e.elif.welcome(this); } return null; }