aboutsummaryrefslogtreecommitdiff
path: root/structs.py
diff options
context:
space:
mode:
Diffstat (limited to 'structs.py')
-rw-r--r--structs.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/structs.py b/structs.py
new file mode 100644
index 0000000..02f2c50
--- /dev/null
+++ b/structs.py
@@ -0,0 +1,92 @@
+from dataclasses import dataclass
+from enum import Enum, auto
+from typing import Any
+
+# tokens and types
+# NOTE: this can probably be simplified
+class TokenType(Enum):
+
+ PRINT = auto()
+
+ OPEN_PAREN = auto()
+ CLOSE_PAREN = auto()
+
+ EOF = auto()
+
+ # literals
+ INT = auto()
+ FLOAT = auto()
+ STRING = auto()
+ TRUE = auto()
+ FALSE = auto()
+
+ # arithmetic
+ PLUS = auto()
+ DASH = auto()
+ STAR = auto()
+ SLASH = auto()
+
+ # strings
+ DOUBLE_QUOTE = auto()
+
+ # comparison
+ GREATER = auto()
+ GREATER_EQUAL = auto()
+ LESS = auto()
+ LESS_EQUAL = auto()
+ EQUAL = auto()
+ NOT = auto()
+ AND = auto()
+ OR = auto()
+
+ # flow
+ IF = auto()
+ FOR_COUNT = auto()
+ PIPE = auto()
+
+ # keywords
+ DEF = auto()
+ LAMBDA = auto()
+
+ # symbols
+ SYMBOL = auto()
+
+ # types
+ INT_TYPE = auto()
+ FLOAT_TYPE = auto()
+ STRING_TYPE = auto()
+ ANY_TYPE = auto()
+
+@dataclass
+class Token:
+ type_: TokenType
+ text: str
+ value: Any
+ line: int
+
+ def __str__(self):
+ return f"{self.type_.name} {self.text} {self.line}"
+
+class Literal:
+ def __init__(self, value):
+ self.value = value
+ def __str__(self):
+ return f"{self.value}"
+
+class Type:
+ def __init__(self, name):
+ self.name = name
+ def __str__(self):
+ return self.name
+
+class Symbol:
+ def __init__(self, name):
+ self.name = name
+ def __str__(self):
+ return f"'{self.name}"
+
+class List:
+ def __init__(self, args):
+ self.args = args
+ def __str__(self):
+ return "(" + " ".join(f"{arg}" for arg in self.args) + ")"