-
Notifications
You must be signed in to change notification settings - Fork 67
Expand file tree
/
Copy pathcollection.py
More file actions
executable file
·464 lines (412 loc) · 25.5 KB
/
collection.py
File metadata and controls
executable file
·464 lines (412 loc) · 25.5 KB
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
# encoding: utf-8
r"""
A full summary of all nodes.
+---------------------+--------------------+----------------+------------------------------+
| Name | Children | Example | Description |
+=====================+====================+================+==============================+
| All | | `:` | Colon operator w/o range |
+---------------------+--------------------+----------------+------------------------------+
| Assign | `Expr Expr` | `a=b` | Assignment one var |
+---------------------+--------------------+----------------+------------------------------+
| Assigns | `Expr Expr+` | `[a,b]=c` | Assignment multi vars |
+---------------------+--------------------+----------------+------------------------------+
| Band | `Expr Expr+` | `a&b` | Binary AND operator |
+---------------------+--------------------+----------------+------------------------------+
| Bcomment | | `%{ . %}` | Block comment |
+---------------------+--------------------+----------------+------------------------------+
| Block | `Line*` | `a` | Code block |
+---------------------+--------------------+----------------+------------------------------+
| Bor | `Expr Expr+` | `a|b` | Binary OR operator |
+---------------------+--------------------+----------------+------------------------------+
| Branch | `If Ifse* Else?` | `if a; end` | If chain container |
+---------------------+--------------------+----------------+------------------------------+
| Break | | `break` | Break statement |
+---------------------+--------------------+----------------+------------------------------+
| Case | `Var Block` | `case a` | Case part of Switch |
+---------------------+--------------------+----------------+------------------------------+
| Catch | `Block` | `catch a` | Catch part of Tryblock |
+---------------------+--------------------+----------------+------------------------------+
| Cell | `Expr*` | `{a}` | Cell array |
+---------------------+--------------------+----------------+------------------------------+
| Cget | `Expr+` | `a{b}(c)` | Cell retrival |
+---------------------+--------------------+----------------+------------------------------+
| Colon | `Expr Expr Expr?` | `a:b` | Colon operator w range |
+---------------------+--------------------+----------------+------------------------------+
| Counter | | | Struct array size |
+---------------------+--------------------+----------------+------------------------------+
| Cset | `Expr+` | `a{b}(c)=d` | Cell array assignment |
+---------------------+--------------------+----------------+------------------------------+
| Ctranspose | `Expr` | `a'` | Complex transform |
+---------------------+--------------------+----------------+------------------------------+
| Cvar | `Expr+` | `a{b}` | Cell variable |
+---------------------+--------------------+----------------+------------------------------+
| Declares | `Var*` | | Declared variable list |
+---------------------+--------------------+----------------+------------------------------+
| Ecomment | | `a%b` | End-of-line comment |
+---------------------+--------------------+----------------+------------------------------+
| Elementdivision | `Expr Expr+` | `a./b` | Sclars division |
+---------------------+--------------------+----------------+------------------------------+
| Elexp | `Expr Expr+` | `a.^b` | Element-wise exponent |
+---------------------+--------------------+----------------+------------------------------+
| Elif | `Expr Block` | `elseif a` | Else-if part of Branch |
+---------------------+--------------------+----------------+------------------------------+
| Elmul | `Expr Expr+` | `a.*b` | Element-wise multiplication |
+---------------------+--------------------+----------------+------------------------------+
| Else | `Block` | `else` | Else part of Branch |
+---------------------+--------------------+----------------+------------------------------+
| End | | `end` | End-expression |
+---------------------+--------------------+----------------+------------------------------+
| Eq | `Expr Expr` | `a==b` | Equallity sign |
+---------------------+--------------------+----------------+------------------------------+
| Error | | | Error node |
+---------------------+--------------------+----------------+------------------------------+
| Exp | `Expr Expr+` | `a^b` | Exponential operator |
+---------------------+--------------------+----------------+------------------------------+
| Fget | `Expr*` | `a.b(c)` | Fieldarray retrival |
+---------------------+--------------------+----------------+------------------------------+
| Float | | `4.` | Float-point number |
+---------------------+--------------------+----------------+------------------------------+
| For | `Var Expr Block` | `for a=b;end` | For-loop container |
+---------------------+--------------------+----------------+------------------------------+
| Fset | `Expr Expr+` | `a.b(c)=d` | Fieldname assignment |
+---------------------+--------------------+----------------+------------------------------+
| Func | `Declares Returns` | `function f()` | Function container |
| | `Params Block` | `end` | |
+---------------------+--------------------+----------------+------------------------------+
| Funcs | `[Main Func+]` | | Root of all functions |
+---------------------+--------------------+----------------+------------------------------+
| Fvar | | `a.b` | Fieldname variable |
+---------------------+--------------------+----------------+------------------------------+
| Ge | `Expr Expr` | `a>=b` | Greater-or-equal operator |
+---------------------+--------------------+----------------+------------------------------+
| Get | `Expr*` | `a(b)` | Function or retrival |
+---------------------+--------------------+----------------+------------------------------+
| Gt | `Expr Expr` | `a>b` | Greater operator |
+---------------------+--------------------+----------------+------------------------------+
| Header | | | File header element |
+---------------------+--------------------+----------------+------------------------------+
| Headers | | | Collection header lines |
+---------------------+--------------------+----------------+------------------------------+
| If | `Expr Block` | `if a` | If part of Branch |
+---------------------+--------------------+----------------+------------------------------+
| Imag | | `i` | Imaginary unit |
+---------------------+--------------------+----------------+------------------------------+
| Include | | | Include statement |
+---------------------+--------------------+----------------+------------------------------+
| Includes | | | Collection of includes |
+---------------------+--------------------+----------------+------------------------------+
| Int | | `1` | Integer value |
+---------------------+--------------------+----------------+------------------------------+
| Lambda | | `f=@()1` | Lambda function expression |
+---------------------+--------------------+----------------+------------------------------+
| Land | `Expr Expr+` | `a&&b` | Logical AND operator |
+---------------------+--------------------+----------------+------------------------------+
| Lcomment | | `%a` | Line-comment |
+---------------------+--------------------+----------------+------------------------------+
| Le | `Expr Expr` | `a<=b` | Less-or-equal operator |
+---------------------+--------------------+----------------+------------------------------+
| Leftelementdivision | `Expr Expr+` | `a.\b` | Left sclar division |
+---------------------+--------------------+----------------+------------------------------+
| Leftmatrixdivision | `Expr Expr+` | `a\b` | Left matrix division |
+---------------------+--------------------+----------------+------------------------------+
| Log | `[Error Warning]+` | | Collection of Errors |
+---------------------+--------------------+----------------+------------------------------+
| Lor | `Expr Expr` | `a||b` | Logical OR operator |
+---------------------+--------------------+----------------+------------------------------+
| Lt | `Expr Expr` | `a<b` | Less-then operator |
+---------------------+--------------------+----------------+------------------------------+
| Main | `Declares Returns` | `function f()` | Container for |
| | `Params Block` | `end` | main function |
+---------------------+--------------------+----------------+------------------------------+
| Matrix | `Vector*` | `[a]` | Matrix container |
+---------------------+--------------------+----------------+------------------------------+
| Matrixdivision | `Expr Expr+` | `a/b` | Matrix division |
+---------------------+--------------------+----------------+------------------------------+
| Minus | `Expr Expr+` | `a-b` | Minus operator |
+---------------------+--------------------+----------------+------------------------------+
| Mul | `Expr Expr+` | `a*b` | Multiplication operator |
+---------------------+--------------------+----------------+------------------------------+
| Ne | `Expr Expr` | `a~=b` | Not-equal operator |
+---------------------+--------------------+----------------+------------------------------+
| Neg | `Expr` | `-a` | Unary negative sign |
+---------------------+--------------------+----------------+------------------------------+
| Nget | `Expr` | `a.(b)` | Namefield retrival |
+---------------------+--------------------+----------------+------------------------------+
| Not | `Expr` | `~a` | Not operator |
+---------------------+--------------------+----------------+------------------------------+
| Nset | `Expr` | `a.(b)=c` | Namefield assignment |
+---------------------+--------------------+----------------+------------------------------+
| Otherwise | `Block` | `otherwise` | Otherwise part of Switch |
+---------------------+--------------------+----------------+------------------------------+
| Params | `Var*` | | Function parameter container |
+---------------------+--------------------+----------------+------------------------------+
| Parfor | `Var Expr Block` | `parfor a=b;end`| Parallel for-loop container |
+---------------------+--------------------+----------------+------------------------------+
| Plus | `Expr Expr+` | `a+b` | Addition operator |
+---------------------+--------------------+----------------+------------------------------+
| Pragma_for | | `%%PARFOR str` | For-loop pragma |
+---------------------+--------------------+----------------+------------------------------+
| Program | `Includes Funcs` | | Program root |
| | `Inlines Structs` | | |
| | `Headers Log` | | |
+---------------------+--------------------+----------------+------------------------------+
| Project | `Program+` | | Root of all programs |
+---------------------+--------------------+----------------+------------------------------+
| Return | | `return` | Return statement |
+---------------------+--------------------+----------------+------------------------------+
| Returns | `Var*` | | Return value collection |
+---------------------+--------------------+----------------+------------------------------+
| Set | `Expr*` | `a(b)=c` | Array value assignment |
+---------------------+--------------------+----------------+------------------------------+
| Sget | `Expr+` | `a.b(c)` | Submodule function/retrival |
+---------------------+--------------------+----------------+------------------------------+
| Sset | `Expr+` | `a.b(c)=d` | Submodule assignment |
+---------------------+--------------------+----------------+------------------------------+
| Statement | `Expr` | `a` | Stand alone statement |
+---------------------+--------------------+----------------+------------------------------+
| String | | `'a'` | String representation |
+---------------------+--------------------+----------------+------------------------------+
| Struct | | | Struct container |
+---------------------+--------------------+----------------+------------------------------+
| Structs | | | Container for structs |
+---------------------+--------------------+----------------+------------------------------+
| Switch | `Var Case+ Other` | `case a; end` | Container for Switch branch |
+---------------------+--------------------+----------------+------------------------------+
| Transpose | `Expr` | `a'` | Transpose operator |
+---------------------+--------------------+----------------+------------------------------+
| Try | `Block` | `try` | Try part of Tryblock |
+---------------------+--------------------+----------------+------------------------------+
| Tryblock | `Try Catch` | `try; end` | Container for try-blocks |
+---------------------+--------------------+----------------+------------------------------+
| Var | | `a` | Variable |
+---------------------+--------------------+----------------+------------------------------+
| Vector | `Expr*` | `[a]` | Row-vector part of Matrix |
+---------------------+--------------------+----------------+------------------------------+
| Warning | | | Element in Log |
+---------------------+--------------------+----------------+------------------------------+
| While | `Expr Block` | `while a;end` | While-loop container |
+---------------------+--------------------+----------------+------------------------------+
"""
from .node import Node
__all__ = [
"All", "Assign", "Assigns", "Band", "Bcomment", "Block", "Bor", "Branch",
"Break", "Case", "Catch", "Cell", "Cget", "Colon",
"Counter", "Cset", "Ctranspose", "Cvar",
"Declares", "Ecomment",
"Elementdivision", "Elexp", "Elif", "Elmul", "Else", "End", "Eq", "Error",
"Exp", "Expr", "Fget", "Float", "Parfor", "Pragma_for", "For", "Fset", "Func", "Funcs", "Fvar", "Ge",
"Get", "Gt", "Header", "Headers", "If", "Imag", "Include", "Includes", "Inline",
"Inlines", "Int", "Lambda", "Land", "Lcomment", "Le", "Leftelementdivision",
"Leftmatrixdivision", "Log", "Lor", "Lt", "Main", "Matrix", "Matrixdivision",
"Minus", "Mul", "Ne", "Neg", "Nget", "Not", "Nset", "Opr", "Otherwise",
"Params", "Paren", "Plus", "Program", "Project", "Resize", "Return", "Returns",
"Set", "Sget", "Sset", "Statement", "String", "Struct", "Structs", "Switch",
"Transpose", "Try", "Tryblock", "Var", "Vector", "Warning", "While"
]
class Project(Node):
def __init__(self, name="", cur=0, line=0, code="", **kws):
"""
Root of the node tree. Every other node should inherant from this one.
This node should not recieve `parent` argument node during construction.
Children:
`Program+`
All keyword arguments are passed to `matlab2cpp.Node.__init__`.
"""
assert "parent" not in kws
self.parent = self
self._program = self
Node.__init__(self, self, name=name, cur=cur,
line=line, code=code, **kws)
class Program(Node):
def __init__(self, parent, name, **kws):
"""
Represents one stand-alone script or program. Each child represents the various
aspects of script/program.
Children:
`Includes Funcs Inlines Structs Headers Log`
All keyword arguments are passed to `matlab2cpp.Node.__init__`.
"""
self._program = self
Node.__init__(self, parent, name=name, **kws)
class Includes(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Funcs(Node):
def __init__(self, parent, line=1, **kws):
Node.__init__(self, parent, line=line, **kws)
class Inlines(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Structs(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Headers(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Log(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Header(Node):
def __init__(self, parent, name, **kws):
Node.__init__(self, parent, name=name, **kws)
class Main(Node):
def __init__(self, parent, name="main", **kws):
Node.__init__(self, parent, name=name, **kws)
class Error(Node):
def __init__(self, parent, name, value, **kws):
Node.__init__(self, parent, name, value=value, **kws)
self.prop["cls"] = name[10:]
class Warning(Node):
def __init__(self, parent, name, value, **kws):
Node.__init__(self, parent, name, value=value, **kws)
self.prop["cls"] = name[10:]
class Counter(Node):
def __init__(self, parent, name, value, **kws):
Node.__init__(self, parent, name,
value=value, **kws)
class Inline(Node):
def __init__(self, parent, name, **kws):
Node.__init__(self, parent, name, **kws)
class Include(Includes):
def __init__(self, parent, name, **kws):
Node.__init__(self, parent, name=name, **kws)
class Struct(Structs): pass
class Func(Node): pass
class Returns(Node): pass
class Params(Node): pass
class Declares(Node): pass
class Block(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Parfor(Block): pass
class For(Block): pass
class While(Block): pass
class Switch(Block): pass
class Case(Block): pass
class Otherwise(Block): pass
class Branch(Block): pass
class If(Block): pass
class Elif(Block): pass
class Else(Block): pass
class Tryblock(Block): pass
class Try(Block): pass
class Catch(Block): pass
class Statement(Block): pass
class Assign(Node): pass
class Assigns(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Expr(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Opr(Expr): pass
class Exp(Opr): pass
class Elexp(Opr): pass
class Mul(Opr): pass
class Minus(Opr): pass
class Elmul(Opr): pass
class Matrixdivision(Opr): pass
class Elementdivision(Opr): pass
class Leftmatrixdivision(Opr): pass
class Leftelementdivision(Opr): pass
class Plus(Opr): pass
class Colon(Opr): pass
class Gt(Opr): pass
class Ge(Opr): pass
class Lt(Opr): pass
class Le(Opr): pass
class Ne(Opr): pass
class Eq(Opr): pass
class Band(Opr): pass
class Bor(Opr): pass
class Land(Opr): pass
class Lor(Opr): pass
class Matrix(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Vector(Matrix): pass
class Cell(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Paren(Expr): pass
class Neg(Expr): pass
class Not(Expr): pass
class Ctranspose(Expr): pass
class Transpose(Expr): pass
class All(Expr): pass
class End(Expr): pass
class Break(Expr): pass
class Return(Expr): pass
class Int(Node):
def __init__(self, parent, value, **kws):
Node.__init__(self, parent, value=value, **kws)
class Float(Node):
def __init__(self, parent, value, **kws):
if value[0] == ".": value = "0" + value
Node.__init__(self, parent, value=value, **kws)
class Imag(Node):
def __init__(self, parent, value, **kws):
Node.__init__(self, parent, value=value, **kws)
class String(Node):
def __init__(self, parent, value, **kws):
value = value.replace("%", "__percent__")
Node.__init__(self, parent, value=value, **kws)
class Lambda(Node):
def __init__(self, parent, name="", **kws):
Node.__init__(self, parent, name=name, **kws)
class Pragma_for(Node):
def __init__(self, parent, value, **kws):
Node.__init__(self, parent, value=value, **kws)
class Lcomment(Node):
def __init__(self, parent, value, **kws):
value = value.replace("%", "__percent__")
Node.__init__(self, parent, value=value, **kws)
class Bcomment(Node):
def __init__(self, parent, value, **kws):
value = value.replace("%", "__percent__")
Node.__init__(self, parent, value=value, **kws)
class Ecomment(Node):
def __init__(self, parent, value, **kws):
value = value.replace("%", "__percent__")
Node.__init__(self, parent, value=value, **kws)
class Var(Node):
def __init__(self, parent, name, **kws):
Node.__init__(self, parent, name=name, **kws)
class Get(Var): pass
class Set(Var): pass
class Fvar(Node):
def __init__(self, parent, name, value, **kws):
Node.__init__(self, parent, name=name, value=value, **kws)
class Cvar(Node):
def __init__(self, parent, name, **kws):
Node.__init__(self, parent, name, **kws)
class Cget(Node):
def __init__(self, parent, name, **kws):
Node.__init__(self, parent, name=name, **kws)
class Fget(Node):
def __init__(self, parent, name, value, **kws):
Node.__init__(self, parent, name=name, value=value, **kws)
class Sget(Node):
def __init__(self, parent, name, value, **kws):
Node.__init__(self, parent, name=name, value=value, **kws)
class Nget(Node):
def __init__(self, parent, name, **kws):
Node.__init__(self, parent, name=name, **kws)
class Cset(Node):
def __init__(self, parent, name, **kws):
Node.__init__(self, parent, name=name, **kws)
class Fset(Node):
def __init__(self, parent, name, value, **kws):
Node.__init__(self, parent, name=name, value=value, **kws)
class Sset(Node):
def __init__(self, parent, name, value, **kws):
Node.__init__(self, parent, name=name, value=value, **kws)
class Nset(Node):
def __init__(self, parent, name, **kws):
Node.__init__(self, parent, name=name, **kws)
class Resize(Node):
def __init__(self, parent, **kws):
Node.__init__(self, parent, **kws)
class Verbatim(Node):
def __init__(self, parent, name, value, **kws):
Node.__init__(self, parent, name=name, value=value, **kws)