Compare commits

..

3 Commits

Author SHA1 Message Date
ba21718f71 Format unary plus correctly 2026-04-28 01:06:53 +03:00
4a0257c771 Add unary plus 2026-04-28 01:05:02 +03:00
5b776a1d66 Add negation unary 2026-04-28 01:03:25 +03:00
5 changed files with 40 additions and 4 deletions

View File

@ -105,9 +105,15 @@ namespace AST {
case types::Unary::SubPrefix: case types::Unary::SubPrefix:
out << "--" << this->m_expr->formatted(); out << "--" << this->m_expr->formatted();
break; break;
case types::Unary::Negation: case types::Unary::Not:
out << "!" << this->m_expr->formatted(); out << "!" << this->m_expr->formatted();
break; break;
case types::Unary::Negation:
out << "-" << this->m_expr->formatted();
break;
case types::Unary::Plus:
out << "+" << this->m_expr->formatted();
break;
default: default:
break; break;
} }

View File

@ -167,10 +167,10 @@ namespace types {
}); });
} }
// Negation // Not & Negation
for (auto& ty : { int_ty, char_ty, bool_ty }) { for (auto& ty : { int_ty, char_ty, bool_ty }) {
definitions.push_back(UnopDefinition{ definitions.push_back(UnopDefinition{
ty, types::Unary::Negation, ty, ty, types::Unary::Not, ty,
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* value) { [](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* value) {
codegen::TypeMap structs {}; codegen::TypeMap structs {};
auto llvm_ty = ty->codegen(builder, structs); auto llvm_ty = ty->codegen(builder, structs);
@ -181,6 +181,18 @@ namespace types {
return builder.builder->CreateSelect(cmp, const_1, const_0, "not_select"); 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<Type>, llvm::Value* value) {
return builder.builder->CreateNeg(value, "neg");
}
});
definitions.push_back(UnopDefinition{
ty, types::Unary::Plus, ty,
[](codegen::Builder&, std::shared_ptr<Type>, llvm::Value* value) {
return value;
}
});
} }
return definitions; return definitions;

View File

@ -20,7 +20,9 @@ namespace types {
AddPrefix, AddPrefix,
SubPostfix, SubPostfix,
SubPrefix, SubPrefix,
Not,
Negation, Negation,
Plus,
}; };
int operator_precedence(BinOp& op); int operator_precedence(BinOp& op);

View File

@ -334,6 +334,14 @@ namespace parsing {
}; };
} }
else if (inner.peek().content == "!") { 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<AST::Expression> {
new AST::UnaryExpression(before_meta + inner.metadata(), std::move(expr), types::Unary::Not)
};
}
else if (inner.peek().content == "-") {
inner.next(); inner.next();
auto expr = parse_primary_expression(inner, scope).unwrap(); auto expr = parse_primary_expression(inner, scope).unwrap();
stream.m_position = inner.m_position; stream.m_position = inner.m_position;
@ -341,6 +349,14 @@ namespace parsing {
new AST::UnaryExpression(before_meta + inner.metadata(), std::move(expr), types::Unary::Negation) new AST::UnaryExpression(before_meta + inner.metadata(), std::move(expr), types::Unary::Negation)
}; };
} }
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<AST::Expression> {
new AST::UnaryExpression(before_meta + inner.metadata(), std::move(expr), types::Unary::Plus)
};
}
auto plain_expr = parse_plain_expression(inner, scope); auto plain_expr = parse_plain_expression(inner, scope);
while (inner.peek().content == "(" || inner.peek().content == "[" || inner.peek().content == ".") { while (inner.peek().content == "(" || inner.peek().content == "[" || inner.peek().content == ".") {

2
test.c
View File

@ -52,7 +52,7 @@ int main() {
printf("2d array: %d!\n", twod_array[0][0]); printf("2d array: %d!\n", twod_array[0][0]);
int counter = 0; int counter = 0;
int a = !0; int a = -500;
printf("a: %d\n", a); printf("a: %d\n", a);
return 0; return 0;