-
Notifications
You must be signed in to change notification settings - Fork 32
/
structure.py
185 lines (127 loc) · 4.78 KB
/
structure.py
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
"""defines structure classes to represent the syntactic components of Vyxal
See https://github.com/Vyxal/Vyxal/blob/fresh-beginnings/documents/specs/Structures.md
"""
from typing import Union
from vyxal.lexer import Token
Branch = Union[str, "Structure", list["Structure"], list["Token"]]
class Structure:
def __init__(self, *branches: Branch):
# Don't do anything with the arguments
self.branches = branches
def __repr__(self):
return f"{type(self).__name__}({repr(self.branches)})"
class GenericStatement(Structure):
"""Generic statements are elements and so on"""
class BreakStatement(Structure):
def __init__(self, *branches: Branch):
super().__init__(*branches)
self.parent_structure = branches[0]
class RecurseStatement(Structure):
def __init__(self, *branches: Branch):
super().__init__(*branches)
self.parent_structure = branches[0]
class IfStatement(Structure):
def __init__(self, *branches: Branch):
super().__init__(*branches)
self.truthy = branches[0]
self.falsey = []
self.inbetween = []
if len(branches) > 1:
self.falsey = branches[-1]
if len(branches) > 2:
self.inbetween = branches[1:-1]
class ForLoop(Structure):
def __init__(self, names: list[str], body: Branch):
super().__init__(*names, body)
self.names = names
self.body = body
class WhileLoop(Structure):
"""Represents either a while or an infinite loop."""
def __init__(self, condition: Branch, body: Branch):
super().__init__(condition, body)
self.condition = condition
self.body = body
class FunctionCall(Structure):
def __init__(self, name: str):
super().__init__(name)
self.name = name
class FunctionDef(Structure):
def __init__(
self, name: str, parameters: list["Token"], body: list[Structure]
):
super().__init__(name, parameters, body)
self.name = name
self.parameters = parameters
self.body = body
class Lambda(Structure):
def __init__(self, arity: int, body: list[Structure]):
super().__init__(str(arity), body)
self.arity = arity
self.body = body
class LambdaOp(Structure):
"""A lambda followed by a monad"""
def __init__(self, body: list[Structure], after: str, arity: int = 1):
super().__init__(body, after)
self.lam = Lambda(arity, body)
self.after = after
class LambdaMapDyadic(LambdaOp):
def __init__(self, body: list[Structure]):
super().__init__(body, after="M", arity=2)
class LambdaMapTriadic(LambdaOp):
def __init__(self, body: list[Structure]):
super().__init__(body, after="M", arity=3)
class LambdaMap(LambdaOp):
def __init__(self, body: list[Structure]):
super().__init__(body, after="M")
class LambdaZip(LambdaMap):
def __init__(self, body: list[Structure]):
super().__init__(body)
class LambdaMapEager(LambdaOp):
def __init__(self, body: list[Structure]):
super().__init__(body, after="e")
class LambdaFilter(LambdaOp):
def __init__(self, body: list[Structure]):
super().__init__(body, after="F")
class LambdaFilterDyadic(LambdaOp):
def __init__(self, body: list[Structure]):
super().__init__(body, after="F", arity=2)
class LambdaFilterTriadic(LambdaOp):
def __init__(self, body: list[Structure]):
super().__init__(body, after="F", arity=3)
class LambdaSort(LambdaOp):
def __init__(self, body: list[Structure]):
super().__init__(body, after="ṡ")
class ListLiteral(Structure):
def __init__(self, *items: Branch):
super().__init__(*items)
self.items = items
class MonadicModifier(Structure):
def __init__(self, modifier: str, *branches: Branch):
super().__init__(*branches)
self.modifier = modifier
self.function_A = branches[0]
def __repr__(self):
return (
f"{type(self).__name__}({repr(self.branches)}, {self.modifier!r})"
)
class DyadicModifier(Structure):
def __init__(self, modifier: str, *branches: Branch):
super().__init__(*branches)
self.modifier = modifier
self.function_A = branches[0]
self.function_B = branches[1]
def __repr__(self):
return (
f"{type(self).__name__}({repr(self.branches)}, {self.modifier!r})"
)
class TriadicModifier(Structure):
def __init__(self, modifier: str, *branches: Branch):
super().__init__(*branches)
self.modifier = modifier
self.function_A = branches[0]
self.function_B = branches[1]
self.function_C = branches[2]
def __repr__(self):
return (
f"{type(self).__name__}({repr(self.branches)}, {self.modifier!r})"
)