Implemented do while loops

This commit is contained in:
Marvin Kaiser
2020-01-13 16:43:38 +01:00
parent 02e57b7db5
commit e52ad061f9
16 changed files with 129 additions and 36 deletions

View File

@@ -8,6 +8,7 @@ import de.hsrm.compiler.Klang.nodes.Block;
import de.hsrm.compiler.Klang.nodes.FunctionDefinition;
import de.hsrm.compiler.Klang.nodes.Program;
import de.hsrm.compiler.Klang.nodes.expressions.*;
import de.hsrm.compiler.Klang.nodes.loops.doWhileLoop;
import de.hsrm.compiler.Klang.nodes.loops.whileLoop;
import de.hsrm.compiler.Klang.nodes.statements.*;
@@ -156,14 +157,24 @@ public class EvalVisitor implements Visitor<Value> {
public Value visit(whileLoop e) {
Value condition = e.cond.welcome(this);
Value result = null;
while(condition.asInteger() != 0) {
System.out.println(condition.asInteger());
while (condition.asInteger() != 0) {
result = e.block.welcome(this);
}
return result;
}
@Override
public Value visit(doWhileLoop e) {
Value condition = e.cond.welcome(this);
Value result = null;
do {
result = e.block.welcome(this);
} while (condition.asInteger() != 0);
return result;
}
@Override
public Value visit(PrintStatement e) {
Value value = e.expression.welcome(this);

View File

@@ -8,6 +8,7 @@ import java.util.TreeSet;
import de.hsrm.compiler.Klang.nodes.*;
import de.hsrm.compiler.Klang.nodes.expressions.*;
import de.hsrm.compiler.Klang.nodes.loops.doWhileLoop;
import de.hsrm.compiler.Klang.nodes.loops.whileLoop;
import de.hsrm.compiler.Klang.nodes.statements.*;
@@ -305,6 +306,18 @@ public class GenASM implements Visitor<Void> {
return null;
}
@Override
public Void visit(doWhileLoop e) {
int lblStart = ++lCount;
this.ex.write(".L" + lblStart + ":\n");
e.block.welcome(this);
e.cond.welcome(this);
this.ex.write(" cmp $0, %rax\n");
this.ex.write(" jnz .L" + lblStart + "\n");
return null;
}
@Override
public Void visit(PrintStatement e) {
throw new RuntimeException("Das machen wir mal nicht, ne?!");

View File

@@ -4,6 +4,7 @@ import java.util.Set;
import de.hsrm.compiler.Klang.nodes.*;
import de.hsrm.compiler.Klang.nodes.expressions.*;
import de.hsrm.compiler.Klang.nodes.loops.doWhileLoop;
import de.hsrm.compiler.Klang.nodes.loops.whileLoop;
import de.hsrm.compiler.Klang.nodes.statements.*;
@@ -127,6 +128,13 @@ class GetVars implements Visitor<Void> {
return null;
}
@Override
public Void visit(doWhileLoop e) {
e.cond.welcome(this);
e.block.welcome(this);
return null;
}
@Override
public Void visit(PrintStatement e) {
e.expression.welcome(this);

View File

@@ -3,7 +3,7 @@ package de.hsrm.compiler.Klang.visitors;
import java.io.*;
import de.hsrm.compiler.Klang.nodes.*;
import de.hsrm.compiler.Klang.nodes.expressions.*;
import de.hsrm.compiler.Klang.nodes.loops.whileLoop;
import de.hsrm.compiler.Klang.nodes.loops.*;
import de.hsrm.compiler.Klang.nodes.statements.*;
public class PrettyPrintVisitor implements Visitor<Void> {
@@ -214,6 +214,16 @@ public class PrettyPrintVisitor implements Visitor<Void> {
return null;
}
@Override
public Void visit(doWhileLoop e) {
ex.write("do ");
e.block.welcome(this);
ex.write(" while (");
e.cond.welcome(this);
ex.write(");");
return null;
}
@Override
public Void visit(PrintStatement e) {
ex.write("print ");

View File

@@ -24,6 +24,7 @@ public interface Visitor<R> {
R visit(NegateExpression e);
R visit(IfStatement e);
R visit(whileLoop e);
R visit(doWhileLoop e);
R visit(PrintStatement e);
R visit(VariableDeclaration e);
R visit(VariableAssignment e);