blob: 02f2c50c0e0d516445124e47bd6cc43792a7639f (
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
 | 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) + ")"
 |