From f1fedc36ec54578be4983d2fc6abee999dbc51c2 Mon Sep 17 00:00:00 2001 From: ov-4 Date: Thu, 29 Jan 2026 10:41:27 +0000 Subject: Added binary operations +-*/ --- lib/CodeGen/CodeGen.cc | 58 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 18 deletions(-) (limited to 'lib/CodeGen') diff --git a/lib/CodeGen/CodeGen.cc b/lib/CodeGen/CodeGen.cc index a2de939..91339e0 100644 --- a/lib/CodeGen/CodeGen.cc +++ b/lib/CodeGen/CodeGen.cc @@ -49,17 +49,10 @@ void CodeGen::compile(const std::vector> &Statements) { } // ASSIGNMENT (x <- expr) else if (auto *Assign = dynamic_cast(Stmt.get())) { - Value *Val = nullptr; - if (auto *Num = dynamic_cast(Assign->getExpr())) { - Val = ConstantInt::get(*TheContext, APInt(32, Num->getVal())); - } else if (auto *Var = dynamic_cast(Assign->getExpr())) { - AllocaInst *A = NamedValues[Var->getName()]; - Val = Builder->CreateLoad(Type::getInt32Ty(*TheContext), A, Var->getName()); - } - - AllocaInst *Alloca = NamedValues[Assign->getName()]; - if (Alloca && Val) { - Builder->CreateStore(Val, Alloca); + Value *Val = emitExpr(Assign->getExpr()); + if (Val) { + AllocaInst *Alloca = NamedValues[Assign->getName()]; + if (Alloca) Builder->CreateStore(Val, Alloca); } } // INPUT @@ -74,13 +67,7 @@ void CodeGen::compile(const std::vector> &Statements) { } // OUTPUT else if (auto *Out = dynamic_cast(Stmt.get())) { - Value *Val = nullptr; - if (auto *Num = dynamic_cast(Out->getExpr())) { - Val = ConstantInt::get(*TheContext, APInt(32, Num->getVal())); - } else if (auto *Var = dynamic_cast(Out->getExpr())) { - AllocaInst *A = NamedValues[Var->getName()]; - Val = Builder->CreateLoad(Type::getInt32Ty(*TheContext), A, Var->getName()); - } + Value *Val = emitExpr(Out->getExpr()); if (Val) { // printf("%d\n", val) @@ -100,3 +87,38 @@ void CodeGen::compile(const std::vector> &Statements) { void CodeGen::print() { TheModule->print(errs(), nullptr); } + +Value *CodeGen::emitExpr(ExprAST *Expr) { + if (!Expr) return nullptr; + + if (auto *Num = dynamic_cast(Expr)) { + return ConstantInt::get(*TheContext, APInt(32, Num->getVal(), true)); + } + + if (auto *Var = dynamic_cast(Expr)) { + AllocaInst *A = NamedValues[Var->getName()]; + if (!A) { + fprintf(stderr, "Error: Unknown variable name %s\n", Var->getName().c_str()); + return nullptr; + } + return Builder->CreateLoad(Type::getInt32Ty(*TheContext), A, Var->getName().c_str()); + } + + if (auto *Bin = dynamic_cast(Expr)) { + Value *L = emitExpr(Bin->getLHS()); + Value *R = emitExpr(Bin->getRHS()); + if (!L || !R) return nullptr; + + switch (Bin->getOp()) { + case '+': return Builder->CreateAdd(L, R, "addtmp"); + case '-': return Builder->CreateSub(L, R, "subtmp"); + case '*': return Builder->CreateMul(L, R, "multmp"); + case '/': return Builder->CreateSDiv(L, R, "divtmp"); + default: + fprintf(stderr, "Error: Invalid binary operator\n"); + return nullptr; + } + } + + return nullptr; +} -- cgit v1.3.1-4-g156e