added not eq and fixed some bugs with if statement codegen

This commit is contained in:
2026-05-05 20:05:45 +10:00
parent e75216c84b
commit f0e1959603
13 changed files with 63 additions and 6 deletions

View File

@@ -23,8 +23,17 @@ class CometTester(unittest.TestCase):
for case in cases: for case in cases:
with self.subTest(): with self.subTest():
result = subprocess.run(["./cometc", f"{TESTS_FOLDER_NAME}/{case}", "-o", f"{TESTS_OBJ_FOLDER_NAME}/{case}.obj"]) obj_name = f"{TESTS_OBJ_FOLDER_NAME}/{case}.obj"
self.assertEqual(result.returncode, 0, f"{case} did not compile successfully!") program_name = f"{TESTS_OBJ_FOLDER_NAME}/{case.rstrip(".comet")}"
result = subprocess.run(["./cometc", f"{TESTS_FOLDER_NAME}/{case}", "-o", obj_name])
self.assertEqual(result.returncode, 0, f"{case} did not compile successfully (comet)!")
gcc_result = subprocess.run(["gcc", obj_name, "-o", program_name, "-no-pie"])
self.assertEqual(gcc_result.returncode, 0, f"{case} did not link successfully (gcc)!")
program_result = subprocess.run([program_name])
self.assertEqual(program_result.returncode, 0, f"{case} did not run successfully!")
if __name__ == "__main__": if __name__ == "__main__":

View File

