diff options
| author | mryouse | 2022-05-10 02:07:40 +0000 |
|---|---|---|
| committer | mryouse | 2022-05-10 02:07:40 +0000 |
| commit | 7bed8de9b493ca2a2b13d6293db6bd81b73325ce (patch) | |
| tree | 7efa56cddb8a0cec4b4c03495874474b510c6a09 /tokens.py | |
initial commit
Diffstat (limited to 'tokens.py')
| -rw-r--r-- | tokens.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/tokens.py b/tokens.py new file mode 100644 index 0000000..e7f137b --- /dev/null +++ b/tokens.py @@ -0,0 +1,63 @@ +from dataclasses import dataclass +from enum import Enum, auto +from typing import TypeVar, List + +T = TypeVar("T", int, float, str, bool) + +# classes +class NebType(Enum): + INT = auto() + FLOAT = auto() + STRING = auto() + BOOL = auto() + +@dataclass +class NebToken: + pass + +@dataclass +class NebLiteral(NebToken): + type_: NebType + value: T + +class NebSeparator(NebToken): + pass + +class NebOpen(NebSeparator): + pass + +class NebClose(NebSeparator): + pass + +@dataclass +class NebSymbol(NebToken): + name: str + +@dataclass +class NebExpression(NebToken): + symbol: NebSymbol + args: List[NebToken] + + def maybe_sig(self): + out = [] + for arg in self.args: + if isinstance(arg, NebLiteral): + out.append(":" + arg.type_.name.lower()) + else: + raise Exception("expressions must have a list of literals") #TODO not true + return " ".join(out) + +@dataclass +class NebFunction(NebToken): + name: str + args: List[NebType] + returns: NebType + + def in_sig(self): + return " ".join(":" + x.name.lower() for x in self.args) + + def out_sig(self): + return ":" + self.returns.lower() + + def sig(self): + return (self.in_sig() + " > " + self.out_sig()).strip() |
