diff --git a/Parser/src/AST-LLVM.cpp b/Parser/src/AST-LLVM.cpp index 88fe28a..1797614 100644 --- a/Parser/src/AST-LLVM.cpp +++ b/Parser/src/AST-LLVM.cpp @@ -43,9 +43,33 @@ namespace LX::AST } // Generates the IR of the operation // - // TODO: Support other operators other than ADD // - // TODO: Make the error actually output information // - llvm::Value* out = LLVM.builder.CreateAdd(lhs, rhs); + llvm::Value* out = nullptr; + + // Creates the correct operation depending on the operand // + switch (m_Operand) + { + case Token::ADD: + out = LLVM.builder.CreateAdd(lhs, rhs); + break; + + case Token::SUB: + out = LLVM.builder.CreateSub(lhs, rhs); + break; + + case Token::MUL: + out = LLVM.builder.CreateMul(lhs, rhs); + break; + + case Token::DIV: + out = LLVM.builder.CreateSDiv(lhs, rhs); + break; + + default: + // TODO: Add an error here + out = nullptr; + } + + // Checks it all went succesfully before returning // ThrowIf(out == nullptr); return out; } diff --git a/Parser/src/Parser.cpp b/Parser/src/Parser.cpp index ddfb8af..686eda3 100644 --- a/Parser/src/Parser.cpp +++ b/Parser/src/Parser.cpp @@ -7,6 +7,22 @@ namespace LX { + // Util function for working out if a token is a two sided operator // + static bool IsTwoSidedOperator(Token::TokenType t) + { + switch (t) + { + case Token::ADD: + case Token::SUB: + case Token::DIV: + case Token::MUL: + return true; + + default: + return false; + } + } + // Local struct so everything can be public // struct Parser { @@ -73,7 +89,7 @@ namespace LX // TODO: Add more than just add // if (p.index + 1 < p.len) [[likely]] { - if (p.tokens[p.index + 1].type == Token::ADD) + if (IsTwoSidedOperator(p.tokens[p.index + 1].type)) { // Parses the left hand side of the operation // std::unique_ptr lhs = ParsePrimary(p); diff --git a/example/main.lx b/example/main.lx index 6aa1f43..96d54e8 100644 --- a/example/main.lx +++ b/example/main.lx @@ -7,7 +7,7 @@ func main() b = 7 int c - c = a + b + c = a / b return c }