blob: 1e01949f09c5b7ac8e0012bfe3f782b8629cc4b5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
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, data=False):
self.args = args
self.data = data
def __str__(self):
return "(" + " ".join(f"{arg}" for arg in self.args) + ")"
|