diff options
| author | mryouse | 2022-06-18 02:45:04 +0000 |
|---|---|---|
| committer | mryouse | 2022-06-18 02:45:04 +0000 |
| commit | d1a1c1592e610526c4a0432f93bd9ea6ae96d6e8 (patch) | |
| tree | df4c78f3ce5dfb1369d5fc6c155ca43e8bfc729f /neb/structs.py | |
| parent | 065d138ca3013a4d1ef1aa3d7c48982d8bee5de2 (diff) | |
refactor: make neb a module
Diffstat (limited to 'neb/structs.py')
| -rw-r--r-- | neb/structs.py | 108 |
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) + ")" + |
