From 2af9f369cf85c1dde92903430a8e419ab4482604 Mon Sep 17 00:00:00 2001 From: nitrix Date: Mon, 18 Nov 2019 18:54:24 +0100 Subject: [PATCH] implement variable assignment --- .../antlr4/de/hsrm/compiler/Klang/Klang.g4 | 10 +++++++-- .../hsrm/compiler/Klang/ContextAnalysis.java | 7 +++++++ .../nodes/statements/VariableAssignment.java | 21 +++++++++++++++++++ .../compiler/Klang/visitors/EvalVisitor.java | 7 +++++++ .../Klang/visitors/PrettyPrintVisitor.java | 10 ++++++++- .../hsrm/compiler/Klang/visitors/Visitor.java | 1 + 6 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 src/main/java/de/hsrm/compiler/Klang/nodes/statements/VariableAssignment.java diff --git a/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 b/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 index d895218..27d0b70 100644 --- a/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 +++ b/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 @@ -5,7 +5,7 @@ parse ; program - : functionDef* expression + : functionDef* expression SCOL ; functionDef @@ -23,6 +23,7 @@ braced_block statement : print | if_statement + | variable_assignment ; print @@ -33,6 +34,10 @@ if_statement : IF OPAR cond = expression CPAR then = braced_block (ELSE (alt = braced_block | elif = if_statement) )? ; +variable_assignment + : IDENT EQUAL expression SCOL + ; + expression : atom MULT atom #multiplicationExpression | atom op=(ADD | SUB) atom #additiveExpression @@ -43,7 +48,7 @@ expression ; functionCall - : IDENT OPAR arguments CPAR SCOL + : IDENT OPAR arguments CPAR ; arguments @@ -66,6 +71,7 @@ CBRK: '}'; OPAR: '('; CPAR: ')'; COMMA: ','; +EQUAL: '='; MULT: '*'; ADD: '+'; diff --git a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java index f2a62d2..83fc6e4 100644 --- a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java +++ b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java @@ -52,6 +52,13 @@ public class ContextAnalysis extends KlangBaseVisitor { } } + @Override + public Node visitVariable_assignment(KlangParser.Variable_assignmentContext ctx) { + String name = ctx.IDENT().getText(); + Expression expression = (Expression) this.visit(ctx.expression()); + return new VariableAssignment(name, expression); + } + @Override public Node visitMultiplicationExpression(KlangParser.MultiplicationExpressionContext ctx) { Node left = this.visit(ctx.atom(0)); diff --git a/src/main/java/de/hsrm/compiler/Klang/nodes/statements/VariableAssignment.java b/src/main/java/de/hsrm/compiler/Klang/nodes/statements/VariableAssignment.java new file mode 100644 index 0000000..73eb851 --- /dev/null +++ b/src/main/java/de/hsrm/compiler/Klang/nodes/statements/VariableAssignment.java @@ -0,0 +1,21 @@ +package de.hsrm.compiler.Klang.nodes.statements; + +import de.hsrm.compiler.Klang.nodes.expressions.Expression; +import de.hsrm.compiler.Klang.visitors.Visitor; + +public class VariableAssignment extends Statement { + + public String name; + public Expression expression; + + public VariableAssignment(String name, Expression expression) { + this.name = name; + this.expression = expression; + } + + @Override + public R welcome(Visitor v) { + return v.visit(this); + } + +} \ No newline at end of file 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 cd639a2..8b0bdda 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java @@ -85,6 +85,13 @@ public class EvalVisitor implements Visitor { return null; } + @Override + public Value visit(VariableAssignment e) { + Value result = e.expression.welcome(this); + this.env.put(e.name, result); + return result; + } + @Override public Value visit(Block e) { Value result = 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 5f655d4..96a645d 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java @@ -125,6 +125,14 @@ public class PrettyPrintVisitor implements Visitor { return null; } + @Override + public Void visit(VariableAssignment e) { + ex.write(e.name + " = "); + e.expression.welcome(this); + ex.write(";"); + return null; + } + @Override public Void visit(Block e) { ex.write("{"); @@ -171,7 +179,7 @@ public class PrettyPrintVisitor implements Visitor { } arg.welcome(this); } - ex.write(");"); + ex.write(")"); return null; } diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java b/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java index 7c2efd8..28cbbd5 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java @@ -15,6 +15,7 @@ public interface Visitor { R visit(ModuloExpression e); R visit(IfStatement e); R visit(PrintStatement e); + R visit(VariableAssignment e); R visit(Block e); R visit(FunctionDefinition e); R visit(FunctionCall e);