Instructions

V jeziku LANG’24 nadomestimo pravili za izvajanje while zanke s praviloma

Spremenite prevajalnik, da upošteva ti dve pravili.

Test

fun putint(c: int): void
fun putchar(c: char): void

var x: int

fun main(): int =
	x = 5,
    while
	    x < 5
	do
		putint(x),
		putchar('\0x0A'),
		x = x - 1
	end,
	return 0

Out

Before

After

Code

/imcgen/ImcGenerator.java

public class ImcGenerator implements AST.FullVisitor<IMC.Instr, ImcGenerator.Info> {
    // ... other code ...
 
    @Override
    public IMC.Instr visit(AST.WhileStmt whileStmt, Info info) {
        IMC.Expr condExprImc = (IMC.Expr) whileStmt.condExpr.accept(this, info);
 
        Vector<IMC.Stmt> whileStmtsVector = new Vector<>();
        for (AST.Stmt stmt : whileStmt.stmts) {
            IMC.Stmt stmtImc = (IMC.Stmt) stmt.accept(this, info);
            whileStmtsVector.add(stmtImc);
        }
        IMC.Stmt whileStmtsImc = new IMC.STMTS(whileStmtsVector);
 
        IMC.LABEL posLabel = new IMC.LABEL(new MEM.Label());
        IMC.NAME posLabelName = new IMC.NAME(posLabel.label);
        IMC.LABEL endLabel = new IMC.LABEL(new MEM.Label());
        IMC.NAME endLabelName = new IMC.NAME(endLabel.label);
        IMC.CJUMP imcCJump = new IMC.CJUMP(
                condExprImc,
                posLabelName,
                endLabelName
        );
        Vector<IMC.Stmt> stmtsVector = new Vector<>();
        stmtsVector.add(posLabel);
        stmtsVector.add(whileStmtsImc);
        stmtsVector.add(imcCJump);
        stmtsVector.add(endLabel);
 
        IMC.STMTS imcStmt = new IMC.STMTS(stmtsVector);
        ImcGen.stmt.put(whileStmt, imcStmt);
        return imcStmt;
    }
 
    // ... other code ...
}