66from .named_node import (NamedLeafCls , NamedNodeCls , NamedSizedNodeCls ,
77 register_corresponding_token )
88
9- __all__ = [
10- "ProgramNode" , "NumberNode" , "StringNode" , "AnyNameLeaf" , "IdentNode" ,
11- "AttrNameNode" , "AutocatNode" , "GetattrNode" , "GetitemNode" , "ParenNode" ,
12- "CallNode" , "CallArgs" , "OperatorNode" , "UnaryOpNode" , "UPlusNode" ,
13- "UMinusNode" , "NotNode" , "BinOpNode" , "AddNode" , "SubNode" , "MulNode" ,
14- "DivNode" , "ModNode" , "PowNode" , "ConcatNode" , "AndNode" , "OrNode" ,
9+ __all__ = [ # Keep these sorted by category
10+ "ProgramNode" , "AnyNullNode" ,
11+ # Atoms
12+ "NumberNode" , "StringNode" , "AnyNameLeaf" , "IdentNode" , "AttrNameNode" ,
13+ "AutocatNode" , # autocat is sorta atom-ish (it is in AST but not in CST?)
14+ # Item chains
15+ "GetattrNode" , "GetitemNode" , "ParenNode" , "CallNode" , "CallArgs" ,
16+ # Operators
17+ "OperatorNode" ,
18+ "UnaryOpNode" , "UPlusNode" , "UMinusNode" , "NotNode" , # Unary operators
19+ # Binary operators
20+ "BinOpNode" , "AddNode" , "SubNode" , "MulNode" , "DivNode" , "ModNode" ,
21+ "PowNode" , "ConcatNode" , "AndNode" , "OrNode" ,
22+ # Comparisons
1523 "ComparisonNode" , "EqNode" , "NeqNode" , "LtNode" , "LeNode" , "GtNode" ,
16- "GeNode" , "NopNode" , "BlockNode" , "ConditionalBlock" , "IfBlock" ,
17- "ElseIfBlock" , "ElseBlock" , "NullElseBlock" , "WhileBlock" , "RepeatBlock" ,
18- "DefineNode" , "ArgsDeclNode" , "ArgDeclNode" , "DeclItemNode" , "LetNode" ,
19- "GlobalNode" , "AssignOpNode" , "AssignNode" , "AddEqNode" , "SubEqNode" ,
20- "MulEqNode" , "DivEqNode" , "ModEqNode" , "PowEqNode" , "ConcatEqNode" ,
21- "AndEqNode" , "OrEqNode" ,
24+ "GeNode" ,
25+
26+ "NopNode" ,
27+ # Blocks
28+ "BlockNode" , "WhileBlock" , "RepeatBlock" ,
29+ # If blocks & related infrastructure
30+ "ConditionalBlock" , "IfBlock" , "ElseIfBlock" , "ElseBlock" , "NullElseBlock" ,
31+ # Function Definitions
32+ "DefineNode" , "ArgsDeclNode" , "ArgDeclNode" ,
33+ # Variable declarations & related infrastructure
34+ "DeclNode" , "DeclItemsList" , "DeclItemNode" ,
35+ "DeclScopeNode" , "DeclScope_Let" , "DeclScope_Global" ,
36+ "DeclTypeNode" , "DeclType_Variable" , "DeclType_List" ,
37+ # Assignment (regular and augmented)
38+ "AssignOpNode" , "AssignNode" ,
39+ "AddEqNode" , "SubEqNode" , "MulEqNode" , "DivEqNode" , "ModEqNode" ,
40+ "PowEqNode" , "ConcatEqNode" , "AndEqNode" , "OrEqNode" ,
2241]
2342
2443
@@ -30,6 +49,11 @@ def statements(self):
3049 return self .children
3150
3251
52+ class AnyNullNode (NamedLeafCls ):
53+ """For nodes whose presence denotes an absence of something in the syntax"""
54+ size = 0 # Name should be set by subclasses
55+
56+
3357# region ---- Expressions ----
3458@register_corresponding_token
3559class NumberNode (NamedLeafCls ):
@@ -305,9 +329,8 @@ def block(self):
305329 return checked_cast (BlockNode , self .children [0 ])
306330
307331
308- class NullElseBlock (NamedLeafCls ):
332+ class NullElseBlock (AnyNullNode ):
309333 name = 'else_null'
310- size = 0
311334
312335
313336class WhileBlock (NamedSizedNodeCls ):
@@ -375,6 +398,7 @@ def ident(self):
375398# endregion
376399
377400
401+ # region ---- Variable Decls ----
378402class DeclItemNode (NamedNodeCls ):
379403 name = 'decl_item' # 1 or 2 (name and optional value)
380404
@@ -389,20 +413,58 @@ def value(self):
389413 return self .children [1 ]
390414
391415
392- class LetNode (NamedNodeCls ):
393- name = 'let_decl' # Varargs
416+ class DeclScopeNode (AnyNullNode ):
417+ pass
418+
419+
420+ # noinspection PyPep8Naming
421+ class DeclScope_Let (DeclScopeNode ):
422+ name = 'scope__let'
423+
424+
425+ # noinspection PyPep8Naming
426+ class DeclScope_Global (DeclScopeNode ):
427+ name = 'scope__global'
428+
429+
430+ class DeclTypeNode (AnyNullNode ):
431+ pass
432+
433+
434+ # noinspection PyPep8Naming
435+ class DeclType_Variable (DeclTypeNode ):
436+ name = 'decl_type__variable'
437+
438+
439+ # noinspection PyPep8Naming
440+ class DeclType_List (DeclTypeNode ):
441+ name = 'decl_type__list'
442+
443+
444+ class DeclNode (NamedSizedNodeCls ):
445+ name = 'var_decl'
446+ size = 3 # scope, type (value/list), decl_list
394447
395448 @property
396- def decls (self ):
397- return cast ( list [ DeclItemNode ] , self .children )
449+ def decl_scope (self ):
450+ return checked_cast ( DeclScopeNode , self .children [ 0 ] )
398451
452+ @property
453+ def decl_type (self ):
454+ return checked_cast (DeclTypeNode , self .children [1 ])
455+
456+ @property
457+ def decl_list (self ):
458+ return cast (DeclItemsList , self .children [2 ])
399459
400- class GlobalNode (NamedNodeCls ):
401- name = 'global_decl' # Varargs
460+
461+ class DeclItemsList (NamedNodeCls ):
462+ name = 'decl_list'
402463
403464 @property
404465 def decls (self ):
405466 return cast (list [DeclItemNode ], self .children )
467+ # endregion
406468
407469
408470# region ---- Assignment-ops ----
0 commit comments