From 5b776a1d6665b79d71ed72a14daf63b0095998a0 Mon Sep 17 00:00:00 2001 From: Sofia Date: Tue, 28 Apr 2026 01:03:25 +0300 Subject: [PATCH] Add negation unary --- src/ast.cpp | 5 ++++- src/binops.cpp | 10 ++++++++-- src/binops.h | 1 + src/parsing.cpp | 8 ++++++++ test.c | 2 +- 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/ast.cpp b/src/ast.cpp index 88bde97..151175b 100644 --- a/src/ast.cpp +++ b/src/ast.cpp @@ -105,9 +105,12 @@ namespace AST { case types::Unary::SubPrefix: out << "--" << this->m_expr->formatted(); break; - case types::Unary::Negation: + case types::Unary::Not: out << "!" << this->m_expr->formatted(); break; + case types::Unary::Negation: + out << "-" << this->m_expr->formatted(); + break; default: break; } diff --git a/src/binops.cpp b/src/binops.cpp index 7e5fa64..548120f 100644 --- a/src/binops.cpp +++ b/src/binops.cpp @@ -167,10 +167,10 @@ namespace types { }); } - // Negation + // Not & Negation for (auto& ty : { int_ty, char_ty, bool_ty }) { definitions.push_back(UnopDefinition{ - ty, types::Unary::Negation, ty, + ty, types::Unary::Not, ty, [](codegen::Builder& builder, std::shared_ptr ty, llvm::Value* value) { codegen::TypeMap structs {}; auto llvm_ty = ty->codegen(builder, structs); @@ -181,6 +181,12 @@ namespace types { return builder.builder->CreateSelect(cmp, const_1, const_0, "not_select"); } }); + definitions.push_back(UnopDefinition{ + ty, types::Unary::Negation, ty, + [](codegen::Builder& builder, std::shared_ptr, llvm::Value* value) { + return builder.builder->CreateNeg(value, "neg"); + } + }); } return definitions; diff --git a/src/binops.h b/src/binops.h index 0fb37f2..e42a183 100644 --- a/src/binops.h +++ b/src/binops.h @@ -20,6 +20,7 @@ namespace types { AddPrefix, SubPostfix, SubPrefix, + Not, Negation, }; diff --git a/src/parsing.cpp b/src/parsing.cpp index babd3d4..4e31fda 100644 --- a/src/parsing.cpp +++ b/src/parsing.cpp @@ -334,6 +334,14 @@ namespace parsing { }; } else if (inner.peek().content == "!") { + inner.next(); + auto expr = parse_primary_expression(inner, scope).unwrap(); + stream.m_position = inner.m_position; + return std::unique_ptr { + new AST::UnaryExpression(before_meta + inner.metadata(), std::move(expr), types::Unary::Not) + }; + } + else if (inner.peek().content == "-") { inner.next(); auto expr = parse_primary_expression(inner, scope).unwrap(); stream.m_position = inner.m_position; diff --git a/test.c b/test.c index 6da34df..bdb6e70 100644 --- a/test.c +++ b/test.c @@ -52,7 +52,7 @@ int main() { printf("2d array: %d!\n", twod_array[0][0]); int counter = 0; - int a = !0; + int a = -500; printf("a: %d\n", a); return 0;