@@ -130,34 +130,35 @@ def _parse_expr_or_assign(self, idx: int) -> tuple[AnyNode, int]:
130130 raise self .err (f"Expected semicolon at end of expr, "
131131 f"got { self [idx ].name } " , self [idx ])
132132
133- def _parse_decl (self , start : int ):
134- idx = start
135- if self .matches (idx , KwdM ('let' )):
136- scope_type = DeclScope_Let
137- elif self .matches (idx , KwdM ('global' )):
138- scope_type = DeclScope_Global
139- else :
140- assert 0 , "Unknown decl scope"
141- scope = scope_type .of (self [idx ])
142- idx += 1
143- if isinstance (self [idx ], LSqBracket ):
144- sqb_start = idx
145- idx += 1
146- if not isinstance (self [idx ], RSqBracket ):
147- raise self .err ("Expected ']' after '[' in list decl" , self [idx ])
148- idx += 1
149- tp_node = DeclType_List (self .tok_region (sqb_start , idx ))
150- else :
151- loc = self [idx - 1 ].region .end # Have to give region, so say char after 'let'
152- tp_node = DeclType_Variable (StrRegion (loc , loc ))
153- decl_items , idx = self ._parse_decl_item_list (idx )
133+ def _parse_decl (self , idx : int ): # e.g. global [] foo=bar, ...;
134+ scope , idx = self ._parse_decl_scope (idx ) # ~~~~~^ ^^ ~~^~~~~~~~~~
135+ tp_node , idx = self ._parse_decl_sqb_or (idx ) # ~/ |
136+ decl_items , idx = self ._parse_decl_item_list (idx ) # ~~~/
154137 if not self .matches (idx , SemicolonToken ):
155138 raise self .err (f"Expected ';' or ',' after decl_item,"
156139 f" got { self [idx ].name } " , self [idx ])
157140 idx += 1
158141 return self .node_from_children (DeclNode , [scope , tp_node , decl_items ]), idx
159142
160- def _parse_decl_item_list (self , idx ):
143+ def _parse_decl_scope (self , idx : int ) -> tuple [AnyNode , int ]:
144+ if self .matches (idx , KwdM ('let' )):
145+ return DeclScope_Let .of (self [idx ]), idx + 1
146+ if self .matches (idx , KwdM ('global' )):
147+ return DeclScope_Global .of (self [idx ]), idx + 1
148+ assert 0 , "Unknown decl scope"
149+
150+ def _parse_decl_sqb_or (self , idx : int ) -> tuple [AnyNode , int ]:
151+ if not isinstance (self [idx ], LSqBracket ):
152+ loc = self [idx - 1 ].region .end # Have to give region, so say char after 'let'
153+ return DeclType_Variable (StrRegion (loc , loc )), idx
154+ sqb_start = idx
155+ idx += 1
156+ if not isinstance (self [idx ], RSqBracket ):
157+ raise self .err ("Expected ']' after '[' in list decl (eg. 'let[] a;')" , self [idx ])
158+ idx += 1
159+ return DeclType_List (self .tok_region (sqb_start , idx )), idx
160+
161+ def _parse_decl_item_list (self , idx : int ) -> tuple [AnyNode , int ]:
161162 items = []
162163 while True :
163164 item , idx = self ._parse_decl_item (idx )
0 commit comments