@@ -720,7 +720,8 @@ ResultType(int, charptr) visitIfStatement(CometCompiler* compiler, CometASTNode*
ResultType(int, charptr) bodyResult = compileBlock(compiler, consequence); ResultType(int, charptr) bodyResult = compileBlock(compiler, consequence);
if (bodyResult.error) if (bodyResult.error)
return Error(int, charptr, bodyResult.as.error); return Error(int, charptr, bodyResult.as.error);
LLVMBuildBr(compiler->builder, mergeBB); if (!bodyResult.as.success)
LLVMBuildBr(compiler->builder, mergeBB);
// build else block // build else block
bool elseReturns = false; bool elseReturns = false;
@@ -730,7 +731,8 @@ ResultType(int, charptr) visitIfStatement(CometCompiler* compiler, CometASTNode*
ResultType(int, charptr) elseResult = compileBlock(compiler, otherwise); ResultType(int, charptr) elseResult = compileBlock(compiler, otherwise);
if (elseResult.error) if (elseResult.error)
return Error(int, charptr, elseResult.as.error); return Error(int, charptr, elseResult.as.error);
LLVMBuildBr(compiler->builder, mergeBB); if (!elseResult.as.success)
LLVMBuildBr(compiler->builder, mergeBB);
elseReturns = elseResult.as.success; elseReturns = elseResult.as.success;
} }
@@ -1123,6 +1125,11 @@ ResultType(CometValue, charptr) visitInfixExpression(CometCompiler* compiler, Co
value = LLVMBuildICmp(compiler->builder, LLVMIntEQ, left.as.success.value, right.as.success.value, ""); value = LLVMBuildICmp(compiler->builder, LLVMIntEQ, left.as.success.value, right.as.success.value, "");
break; break;
} }
case CT_NOT_EQ: {
type = getType(compiler, "bool");
value = LLVMBuildICmp(compiler->builder, LLVMIntNE, left.as.success.value, right.as.success.value, "");
break;
}
case CT_LT: { case CT_LT: {
type = getType(compiler, "bool"); type = getType(compiler, "bool");
value = LLVMBuildICmp(compiler->builder, LLVMIntSLT, left.as.success.value, right.as.success.value, ""); value = LLVMBuildICmp(compiler->builder, LLVMIntSLT, left.as.success.value, right.as.success.value, "");
@@ -1327,6 +1334,7 @@ ResultType(Nothing, charptr) compileAST(CometCompiler* compiler, CometASTNode* r
// verify IR // verify IR
if (LLVMVerifyModule(compiler->module, LLVMReturnStatusAction, &error) != 0) { if (LLVMVerifyModule(compiler->module, LLVMReturnStatusAction, &error) != 0) {
printf("Module:\n%s\n", LLVMPrintModuleToString(compiler->module));
return Error(Nothing, charptr, error); return Error(Nothing, charptr, error);
} }

View File

@@ -278,6 +278,29 @@ ResultType(tokenList, charptr) lex(CometLexer* lexer) {
case '\n': case '\n':
case '\r': case '\r':
break; break;
case '!': {
ResultType(char, charptr) next = lexerPeek(lexer);
if (next.error) {
append(tokens, TOKEN_LITERAL(CT_NOT, "!"));
break;
}
lexerConsume(lexer);
if (next.as.success == '=') {
append(tokens, TOKEN_LITERAL(CT_NOT_EQ, "!="));
} else {
if (isspace(next.as.success)) {
append(tokens, TOKEN_LITERAL(CT_NOT, "!"))
break;
}
return Error(tokenList, charptr, "Expected '=' after '!'.");
}
break;
}
case '=': { case '=': {
ResultType(char, charptr) next = lexerPeek(lexer); ResultType(char, charptr) next = lexerPeek(lexer);

View File

@@ -24,6 +24,7 @@ const CometTokenPrecedencePair PRECEDENCES[] = {
{CT_LTE, PRECEDENCE_LESSGREATER}, {CT_LTE, PRECEDENCE_LESSGREATER},
{CT_GTE, PRECEDENCE_LESSGREATER}, {CT_GTE, PRECEDENCE_LESSGREATER},
{CT_EQ_EQ, PRECEDENCE_EQUALS}, {CT_EQ_EQ, PRECEDENCE_EQUALS},
{CT_NOT_EQ, PRECEDENCE_EQUALS},
{CT_DOT, PRECEDENCE_INDEX}, {CT_DOT, PRECEDENCE_INDEX},
{CT_EQ, PRECEDENCE_SET} {CT_EQ, PRECEDENCE_SET}
}; };
@@ -61,6 +62,7 @@ const CometInfixParseFn INFIX_PARSE_FUNCTIONS[] = {
{CT_LTE, parseInfixExpression}, {CT_LTE, parseInfixExpression},
{CT_GTE, parseInfixExpression}, {CT_GTE, parseInfixExpression},
{CT_EQ_EQ, parseInfixExpression}, {CT_EQ_EQ, parseInfixExpression},
{CT_NOT_EQ, parseInfixExpression},
{CT_DOT, parseInfixExpression}, {CT_DOT, parseInfixExpression},
{CT_EQ, parseInfixExpression} {CT_EQ, parseInfixExpression}
}; };

View File

@@ -62,6 +62,10 @@ char* tokenTypeToCStr(CometTokenType tokType) {
return "CT_INLINE_FUNC_ARROW"; return "CT_INLINE_FUNC_ARROW";
case CT_COMMA: case CT_COMMA:
return "CT_COMMA"; return "CT_COMMA";
case CT_NOT:
return "CT_NOT";
case CT_NOT_EQ:
return "CT_NOT_EQ";
default: default:
return "FIXME"; return "FIXME";

View File

@@ -16,10 +16,11 @@ typedef enum {
// symbols // symbols
CT_EQ_EQ, CT_LT, CT_GT, CT_LTE, CT_GTE, CT_EQ_EQ, CT_LT, CT_GT, CT_LTE, CT_GTE,
CT_COLON, CT_COLON,
CT_EQ, CT_EQ, CT_NOT_EQ,
CT_PLUS, CT_MINUS, CT_DIVIDE, CT_TIMES, CT_MOD, CT_POW, CT_PLUS, CT_MINUS, CT_DIVIDE, CT_TIMES, CT_MOD, CT_POW,
CT_DOT, CT_DOT_DOT, CT_ARROW, CT_INLINE_FUNC_ARROW, CT_DOT, CT_DOT_DOT, CT_ARROW, CT_INLINE_FUNC_ARROW,
CT_OPEN_CURLY, CT_CLOSE_CURLY, CT_OPEN_PAREN, CT_CLOSE_PAREN, CT_COMMA, CT_OPEN_CURLY, CT_CLOSE_CURLY, CT_OPEN_PAREN, CT_CLOSE_PAREN, CT_COMMA,
CT_NOT,
// other // other
CT_COMMENT, CT_END_LABEL, CT_EOF CT_COMMENT, CT_END_LABEL, CT_EOF

BIN
test_objs/helloWorld Executable file

Binary file not shown.

BIN
test_objs/ifStatements Executable file

Binary file not shown.

BIN
test_objs/inlineFunctions Executable file

Binary file not shown.

BIN
test_objs/structs Executable file

Binary file not shown.

BIN
test_objs/variables Executable file

Binary file not shown.

9
tests/ifStatements.comet Normal file
View File

@@ -0,0 +1,9 @@
func main() -> int {
if 1+1 == 2 {
return 0
} else {
return 1
}
return 0
}

View File

@@ -13,5 +13,6 @@ struct Vector {
func main() -> int { func main() -> int {
Vector myVector = new Vector(1, 2, 3) Vector myVector = new Vector(1, 2, 3)
print("myVector.x = %d, myVector.y = %d, myVector.z = %d\n", myVector.x, myVector.y, myVector.z) print("myVector.x = %d, myVector.y = %d, myVector.z = %d\n", myVector.x, myVector.y, myVector.z)
return 0 print("%d\n", myVector.y != 2)
return myVector.y != 2
} }