| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- from __future__ import annotations
- import sys
- from dataclasses import dataclass
- from src.zelkelc.lexer import token
- @dataclass
- class ClassDeclaration:
- name: str
- members: list[ValueDeclaration]
- methods: list[FunctionDeclaration]
- irname: str
- @dataclass
- class StructDeclaration:
- name: str
- members: list[MemberDeclaration]
- irname: str
- @dataclass
- class MemberDeclaration:
- name: str
- mutable: bool
- typ: Value
- real_idx: int
- @dataclass
- class ValueDeclaration:
- name: str
- mutable: bool
- typ: Value
- expr: Expression
- irname: str
- @dataclass
- class FunctionDeclaration:
- name: str
- typ: Value
- args: dict[str, Value]
- body: list[Node]
- irname: str
- @dataclass
- class ReturnStatement:
- expr: Expression | None
- @dataclass
- class MacroDefinition:
- name: str
- params: list[tuple[str, str]]
- body: list[token.Token]
- @dataclass
- class MacroCall:
- name: str
- args: list[token.Token]
- @dataclass
- class InlineIR:
- template: str
- args: list[Expression]
- expansion_id: int
- Node = (
- ClassDeclaration
- | ValueDeclaration
- | FunctionDeclaration
- | StructDeclaration
- | MacroDefinition
- | MacroCall
- | InlineIR
- )
- @dataclass
- class BinaryExpression:
- left: Expression
- right: Expression
- op: str
- typ: Value
- @dataclass
- class UnaryExpression:
- expr: Expression
- sign: str
- typ: Value
- @dataclass
- class PrimaryExpression:
- value: Value
- typ: Value
- Expression = BinaryExpression | UnaryExpression | PrimaryExpression
- @dataclass
- class Integer64:
- value: int
- def to_llvm() -> str:
- return "i64"
- def __eq__(self, other):
- if not isinstance(other, Integer64):
- return False
- return self.value == other.value
- @dataclass
- class Float64:
- value: int
- def to_llvm() -> str:
- return "double"
- def __eq__(self, other):
- if not isinstance(other, Float64):
- return False
- return self.value == other.value
- @dataclass
- class String:
- value: str
- def to_llvm() -> str:
- print("Cannot convert String to llvm ir")
- sys.exit(1)
- @dataclass
- class Void:
- def to_llvm() -> str:
- return "void"
- @dataclass
- class VariableRef:
- name: str
- irname: str
- typ: Value
- def to_llvm() -> str:
- print("Cannot convert Variable to llvm ir")
- sys.exit(1)
- @dataclass
- class FunctionCall:
- name: str
- irname: str
- typ: Value
- args: list[Expression]
- @dataclass
- class Ptr[T]:
- pass
- @dataclass
- class Val[T]:
- pass
- Value = Integer64 | Float64 | String | Void | VariableRef | FunctionCall
|