(tokens)
| 501 | |
| 502 | |
| 503 | def ParseAtomicCodeNode(tokens): |
| 504 | def Pop(token_type=None): |
| 505 | return PopToken(tokens, token_type) |
| 506 | |
| 507 | head = PopFront(tokens) |
| 508 | t = head.token_type |
| 509 | if t == 'code': |
| 510 | return RawCodeNode(head) |
| 511 | elif t == '$var': |
| 512 | id_token = Pop('id') |
| 513 | Pop('=') |
| 514 | next = PeekToken(tokens) |
| 515 | if next.token_type == 'exp': |
| 516 | exp_token = Pop() |
| 517 | return VarNode(id_token, ParseExpNode(exp_token)) |
| 518 | Pop('[[') |
| 519 | code_node = ParseCodeNode(tokens) |
| 520 | Pop(']]') |
| 521 | return VarNode(id_token, code_node) |
| 522 | elif t == '$for': |
| 523 | id_token = Pop('id') |
| 524 | next_token = PeekToken(tokens) |
| 525 | if next_token.token_type == 'code': |
| 526 | sep_token = next_token |
| 527 | Pop('code') |
| 528 | else: |
| 529 | sep_token = None |
| 530 | Pop('[[') |
| 531 | code_node = ParseCodeNode(tokens) |
| 532 | Pop(']]') |
| 533 | return ForNode(id_token, sep_token, code_node) |
| 534 | elif t == '$if': |
| 535 | exp_token = Pop('code') |
| 536 | Pop('[[') |
| 537 | code_node = ParseCodeNode(tokens) |
| 538 | Pop(']]') |
| 539 | else_node = ParseElseNode(tokens) |
| 540 | return IfNode(ParseExpNode(exp_token), code_node, else_node) |
| 541 | elif t == '$range': |
| 542 | id_token = Pop('id') |
| 543 | exp1_token = Pop('exp') |
| 544 | Pop('..') |
| 545 | exp2_token = Pop('exp') |
| 546 | return RangeNode(id_token, ParseExpNode(exp1_token), |
| 547 | ParseExpNode(exp2_token)) |
| 548 | elif t == '$id': |
| 549 | return ParseExpNode(Token(head.start + 1, head.end, head.value[1:], 'id')) |
| 550 | elif t == '$($)': |
| 551 | return LiteralDollarNode(head) |
| 552 | elif t == '$': |
| 553 | exp_token = Pop('exp') |
| 554 | return ParseExpNode(exp_token) |
| 555 | elif t == '[[': |
| 556 | code_node = ParseCodeNode(tokens) |
| 557 | Pop(']]') |
| 558 | return code_node |
| 559 | else: |
| 560 | PushFront(tokens, head) |
no test coverage detected