(self, name: str)
| 2386 | return Node(NodeKind.OP_ASSIGN, elem.ntype, '=', acc_node, elem) |
| 2387 | |
| 2388 | def array_declaration(self, name: str) -> Node: |
| 2389 | root = None |
| 2390 | elems = [] |
| 2391 | |
| 2392 | while self.curr_token().kind != TokenKind.RBRACE: |
| 2393 | token = self.match_token_from( |
| 2394 | (TokenKind.INT_LIT, TokenKind.CHAR_LIT, TokenKind.IDENT)) |
| 2395 | |
| 2396 | if self.curr_token().kind != TokenKind.RBRACE: |
| 2397 | self.match_token(TokenKind.COMMA) |
| 2398 | |
| 2399 | elems.append(token) |
| 2400 | |
| 2401 | arr = Def.arr_map[name] |
| 2402 | if len(elems) > arr.elem_cnt: |
| 2403 | print_error('array_declaration', |
| 2404 | f'Array {name} can only hold {arr.elem_cnt} elements', self) |
| 2405 | |
| 2406 | elems.reverse() |
| 2407 | nodes = list(map(self.to_node, elems)) |
| 2408 | |
| 2409 | idx = 0 |
| 2410 | arr_node = Node(NodeKind.IDENT, type_of_ident(name), name) |
| 2411 | |
| 2412 | if len(nodes) == 1: |
| 2413 | root = self.array_elem_declaration(arr_node, nodes.pop(), 0) |
| 2414 | else: |
| 2415 | while len(nodes) > 0: |
| 2416 | if root is None: |
| 2417 | node = nodes.pop() |
| 2418 | node2 = nodes.pop() |
| 2419 | root = Node(NodeKind.GLUE, void_ckind, '', self.array_elem_declaration( |
| 2420 | arr_node, node, idx), self.array_elem_declaration(arr_node, node2, idx + 1)) |
| 2421 | idx += 2 |
| 2422 | else: |
| 2423 | node = nodes.pop() |
| 2424 | root = Node( |
| 2425 | NodeKind.GLUE, void_ckind, '', root, self.array_elem_declaration(arr_node, node, idx)) |
| 2426 | idx += 1 |
| 2427 | |
| 2428 | return root |
| 2429 | |
| 2430 | def heredoc_declaration(self): |
| 2431 | self.next_line() |
no test coverage detected