aboutsummaryrefslogtreecommitdiff
path: root/structs.py
blob: 0cd4a1ef9453736aa9443f618628fcf901263ea3 (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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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}"

# Literals
class Literal:
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return f"{self.value}:literal"

class Int(Literal):
    def __str__(self):
        return f"{self.value}"

class Float(Literal):
    def __str__(self):
        return f"{self.value}"

class Bool(Literal):
    def __str__(self):
        return f"#{str(self.value).lower()}"

class String(Literal):
    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, 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
    def __str__(self):
        return "(" +  " ".join(f"{arg}" for arg in self.args) + ")"