Sfoglia il codice sorgente

codegen variableref

Johan Rong 4 giorni fa
parent
commit
1334f43fd1

+ 3 - 2
src/zelkelc/__main__.py

@@ -16,8 +16,9 @@ class String {
 }
 }
 
 
 fn main() -> void {
 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
     return
 }
 }
 """
 """

+ 1 - 1
src/zelkelc/ast/parser.py

@@ -313,7 +313,7 @@ class Parser:
                     self.expect(token.RParen())
                     self.expect(token.RParen())
                     return types.PrimaryExpression(types.FunctionCall(t.value, args, None), types.FunctionCall)
                     return types.PrimaryExpression(types.FunctionCall(t.value, args, None), types.FunctionCall)
                 else:
                 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():
             case token.Integer():
                 self.cursor += 1
                 self.cursor += 1

+ 1 - 0
src/zelkelc/ast/types.py

@@ -96,6 +96,7 @@ class Void:
 class VariableRef:
 class VariableRef:
     name: str
     name: str
     irname: str
     irname: str
+    typ: Value
     
     
     def to_llvm() -> str:
     def to_llvm() -> str:
         print("Cannot convert Variable to llvm ir")
         print("Cannot convert Variable to llvm ir")

+ 9 - 2
src/zelkelc/codegen/codegen.py

@@ -114,10 +114,17 @@ class Codegen:
                         exit(1)
                         exit(1)
                         
                         
                 match node.left.typ:
                 match node.left.typ:
-                   case types.Integer64:
+                    case types.Integer64:
                         ir += f"\n%{self.temp_counter} = {op} i64 %{left_irname}, %{right_irname}"
                         ir += f"\n%{self.temp_counter} = {op} i64 %{left_irname}, %{right_irname}"
                         self.temp_counter += 1
                         self.temp_counter += 1
-                   case _:
+                    case types.VariableRef:
+                        match node.left.value.typ:
+                            case types.Integer64:
+                                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")
+                    case _:
                        print(f"gen_expression() for BinaryExpression for {node.left.typ}")
                        print(f"gen_expression() for BinaryExpression for {node.left.typ}")
                        exit(1)
                        exit(1)
             case types.UnaryExpression:
             case types.UnaryExpression:

+ 1 - 0
src/zelkelc/validator/scope.py

@@ -329,6 +329,7 @@ class ScopeChecker:
                     return None
                     return None
                 
                 
                 expr.value.irname = signature.irname
                 expr.value.irname = signature.irname
+                expr.value.typ = signature.typ
                 return signature.typ
                 return signature.typ
             case types.PrimaryExpression(types.FunctionCall(name, args)):
             case types.PrimaryExpression(types.FunctionCall(name, args)):
                 arg_types = active_scope.expr_args_to_arg_types(self, args)
                 arg_types = active_scope.expr_args_to_arg_types(self, args)