From 79fc3dd706b968a9249dfd2db6b5175e4e4a85d4 Mon Sep 17 00:00:00 2001 From: Elias Haugsbakk Date: Sun, 20 Sep 2026 21:07:25 +0200 Subject: update IRGeneration generates records. Variables implemented. --- .../kompilator/IRGeneration/IRGenerator.java | 60 ++++++++++++++++++---- 1 file changed, 49 insertions(+), 11 deletions(-) (limited to 'src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java') diff --git a/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java b/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java index ffbccb6..1c42673 100644 --- a/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java +++ b/src/main/java/no/eliashaugsbakk/kompilator/IRGeneration/IRGenerator.java @@ -6,49 +6,87 @@ import no.eliashaugsbakk.kompilator.parsing.AST; import no.eliashaugsbakk.kompilator.parsing.node.Program; import no.eliashaugsbakk.kompilator.parsing.node.expression.Expression; import no.eliashaugsbakk.kompilator.parsing.node.expression.FunctionCall; +import no.eliashaugsbakk.kompilator.parsing.node.expression.Identifier; import no.eliashaugsbakk.kompilator.parsing.node.expression.literal.StringLiteral; +import no.eliashaugsbakk.kompilator.parsing.node.statement.Assignment; import no.eliashaugsbakk.kompilator.parsing.node.statement.ExpressionStatement; +import no.eliashaugsbakk.kompilator.parsing.node.statement.IdentifierDeclaration; import no.eliashaugsbakk.kompilator.parsing.node.statement.Statement; public class IRGenerator { private final AST ast; - private final List ir = new ArrayList<>(); - private int tempVarCounter = 0; + private final List ir = new ArrayList<>(); + private int tempCounter = 0; public IRGenerator(AST ast) { this.ast = ast; } - public List generate() { + public List generate() { Program program = (Program) ast.getRoot(); for (Statement stmt : program.statements) { generateStatement(stmt); } - return ir; } private void generateStatement(Statement stmt) { if (stmt instanceof ExpressionStatement exprStmt) { generateExpression(exprStmt.expression); + } else if (stmt instanceof Assignment assignment) { + generateAssignment(assignment); + } else if (stmt instanceof IdentifierDeclaration identifierDecl) { + generateIdentifierDecl(identifierDecl); + } + } + + private void generateAssignment(Assignment assignment) { + String value; + if (assignment.expression instanceof StringLiteral stringLiteral) { + value = stringLiteral.value; + } else { + throw new IRGenerationException("Only strings are implemented"); } + ir.add(new Assign(assignment.identifier, value)); + } + + private void generateIdentifierDecl(IdentifierDeclaration identifierDecl) { + String value; + if (identifierDecl.initializer instanceof StringLiteral stringLiteral) { + value = stringLiteral.value; + } else { + throw new IRGenerationException("Unknown function: " + identifierDecl.initializer); + } + ir.add(new Alloc(identifierDecl.identifier, identifierDecl.type.type, identifierDecl.mutable, + value)); } private void generateExpression(Expression expr) { if (expr instanceof FunctionCall call) { generateFunctionCall(call); + } else { + throw new IRGenerationException("Only expression which can stand alone are functions"); } } - private void generateFunctionCall(FunctionCall call) { - for (Expression arg : call.arguments) { - if (arg instanceof StringLiteral stringLit) { - String tempVar = "t" + (tempVarCounter++); - ir.add(tempVar + ": string = \"" + stringLit.value + "\""); - ir.add(String.format("print(%s)", tempVar)); + + private void generateFunctionCall(FunctionCall fnCall) { + List arguments = new ArrayList<>(); + + fnCall.arguments.forEach(arg -> { + if (arg instanceof StringLiteral stringLiteral) { + String temp = "t" + tempCounter++; + ir.add(new Alloc(temp, "string", false, stringLiteral.value)); + arguments.add(temp); + } else if (arg instanceof Identifier identifier) { + arguments.add(identifier.name); + } else { + throw new IRGenerationException("Unknown function: " + arg); } - } + }); + + ir.add(new Call(fnCall.functionName, arguments)); } } -- cgit v1.2.3