types.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. from __future__ import annotations
  2. import sys
  3. from dataclasses import dataclass
  4. from src.zelkelc.lexer import token
  5. @dataclass
  6. class ClassDeclaration:
  7. name: str
  8. members: list[ValueDeclaration]
  9. methods: list[FunctionDeclaration]
  10. irname: str
  11. @dataclass
  12. class StructDeclaration:
  13. name: str
  14. members: list[MemberDeclaration]
  15. irname: str
  16. @dataclass
  17. class MemberDeclaration:
  18. name: str
  19. mutable: bool
  20. typ: Value
  21. real_idx: int
  22. @dataclass
  23. class ValueDeclaration:
  24. name: str
  25. mutable: bool
  26. typ: Value
  27. expr: Expression
  28. irname: str
  29. @dataclass
  30. class FunctionDeclaration:
  31. name: str
  32. typ: Value
  33. args: dict[str, Value]
  34. body: list[Node]
  35. irname: str
  36. @dataclass
  37. class ReturnStatement:
  38. expr: Expression | None
  39. @dataclass
  40. class MacroDefinition:
  41. name: str
  42. params: list[tuple[str, str]]
  43. body: list[token.Token]
  44. @dataclass
  45. class MacroCall:
  46. name: str
  47. args: list[token.Token]
  48. @dataclass
  49. class InlineIR:
  50. template: str
  51. args: list[Expression]
  52. expansion_id: int
  53. Node = (
  54. ClassDeclaration
  55. | ValueDeclaration
  56. | FunctionDeclaration
  57. | StructDeclaration
  58. | MacroDefinition
  59. | MacroCall
  60. | InlineIR
  61. )
  62. @dataclass
  63. class BinaryExpression:
  64. left: Expression
  65. right: Expression
  66. op: str
  67. typ: Value
  68. @dataclass
  69. class UnaryExpression:
  70. expr: Expression
  71. sign: str
  72. typ: Value
  73. @dataclass
  74. class PrimaryExpression:
  75. value: Value
  76. typ: Value
  77. Expression = BinaryExpression | UnaryExpression | PrimaryExpression
  78. @dataclass
  79. class Integer64:
  80. value: int
  81. def to_llvm() -> str:
  82. return "i64"
  83. def __eq__(self, other):
  84. if not isinstance(other, Integer64):
  85. return False
  86. return self.value == other.value
  87. @dataclass
  88. class Float64:
  89. value: int
  90. def to_llvm() -> str:
  91. return "double"
  92. def __eq__(self, other):
  93. if not isinstance(other, Float64):
  94. return False
  95. return self.value == other.value
  96. @dataclass
  97. class String:
  98. value: str
  99. def to_llvm() -> str:
  100. print("Cannot convert String to llvm ir")
  101. sys.exit(1)
  102. @dataclass
  103. class Void:
  104. def to_llvm() -> str:
  105. return "void"
  106. @dataclass
  107. class VariableRef:
  108. name: str
  109. irname: str
  110. typ: Value
  111. def to_llvm() -> str:
  112. print("Cannot convert Variable to llvm ir")
  113. sys.exit(1)
  114. @dataclass
  115. class FunctionCall:
  116. name: str
  117. irname: str
  118. typ: Value
  119. args: list[Expression]
  120. @dataclass
  121. class Ptr[T]:
  122. pass
  123. @dataclass
  124. class Val[T]:
  125. pass
  126. Value = Integer64 | Float64 | String | Void | VariableRef | FunctionCall