From 1c686fb0ea6787b8dde239acf6f81c93cd80d2e4 Mon Sep 17 00:00:00 2001 From: nitrix Date: Mon, 16 Dec 2019 22:41:58 +0100 Subject: [PATCH] Implement variable declaration --- .../de/hsrm/compiler/Klang/visitors/EvalVisitor.java | 11 +++++++++++ .../java/de/hsrm/compiler/Klang/visitors/GenASM.java | 12 ++++++++++++ .../de/hsrm/compiler/Klang/visitors/GetVars.java | 7 ++++++- .../compiler/Klang/visitors/PrettyPrintVisitor.java | 12 ++++++++++++ .../de/hsrm/compiler/Klang/visitors/Visitor.java | 1 + 5 files changed, 42 insertions(+), 1 deletion(-) 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 7142326..09d870a 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java @@ -101,6 +101,17 @@ public class EvalVisitor implements Visitor { return null; } + @Override + public Value visit(VariableDeclaration e) { + Value initialValue = null; + if (e.expression != null) { + initialValue = e.expression.welcome(this); + } + + this.env.put(e.name, initialValue); + return null; + } + @Override public Value visit(VariableAssignment e) { Value result = e.expression.welcome(this); diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java b/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java index cc01a65..38e62f4 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java @@ -162,6 +162,18 @@ public class GenASM implements Visitor { throw new RuntimeException("Das machen wir mal nicht, ne?!"); } + @Override + public Void visit(VariableDeclaration e) { + // If there is an initialization present, + // push it to the location of the local var + if (e.expression != null) { + e.expression.welcome(this); + int offset = this.env.get(e.name); + this.ex.write(" movq %rax, " + offset + "(%rbp)\n"); + } + return null; + } + @Override public Void visit(VariableAssignment e) { e.expression.welcome(this); diff --git a/src/main/java/de/hsrm/compiler/Klang/visitors/GetVars.java b/src/main/java/de/hsrm/compiler/Klang/visitors/GetVars.java index 8c7444d..1bef69b 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/GetVars.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/GetVars.java @@ -84,8 +84,13 @@ class GetVars implements Visitor { } @Override - public Void visit(VariableAssignment e) { + public Void visit(VariableDeclaration e) { vars.add(e.name); + return null; + } + + @Override + public Void visit(VariableAssignment e) { e.expression.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 0e74dc0..009c74c 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java @@ -153,6 +153,18 @@ public class PrettyPrintVisitor implements Visitor { return null; } + @Override + public Void visit(VariableDeclaration e) { + ex.write("let " + e.name); + + if (e.expression != null) { + ex.write(" = " + e.expression.welcome(this)); + } + + ex.write(";"); + return null; + } + @Override public Void visit(VariableAssignment e) { ex.write(e.name + " = "); 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 662500d..6b944d7 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java @@ -17,6 +17,7 @@ public interface Visitor { R visit(NegateExpression e); R visit(IfStatement e); R visit(PrintStatement e); + R visit(VariableDeclaration e); R visit(VariableAssignment e); R visit(ReturnStatement e); R visit(Block e);