Implemented do while loops
This commit is contained in:
@@ -5,6 +5,7 @@ import java.util.HashSet;
|
||||
|
||||
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.*;
|
||||
import de.hsrm.compiler.Klang.types.Type;
|
||||
@@ -65,6 +66,13 @@ public class ContextAnalysis extends KlangBaseVisitor<Node> {
|
||||
return new whileLoop((Expression) condition, (Block) block);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Node visitDoWhileLoop(KlangParser.DoWhileLoopContext ctx) {
|
||||
Node condition = this.visit(ctx.cond);
|
||||
Node block = this.visit(ctx.braced_block());
|
||||
return new doWhileLoop((Expression) condition, (Block) block);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Node visitVariable_declaration(KlangParser.Variable_declarationContext ctx) {
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package de.hsrm.compiler.Klang.nodes.loops;
|
||||
|
||||
import de.hsrm.compiler.Klang.nodes.Block;
|
||||
import de.hsrm.compiler.Klang.nodes.statements.Statement;;
|
||||
import de.hsrm.compiler.Klang.nodes.expressions.Expression;
|
||||
import de.hsrm.compiler.Klang.visitors.Visitor;
|
||||
|
||||
public class doWhileLoop extends Statement {
|
||||
|
||||
public Expression cond;
|
||||
public Block block;
|
||||
public Block alt;
|
||||
|
||||
public doWhileLoop(Expression cond, Block block) {
|
||||
this.cond = cond;
|
||||
this.block = block;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R> R welcome(Visitor<R> v) {
|
||||
return v.visit(this);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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?!");
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 ");
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user