aboutsummaryrefslogtreecommitdiff
path: root/neb/structs.py
diff options
context:
space:
mode:
Diffstat (limited to 'neb/structs.py')
-rw-r--r--neb/structs.py108
1 files changed, 108 insertions, 0 deletions
diff --git a/neb/structs.py b/neb/structs.py
new file mode 100644
index 0000000..09807db
--- /dev/null
+++ b/neb/structs.py
@@ -0,0 +1,108 @@
+from dataclasses import dataclass
+from enum import Enum, auto
+from typing import Any
+from .typeclass import TypeEnum
+
+# tokens and types
+# NOTE: this can probably be simplified
+class TokenType(Enum):
+
+ OPEN_PAREN = auto()
+ CLOSE_PAREN = auto()
+
+ EOF = auto()
+
+ # literals
+ INT = auto()
+ FLOAT = auto()
+ STRING = auto()
+ TRUE = auto()
+ FALSE = auto()
+
+ # keywords
+ IF = auto()
+ FOR_COUNT = auto()
+ DEF = auto()
+ LAMBDA = auto()
+ FUNC = auto()
+
+ # symbols
+ SYMBOL = auto()
+
+ # types
+ INT_TYPE = auto()
+ FLOAT_TYPE = auto()
+ NUMBER_TYPE = auto()
+ STRING_TYPE = auto()
+ ANY_TYPE = auto()
+ LIST_TYPE = auto()
+ LITERAL_TYPE = auto()
+ BOOL_TYPE = auto()
+
+ MANY = 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, type_=None):
+ self.value = value
+ if type_ is None:
+ self.type_ = TypeEnum.ANY
+ else:
+ self.type_ = type_
+ def __str__(self):
+ return f"{self.value}:literal"
+
+class Int(Literal):
+ def __init__(self, value):
+ super().__init__(value, TypeEnum.INT)
+ def __str__(self):
+ return f"{self.value}"
+
+class Float(Literal):
+ def __init__(self, value):
+ super().__init__(value, TypeEnum.FLOAT)
+ def __str__(self):
+ return f"{self.value}"
+
+class Bool(Literal):
+ def __init__(self, value):
+ super().__init__(value, TypeEnum.BOOL)
+ def __str__(self):
+ return f"#{str(self.value).lower()}"
+
+class String(Literal):
+ def __init__(self, value):
+ super().__init__(value, TypeEnum.STRING)
+ def __str__(self):
+ return f'"{repr(self.value)[1:-1]}"'
+
+class Type:
+ def __init__(self, name):
+ self.name = name
+ def __str__(self):
+ return self.name
+
+class Symbol:
+ def __init__(self, name, line):
+ self.name = name
+ self.line = line
+ def __str__(self):
+ return f"'{self.name}"
+
+class List:
+ def __init__(self, args, data=False):
+ self.args = args
+ self.data = data
+ self.type_ = TypeEnum.LIST
+ def __str__(self):
+ return "(" + " ".join(f"{arg}" for arg in self.args) + ")"
+