From 1186bb455074f272951ae0e9ed880b831d25b8e5 Mon Sep 17 00:00:00 2001 From: nitrix Date: Mon, 20 Jan 2020 15:26:55 +0100 Subject: [PATCH] add bool literal --- .../antlr4/de/hsrm/compiler/Klang/Klang.g4 | 8 +++++++- .../hsrm/compiler/Klang/ContextAnalysis.java | 7 +++++++ .../java/de/hsrm/compiler/Klang/Value.java | 4 ++++ .../nodes/expressions/BooleanExpression.java | 16 +++++++++++++++ .../compiler/Klang/types/BooleanType.java | 20 +++++++++++++++++++ .../compiler/Klang/types/PrimitiveType.java | 4 ++++ .../de/hsrm/compiler/Klang/types/Type.java | 4 ++++ .../compiler/Klang/visitors/EvalVisitor.java | 5 +++++ .../hsrm/compiler/Klang/visitors/GenASM.java | 12 ++++++++--- .../hsrm/compiler/Klang/visitors/GetVars.java | 5 +++++ .../Klang/visitors/PrettyPrintVisitor.java | 6 ++++++ .../hsrm/compiler/Klang/visitors/Visitor.java | 1 + 12 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/main/java/de/hsrm/compiler/Klang/nodes/expressions/BooleanExpression.java create mode 100644 src/main/java/de/hsrm/compiler/Klang/types/BooleanType.java diff --git a/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 b/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 index 4d8b903..c88746e 100644 --- a/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 +++ b/src/main/antlr4/de/hsrm/compiler/Klang/Klang.g4 @@ -78,7 +78,8 @@ expression atom : INTEGER_LITERAL #intAtom - | IDENT # variable + | BOOLEAN_LITERAL #boolAtom + | IDENT #variable ; functionCall @@ -137,6 +138,11 @@ INTEGER_LITERAL : [0-9]+ ; +BOOLEAN_LITERAL + : 'true' + | 'false' + ; + IDENT : [a-zA-Z][a-zA-Z0-9]* ; diff --git a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java index 87cc448..bfb3905 100644 --- a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java +++ b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java @@ -209,6 +209,13 @@ public class ContextAnalysis extends KlangBaseVisitor { return n; } + @Override + public Node visitBoolAtom(KlangParser.BoolAtomContext ctx) { + Node n = new BooleanExpression(ctx.getText().equals("true") ? true : false); + n.type = Type.getBooleanType(); + return n; + } + @Override public Node visitFunctionDef(KlangParser.FunctionDefContext ctx) { String name = ctx.funcName.getText(); diff --git a/src/main/java/de/hsrm/compiler/Klang/Value.java b/src/main/java/de/hsrm/compiler/Klang/Value.java index ebaec1e..81c05ea 100644 --- a/src/main/java/de/hsrm/compiler/Klang/Value.java +++ b/src/main/java/de/hsrm/compiler/Klang/Value.java @@ -10,4 +10,8 @@ public class Value { public int asInteger() { return (int) this.value; } + + public boolean asBoolean() { + return (boolean) this.value; + } } diff --git a/src/main/java/de/hsrm/compiler/Klang/nodes/expressions/BooleanExpression.java b/src/main/java/de/hsrm/compiler/Klang/nodes/expressions/BooleanExpression.java new file mode 100644 index 0000000..fadb6f5 --- /dev/null +++ b/src/main/java/de/hsrm/compiler/Klang/nodes/expressions/BooleanExpression.java @@ -0,0 +1,16 @@ +package de.hsrm.compiler.Klang.nodes.expressions; + +import de.hsrm.compiler.Klang.visitors.Visitor; + +public class BooleanExpression extends Expression { + public boolean value; + + public BooleanExpression(boolean value) { + this.value = value; + } + + @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/types/BooleanType.java b/src/main/java/de/hsrm/compiler/Klang/types/BooleanType.java new file mode 100644 index 0000000..d5d1517 --- /dev/null +++ b/src/main/java/de/hsrm/compiler/Klang/types/BooleanType.java @@ -0,0 +1,20 @@ +package de.hsrm.compiler.Klang.types; + +public class BooleanType extends PrimitiveType { + + private static BooleanType instance = null; + + public static BooleanType getType() { + if (instance != null) { + return instance; + } + instance = new BooleanType(); + return instance; + } + + @Override + public boolean isBooleanType() { + return true; + } + +} \ No newline at end of file diff --git a/src/main/java/de/hsrm/compiler/Klang/types/PrimitiveType.java b/src/main/java/de/hsrm/compiler/Klang/types/PrimitiveType.java index b45c08f..3a87c7a 100644 --- a/src/main/java/de/hsrm/compiler/Klang/types/PrimitiveType.java +++ b/src/main/java/de/hsrm/compiler/Klang/types/PrimitiveType.java @@ -10,4 +10,8 @@ public abstract class PrimitiveType extends Type { public boolean isIntegerType() { return false; }; + + public boolean isBooleanType() { + return false; + }; } \ No newline at end of file diff --git a/src/main/java/de/hsrm/compiler/Klang/types/Type.java b/src/main/java/de/hsrm/compiler/Klang/types/Type.java index db90f30..bc429d7 100644 --- a/src/main/java/de/hsrm/compiler/Klang/types/Type.java +++ b/src/main/java/de/hsrm/compiler/Klang/types/Type.java @@ -8,5 +8,9 @@ public abstract class Type { return IntegerType.getType(); } + public static BooleanType getBooleanType() { + return BooleanType.getType(); + } + public abstract boolean isPrimitiveType(); } \ 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 aae571b..c34fea5 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/EvalVisitor.java @@ -23,6 +23,11 @@ public class EvalVisitor implements Visitor { return new Value(e.value); } + @Override + public Value visit(BooleanExpression e) { + return new Value(e.value); + } + @Override public Value visit(EqualityExpression e) { Value lhs = e.lhs.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 d021f1d..6a69845 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/GenASM.java @@ -78,6 +78,12 @@ public class GenASM implements Visitor { return null; } + @Override + public Void visit(BooleanExpression e) { + this.ex.write(" movq $" + (e.value ? 1 : 0) + ", %rax\n"); + return null; + } + @Override public Void visit(Variable e) { this.ex.write(" movq " + this.env.get(e.name) + "(%rbp), %rax\n"); @@ -324,7 +330,7 @@ public class GenASM implements Visitor { this.ex.write(" jnz .L" + lblStart + "\n"); return null; } - + @Override public Void visit(ForLoop e) { int lblStart = ++lCount; @@ -338,7 +344,7 @@ public class GenASM implements Visitor { e.step.welcome(this); this.ex.write(" jmp .L" + lblStart + "\n"); this.ex.write(".L" + lblEnd + ":\n"); - + return null; } @@ -453,7 +459,7 @@ public class GenASM implements Visitor { this.ex.write("\n"); } this.ex.write(".globl " + mainName + "\n"); - this.ex.write(".type " +mainName + ", @function\n"); + this.ex.write(".type " + mainName + ", @function\n"); this.ex.write(mainName + ":\n"); this.ex.write(" pushq %rbp\n"); this.ex.write(" movq %rsp, %rbp\n"); 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 319b18f..8a6fa14 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/GetVars.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/GetVars.java @@ -22,6 +22,11 @@ class GetVars implements Visitor { return null; } + @Override + public Void visit(BooleanExpression e) { + return null; + } + @Override public Void visit(Variable e) { 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 14b9e97..ae1f364 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/PrettyPrintVisitor.java @@ -72,6 +72,12 @@ public class PrettyPrintVisitor implements Visitor { return null; } + @Override + public Void visit(BooleanExpression e) { + ex.write(e.value); + return null; + } + @Override public Void visit(EqualityExpression e) { ex.write("("); 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 02784b5..eb7121e 100644 --- a/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java +++ b/src/main/java/de/hsrm/compiler/Klang/visitors/Visitor.java @@ -9,6 +9,7 @@ import de.hsrm.compiler.Klang.nodes.statements.*; public interface Visitor { R visit(IntegerExpression e); + R visit(BooleanExpression e); R visit(Variable e); R visit(AdditionExpression e); R visit(EqualityExpression e);