@@ -16,8 +16,9 @@ class String {
}
fn main() -> void {
- val a: i64 = 1
- val test: i64 = a + 1
+ val a: i64 = 10
+ val b: i64 = 32
+ val test: i64 = a + b * 3
return
"""
@@ -313,7 +313,7 @@ class Parser:
self.expect(token.RParen())
return types.PrimaryExpression(types.FunctionCall(t.value, args, None), types.FunctionCall)
else:
- return types.PrimaryExpression(types.VariableRef(t.value, None), types.VariableRef)
+ return types.PrimaryExpression(types.VariableRef(t.value, None, None), types.VariableRef)
case token.Integer():
self.cursor += 1
@@ -96,6 +96,7 @@ class Void:
class VariableRef:
name: str
irname: str
+ typ: Value
def to_llvm() -> str:
print("Cannot convert Variable to llvm ir")
@@ -114,10 +114,17 @@ class Codegen:
exit(1)
match node.left.typ:
- case types.Integer64:
+ case types.Integer64:
ir += f"\n%{self.temp_counter} = {op} i64 %{left_irname}, %{right_irname}"
self.temp_counter += 1
- case _:
+ case types.VariableRef:
+ match node.left.value.typ:
+ ir += f"\n%{self.temp_counter} = {op} i64 %{left_irname}, %{right_irname}"
+ self.temp_counter += 1
+ case _:
+ print(f"gen_expression() for BinaryExpression left operand variable type '{node.left.value.typ}' is unimplemented")
print(f"gen_expression() for BinaryExpression for {node.left.typ}")
case types.UnaryExpression:
@@ -329,6 +329,7 @@ class ScopeChecker:
return None
expr.value.irname = signature.irname
+ expr.value.typ = signature.typ
return signature.typ
case types.PrimaryExpression(types.FunctionCall(name, args)):
arg_types = active_scope.expr_args_to_arg_types(self, args)