| 654 | |
| 655 | |
| 656 | def RunAtomicCode(env, node, output): |
| 657 | if isinstance(node, VarNode): |
| 658 | identifier = node.identifier.value.strip() |
| 659 | result = Output() |
| 660 | RunAtomicCode(env.Clone(), node.atomic_code, result) |
| 661 | value = result.string |
| 662 | env.PushVariable(identifier, value) |
| 663 | elif isinstance(node, RangeNode): |
| 664 | identifier = node.identifier.value.strip() |
| 665 | lower = int(env.EvalExp(node.exp1)) |
| 666 | upper = int(env.EvalExp(node.exp2)) |
| 667 | env.PushRange(identifier, lower, upper) |
| 668 | elif isinstance(node, ForNode): |
| 669 | identifier = node.identifier.value.strip() |
| 670 | if node.sep is None: |
| 671 | sep = '' |
| 672 | else: |
| 673 | sep = node.sep.value |
| 674 | (lower, upper) = env.GetRange(identifier) |
| 675 | for i in range(lower, upper + 1): |
| 676 | new_env = env.Clone() |
| 677 | new_env.PushVariable(identifier, i) |
| 678 | RunCode(new_env, node.code, output) |
| 679 | if i != upper: |
| 680 | output.Append(sep) |
| 681 | elif isinstance(node, RawCodeNode): |
| 682 | output.Append(node.raw_code.value) |
| 683 | elif isinstance(node, IfNode): |
| 684 | cond = env.EvalExp(node.exp) |
| 685 | if cond: |
| 686 | RunCode(env.Clone(), node.then_branch, output) |
| 687 | elif node.else_branch is not None: |
| 688 | RunCode(env.Clone(), node.else_branch, output) |
| 689 | elif isinstance(node, ExpNode): |
| 690 | value = env.EvalExp(node) |
| 691 | output.Append('%s' % (value,)) |
| 692 | elif isinstance(node, LiteralDollarNode): |
| 693 | output.Append('$') |
| 694 | elif isinstance(node, CodeNode): |
| 695 | RunCode(env.Clone(), node, output) |
| 696 | else: |
| 697 | print 'BAD' |
| 698 | print node |
| 699 | sys.exit(1) |
| 700 | |
| 701 | |
| 702 | def RunCode(env, code_node, output): |