shell-lite 0.3.3__py3-none-any.whl → 0.3.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- shell_lite/__init__.py +1 -0
- shell_lite/ast_nodes.py +15 -110
- shell_lite/cli.py +10 -0
- shell_lite/compiler.py +2 -189
- shell_lite/formatter.py +75 -0
- shell_lite/interpreter.py +35 -538
- shell_lite/js_compiler.py +3 -79
- shell_lite/lexer.py +29 -107
- shell_lite/main.py +120 -75
- shell_lite/parser.py +17 -510
- shell_lite/runtime.py +1 -76
- shell_lite-0.3.5.dist-info/LICENSE +21 -0
- shell_lite-0.3.5.dist-info/METADATA +40 -0
- shell_lite-0.3.5.dist-info/RECORD +17 -0
- {shell_lite-0.3.3.dist-info → shell_lite-0.3.5.dist-info}/WHEEL +1 -1
- shell_lite-0.3.3.dist-info/METADATA +0 -77
- shell_lite-0.3.3.dist-info/RECORD +0 -14
- {shell_lite-0.3.3.dist-info → shell_lite-0.3.5.dist-info}/entry_points.txt +0 -0
- {shell_lite-0.3.3.dist-info → shell_lite-0.3.5.dist-info}/top_level.txt +0 -0
shell_lite/__init__.py
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
shell_lite/ast_nodes.py
CHANGED
|
@@ -1,369 +1,274 @@
|
|
|
1
|
-
|
|
2
1
|
from dataclasses import dataclass, field
|
|
3
2
|
from typing import Any, List, Optional
|
|
4
|
-
|
|
5
3
|
@dataclass
|
|
6
4
|
class Node:
|
|
7
5
|
line: int = field(default=0, init=False)
|
|
8
|
-
|
|
9
6
|
@dataclass
|
|
10
7
|
class Number(Node):
|
|
11
8
|
value: int
|
|
12
|
-
|
|
13
9
|
@dataclass
|
|
14
10
|
class String(Node):
|
|
15
11
|
value: str
|
|
16
|
-
|
|
17
12
|
@dataclass
|
|
18
13
|
class Regex(Node):
|
|
19
14
|
pattern: str
|
|
20
|
-
|
|
21
15
|
@dataclass
|
|
22
16
|
class VarAccess(Node):
|
|
23
17
|
name: str
|
|
24
|
-
|
|
25
18
|
@dataclass
|
|
26
19
|
class Assign(Node):
|
|
27
|
-
name: str
|
|
20
|
+
name: str
|
|
28
21
|
value: Node
|
|
29
|
-
|
|
30
22
|
@dataclass
|
|
31
23
|
class PropertyAssign(Node):
|
|
32
24
|
instance_name: str
|
|
33
25
|
property_name: str
|
|
34
26
|
value: Node
|
|
35
|
-
|
|
36
27
|
@dataclass
|
|
37
28
|
class UnaryOp(Node):
|
|
38
29
|
op: str
|
|
39
30
|
right: Node
|
|
40
|
-
|
|
41
31
|
@dataclass
|
|
42
32
|
class BinOp(Node):
|
|
43
33
|
left: Node
|
|
44
34
|
op: str
|
|
45
35
|
right: Node
|
|
46
|
-
|
|
47
36
|
@dataclass
|
|
48
37
|
class Print(Node):
|
|
49
38
|
expression: Node
|
|
50
39
|
style: Optional[str] = None
|
|
51
40
|
color: Optional[str] = None
|
|
52
|
-
|
|
53
41
|
@dataclass
|
|
54
42
|
class If(Node):
|
|
55
43
|
condition: Node
|
|
56
44
|
body: List[Node]
|
|
57
45
|
else_body: Optional[List[Node]] = None
|
|
58
|
-
|
|
59
46
|
@dataclass
|
|
60
47
|
class While(Node):
|
|
61
48
|
condition: Node
|
|
62
49
|
body: List[Node]
|
|
63
|
-
|
|
64
50
|
@dataclass
|
|
65
51
|
class For(Node):
|
|
66
52
|
count: Node
|
|
67
53
|
body: List[Node]
|
|
68
|
-
|
|
69
54
|
@dataclass
|
|
70
55
|
class ListVal(Node):
|
|
71
56
|
elements: List[Node]
|
|
72
|
-
|
|
73
57
|
@dataclass
|
|
74
58
|
class Dictionary(Node):
|
|
75
59
|
pairs: List[tuple[Node, Node]]
|
|
76
|
-
|
|
77
60
|
@dataclass
|
|
78
61
|
class SetVal(Node):
|
|
79
62
|
elements: List[Node]
|
|
80
|
-
|
|
81
63
|
@dataclass
|
|
82
64
|
class Boolean(Node):
|
|
83
65
|
value: bool
|
|
84
|
-
|
|
85
66
|
@dataclass
|
|
86
67
|
class Input(Node):
|
|
87
68
|
prompt: Optional[str] = None
|
|
88
|
-
|
|
89
69
|
@dataclass
|
|
90
70
|
class FunctionDef(Node):
|
|
91
71
|
name: str
|
|
92
|
-
args: List[tuple[str, Optional[Node], Optional[str]]]
|
|
72
|
+
args: List[tuple[str, Optional[Node], Optional[str]]]
|
|
93
73
|
body: List[Node]
|
|
94
74
|
return_type: Optional[str] = None
|
|
95
|
-
|
|
96
75
|
@dataclass
|
|
97
76
|
class Call(Node):
|
|
98
77
|
name: str
|
|
99
78
|
args: List[Node]
|
|
100
|
-
body: Optional[List[Node]] = None
|
|
101
|
-
|
|
79
|
+
body: Optional[List[Node]] = None
|
|
102
80
|
@dataclass
|
|
103
81
|
class Return(Node):
|
|
104
82
|
value: Node
|
|
105
|
-
|
|
106
83
|
@dataclass
|
|
107
84
|
class ClassDef(Node):
|
|
108
85
|
name: str
|
|
109
86
|
properties: List[str]
|
|
110
87
|
methods: List[FunctionDef]
|
|
111
88
|
parent: Optional[str] = None
|
|
112
|
-
|
|
113
89
|
@dataclass
|
|
114
90
|
class Instantiation(Node):
|
|
115
91
|
var_name: str
|
|
116
92
|
class_name: str
|
|
117
93
|
args: List[Node]
|
|
118
|
-
|
|
119
94
|
@dataclass
|
|
120
95
|
class MethodCall(Node):
|
|
121
96
|
instance_name: str
|
|
122
97
|
method_name: str
|
|
123
98
|
args: List[Node]
|
|
124
|
-
|
|
125
99
|
@dataclass
|
|
126
100
|
class PropertyAccess(Node):
|
|
127
101
|
instance_name: str
|
|
128
102
|
property_name: str
|
|
129
|
-
|
|
130
103
|
@dataclass
|
|
131
104
|
class Import(Node):
|
|
132
105
|
path: str
|
|
133
|
-
|
|
134
106
|
@dataclass
|
|
135
107
|
class Try(Node):
|
|
136
108
|
try_body: List[Node]
|
|
137
109
|
catch_var: str
|
|
138
110
|
catch_body: List[Node]
|
|
139
|
-
|
|
140
111
|
@dataclass
|
|
141
112
|
class Lambda(Node):
|
|
142
113
|
params: List[str]
|
|
143
|
-
body: Node
|
|
144
|
-
|
|
114
|
+
body: Node
|
|
145
115
|
@dataclass
|
|
146
116
|
class Ternary(Node):
|
|
147
117
|
condition: Node
|
|
148
118
|
true_expr: Node
|
|
149
119
|
false_expr: Node
|
|
150
|
-
|
|
151
120
|
@dataclass
|
|
152
121
|
class ListComprehension(Node):
|
|
153
122
|
expr: Node
|
|
154
123
|
var_name: str
|
|
155
124
|
iterable: Node
|
|
156
125
|
condition: Optional[Node] = None
|
|
157
|
-
|
|
158
126
|
@dataclass
|
|
159
127
|
class Spread(Node):
|
|
160
128
|
value: Node
|
|
161
|
-
|
|
162
129
|
@dataclass
|
|
163
130
|
class ConstAssign(Node):
|
|
164
131
|
name: str
|
|
165
132
|
value: Node
|
|
166
|
-
|
|
167
133
|
@dataclass
|
|
168
134
|
class ForIn(Node):
|
|
169
135
|
var_name: str
|
|
170
136
|
iterable: Node
|
|
171
137
|
body: List[Node]
|
|
172
|
-
|
|
173
138
|
@dataclass
|
|
174
139
|
class IndexAccess(Node):
|
|
175
140
|
obj: Node
|
|
176
141
|
index: Node
|
|
177
|
-
|
|
178
142
|
@dataclass
|
|
179
143
|
class Stop(Node):
|
|
180
|
-
"""Break out of loop"""
|
|
181
144
|
pass
|
|
182
|
-
|
|
183
145
|
@dataclass
|
|
184
146
|
class Skip(Node):
|
|
185
|
-
"""Continue to next iteration"""
|
|
186
147
|
pass
|
|
187
|
-
|
|
188
148
|
@dataclass
|
|
189
149
|
class When(Node):
|
|
190
|
-
"""Pattern matching - when x is value1 => ... otherwise => ..."""
|
|
191
150
|
value: Node
|
|
192
|
-
cases: List[tuple[Node, List[Node]]]
|
|
151
|
+
cases: List[tuple[Node, List[Node]]]
|
|
193
152
|
otherwise: Optional[List[Node]] = None
|
|
194
|
-
|
|
195
153
|
@dataclass
|
|
196
154
|
class Throw(Node):
|
|
197
|
-
"""Throw an error - error 'message'"""
|
|
198
155
|
message: Node
|
|
199
|
-
|
|
200
156
|
@dataclass
|
|
201
157
|
class TryAlways(Node):
|
|
202
|
-
"""Try with always block - try ... catch ... always ..."""
|
|
203
158
|
try_body: List[Node]
|
|
204
159
|
catch_var: str
|
|
205
160
|
catch_body: List[Node]
|
|
206
161
|
always_body: List[Node]
|
|
207
|
-
|
|
208
162
|
@dataclass
|
|
209
163
|
class Unless(Node):
|
|
210
|
-
"""Negative if - unless condition"""
|
|
211
164
|
condition: Node
|
|
212
165
|
body: List[Node]
|
|
213
166
|
else_body: Optional[List[Node]] = None
|
|
214
|
-
|
|
215
167
|
@dataclass
|
|
216
168
|
class Execute(Node):
|
|
217
|
-
"""Execute code from string - execute 'say hello'"""
|
|
218
169
|
code: Node
|
|
219
|
-
|
|
220
170
|
@dataclass
|
|
221
171
|
class Repeat(Node):
|
|
222
|
-
"""Simple repeat loop - repeat 5 times"""
|
|
223
172
|
count: Node
|
|
224
173
|
body: List[Node]
|
|
225
|
-
|
|
226
174
|
@dataclass
|
|
227
175
|
class ImportAs(Node):
|
|
228
|
-
"""Import with alias - use 'math' as m"""
|
|
229
176
|
path: str
|
|
230
177
|
alias: str
|
|
231
|
-
|
|
232
178
|
@dataclass
|
|
233
179
|
class Until(Node):
|
|
234
|
-
"""Loop until condition - until done"""
|
|
235
180
|
condition: Node
|
|
236
181
|
body: List[Node]
|
|
237
|
-
|
|
238
182
|
@dataclass
|
|
239
183
|
class Forever(Node):
|
|
240
|
-
"""Infinite loop - forever"""
|
|
241
184
|
body: List[Node]
|
|
242
|
-
|
|
243
185
|
@dataclass
|
|
244
186
|
class Exit(Node):
|
|
245
|
-
"""Exit program - exit or exit 1"""
|
|
246
187
|
code: Optional[Node] = None
|
|
247
|
-
|
|
248
188
|
@dataclass
|
|
249
189
|
class Make(Node):
|
|
250
|
-
"""Create object - make Robot or new Robot"""
|
|
251
190
|
class_name: str
|
|
252
191
|
args: List[Node]
|
|
253
|
-
|
|
254
192
|
@dataclass
|
|
255
193
|
class FileWatcher(Node):
|
|
256
|
-
"""File watcher - on file_change 'path' ..."""
|
|
257
194
|
path: Node
|
|
258
195
|
body: List[Node]
|
|
259
|
-
|
|
260
|
-
# --- New GUI Nodes ---
|
|
261
196
|
@dataclass
|
|
262
197
|
class Alert(Node):
|
|
263
198
|
message: Node
|
|
264
|
-
|
|
265
199
|
@dataclass
|
|
266
200
|
class Prompt(Node):
|
|
267
201
|
prompt: Node
|
|
268
|
-
|
|
269
202
|
@dataclass
|
|
270
203
|
class Confirm(Node):
|
|
271
204
|
prompt: Node
|
|
272
|
-
|
|
273
|
-
# --- Async Nodes ---
|
|
274
205
|
@dataclass
|
|
275
206
|
class Spawn(Node):
|
|
276
207
|
call: Node
|
|
277
|
-
|
|
278
208
|
@dataclass
|
|
279
209
|
class Await(Node):
|
|
280
210
|
task: Node
|
|
281
|
-
|
|
282
211
|
@dataclass
|
|
283
212
|
class ProgressLoop(Node):
|
|
284
|
-
|
|
285
|
-
loop_node: Node # The underlying loop (For or ForIn or Repeat)
|
|
286
|
-
|
|
213
|
+
loop_node: Node
|
|
287
214
|
@dataclass
|
|
288
215
|
class Convert(Node):
|
|
289
|
-
"""convert x to json"""
|
|
290
216
|
expression: Node
|
|
291
217
|
target_format: str
|
|
292
|
-
|
|
293
218
|
@dataclass
|
|
294
219
|
class Listen(Node):
|
|
295
|
-
"""listen on port 8000"""
|
|
296
220
|
port: Node
|
|
297
|
-
|
|
298
221
|
@dataclass
|
|
299
222
|
class OnRequest(Node):
|
|
300
|
-
|
|
301
|
-
path: Node # or pattern
|
|
223
|
+
path: Node
|
|
302
224
|
body: List[Node]
|
|
303
|
-
|
|
304
225
|
@dataclass
|
|
305
226
|
class Every(Node):
|
|
306
|
-
"""every 5 minutes ..."""
|
|
307
227
|
interval: Node
|
|
308
|
-
unit: str
|
|
228
|
+
unit: str
|
|
309
229
|
body: List[Node]
|
|
310
|
-
|
|
311
230
|
@dataclass
|
|
312
231
|
class After(Node):
|
|
313
|
-
"""in 5 minutes ..."""
|
|
314
232
|
delay: Node
|
|
315
233
|
unit: str
|
|
316
234
|
body: List[Node]
|
|
317
|
-
|
|
318
235
|
@dataclass
|
|
319
236
|
class ServeStatic(Node):
|
|
320
237
|
folder: Node
|
|
321
238
|
url: Node
|
|
322
|
-
|
|
323
239
|
@dataclass
|
|
324
240
|
class Download(Node):
|
|
325
241
|
url: Node
|
|
326
|
-
|
|
327
242
|
@dataclass
|
|
328
243
|
class ArchiveOp(Node):
|
|
329
|
-
op: str
|
|
244
|
+
op: str
|
|
330
245
|
source: Node
|
|
331
246
|
target: Node
|
|
332
|
-
|
|
333
247
|
@dataclass
|
|
334
248
|
class CsvOp(Node):
|
|
335
|
-
op: str
|
|
249
|
+
op: str
|
|
336
250
|
data: Optional[Node]
|
|
337
251
|
path: Node
|
|
338
|
-
|
|
339
252
|
@dataclass
|
|
340
253
|
class ClipboardOp(Node):
|
|
341
|
-
op: str
|
|
342
|
-
content: Optional[Node]
|
|
343
|
-
|
|
254
|
+
op: str
|
|
255
|
+
content: Optional[Node]
|
|
344
256
|
@dataclass
|
|
345
257
|
class AutomationOp(Node):
|
|
346
|
-
action: str
|
|
258
|
+
action: str
|
|
347
259
|
args: List[Node]
|
|
348
|
-
|
|
349
260
|
@dataclass
|
|
350
261
|
class DateOp(Node):
|
|
351
|
-
expr: str
|
|
352
|
-
|
|
262
|
+
expr: str
|
|
353
263
|
@dataclass
|
|
354
264
|
class FileWrite(Node):
|
|
355
|
-
"""write 'text' to file 'path' (mode='w') or append (mode='a')"""
|
|
356
265
|
path: Node
|
|
357
266
|
content: Node
|
|
358
|
-
mode: str
|
|
359
|
-
|
|
267
|
+
mode: str
|
|
360
268
|
@dataclass
|
|
361
269
|
class FileRead(Node):
|
|
362
|
-
"""read file 'path'"""
|
|
363
270
|
path: Node
|
|
364
|
-
|
|
365
271
|
@dataclass
|
|
366
272
|
class DatabaseOp(Node):
|
|
367
|
-
"""db open 'path', db query 'sql', etc."""
|
|
368
273
|
op: str
|
|
369
274
|
args: List[Node]
|
shell_lite/cli.py
ADDED