You are on page 1of 3

LoopStatement → loop StatementList end loop

Unutar petlje mora da postoji bar jedna exit naredba koja je definisana smenom:
ExitStatement → exit when Expression;
loop:
IMC<exp>
Load_Mem R1, result<exp>
JumpIfNotZero R1, exit
IMC<s>
...
Jump loop
exit:
package AST;
import java.io.BufferedWriter;
import java.io.IOException;
public class ExitStatement extends Statement {
Expression expression;
Statement statement;
public ExitStatement(Expression e, Statement s) {
expression = e; statement = s;
}
public void translate(BufferedWriter out, String exitLabel)
throws IOException {
expression.translate(out);
expression.genLoad("R1", out);
out.write("\tJumpIfNotZero\tR1 " + exitLabel);
out.newLine();
statement.translate(out);
}
}
public class LoopStatement extends Statement {
List<Statement> statementList;
public LoopStatement(Lits<Statement> sl) { statementList = sl; }
public void translate(BufferedWriter out) throws IOException {
String loopLabel = ASTNode.genLab();
String exitLabel = ASTNode.genLab();
out.write(loopLabel + ":");
out.newLine();
for (int i = 0; i < statementList.size(); i++)
statementList.get(i).translate(out, exitLabel);
out.write("Jump " + loopLabel);
out.newLine();
out.write(exitLabel + ":");
out.newLine();
}
}
SelectStatement → select AlternativeList end
AlternativeList → AlternativeList or Alternative | Alternative
Alternative → when Expression => Statement
IMC<exp>
Load_Mem R1, result<exp>
JumpIfZero R1, endAlternative0
IMC<s>
Jump endSelect
endAlternative0:
...
endSelect:
public class Alternative extends Statement {
Expression expression;
Statement statement;
public Alternative(Expression e, Statement s) {
expression = e; statement = s;
}
public void translate(BufferedWriter out, String endSelectLabel,
int i) throws IOException {
String endAlternative = ASTNode.genLab() + i.toString();
expression.translate(out);
expression.genLoad("R1", out);
out.write("\tJumpIfZero\tR1 " + endAlternative);
out.newLine();
statement.translate(out);
out.write("Jump " + endSelectLabel);
out.newLine();
out.write(endAlternative + ":");
out.newLine();
}
}
public class SelectStatement extends Statement {
List<Alternative> alternativeList;
public SelectStatement(Lits<Alternative> al) {
alternativeList = al;
}
public void translate(BufferedWriter out) throws IOException {
String endSelectLabel = ASTNode.genLab();
for (int i = 0; i < alternativeList.size(); i++)
alternativeList.get(i).translate(out, endSelectLabel, i);
out.write(endSelectLabel + ":");
out.newLine();
}
}
CondStatement → Statement if Expresion │ Statement unless Expresion
IMC<exp>
Load_Mem R1, result<exp>
JumpIfZero R1, kraj //if slucaj
JumpIfNotZero R1, kraj //unless slucaj
IMC<s>
kraj:
public class CondStatement extends Statement
{
Statement s;
Expression exp;
boolean ifUnless; // true za if, false za unless
public CondStatement(Statement s, Expression e, boolean b) {
this.s = s; exp = e; ifUnless = b;
}
void translate(BufferedWriter out) throws IOException {
String kraj = ASTNode.genLab();
exp.translate(out);
exp.genLoad("R1", out);
if (ifUnless)
out.write("JumpIfZero R1, " + kraj + "\n");
else
out.write("JumpIfNotZero R1, " + kraj + "\n");
s.translate(out);
out.write(kraj + ":\n");
out.newLine();
}
}

You might also like