@@ -938,6 +938,12 @@ def c(self) -> str:
938938 _ , reference = expand_variable_reference (variable , self )
939939 return reference
940940
941+ @property
942+ def type (self ) -> Type :
943+ variable = discover_variable (self )
944+ type , _ = expand_variable_reference (variable , self )
945+ return type
946+
941947
942948@dataclass
943949class Variable (Entity ):
@@ -965,7 +971,9 @@ def s(self, scope: str) -> list[str]:
965971
966972@dataclass
967973class BuiltinLiteral (Expression ):
968- pass
974+
975+ def format (self ) -> str :
976+ raise NotImplementedError (f"format() not implemented for { self .__class__ .__name__ } at { self .token } " )
969977
970978
971979@dataclass
@@ -1578,15 +1586,15 @@ def expression_ADDING(self) -> Expression:
15781586 operations = ("+" , "-" )
15791587 while operation := self .accept (operations ):
15801588 right = self .expression_MULTIPLYING ()
1581- left = BinaryOperation (operation , self .scope (), type , operation .value , left , right )
1589+ left = BinaryOperation (operation , self .scope (), left . type , operation .value , left , right )
15821590 return left
15831591
15841592 def expression_MULTIPLYING (self ) -> Expression :
15851593 token = self .current ()
15861594 left = self .expression_FUNCTION_CALL ()
15871595 while operation := self .accept (("*" , "/" , "MOD" )):
15881596 right = self .expression_FUNCTION_CALL ()
1589- left = BinaryOperation (token , self .scope (), type , operation .value , left , right )
1597+ left = BinaryOperation (token , self .scope (), left . type , operation .value , left , right )
15901598 return left
15911599
15921600 def expression_FUNCTION_CALL (self ) -> Expression | FunctionCall :
@@ -1611,10 +1619,10 @@ def factor(
16111619 token = self .current ()
16121620 if token .type == "INTEGER" :
16131621 token = self .eat (token .type )
1614- return IntegerLiteral (token , self .scope (), token . type , int (token .value ))
1622+ return IntegerLiteral (token , self .scope (), IntegerType () , int (token .value ))
16151623 if token .type == "REAL" :
16161624 token = self .eat (token .type )
1617- return RealLiteral (token , self .scope (), token . type , float (token .value ))
1625+ return RealLiteral (token , self .scope (), RealType () , float (token .value ))
16181626 if token .type == "STRING" :
16191627 token = self .eat (token .type )
16201628
@@ -1647,7 +1655,7 @@ def factor(
16471655 return expression
16481656 if token .value in ("TRUE" , "FALSE" ):
16491657 token = self .eat (token .value )
1650- return BoolLiteral (token , self .scope (), "BOOLEAN" , token .value == "TRUE" )
1658+ return BoolLiteral (token , self .scope (), BooleanType () , token .value == "TRUE" )
16511659 if token .type == "IDENT" :
16521660 variable = self .variable_reference ()
16531661 return variable
0 commit comments