@ ProgramNode (location: (0...109)) ├── locals: [] └── statements: @ StatementsNode (location: (0...109)) └── body: (length: 6) ├── @ UntilNode (location: (0...18)) │ ├── keyword_loc: (0...5) = "until" │ ├── closing_loc: (15...18) = "end" │ ├── predicate: │ │ @ TrueNode (location: (6...10)) │ ├── statements: │ │ @ StatementsNode (location: (12...13)) │ │ └── body: (length: 1) │ │ └── @ IntegerNode (location: (12...13)) │ │ └── flags: decimal │ └── flags: ∅ ├── @ UntilNode (location: (20...32)) │ ├── keyword_loc: (22...27) = "until" │ ├── closing_loc: ∅ │ ├── predicate: │ │ @ TrueNode (location: (28...32)) │ ├── statements: │ │ @ StatementsNode (location: (20...21)) │ │ └── body: (length: 1) │ │ └── @ IntegerNode (location: (20...21)) │ │ └── flags: decimal │ └── flags: ∅ ├── @ UntilNode (location: (34...50)) │ ├── keyword_loc: (40...45) = "until" │ ├── closing_loc: ∅ │ ├── predicate: │ │ @ TrueNode (location: (46...50)) │ ├── statements: │ │ @ StatementsNode (location: (34...39)) │ │ └── body: (length: 1) │ │ └── @ BreakNode (location: (34...39)) │ │ ├── arguments: ∅ │ │ └── keyword_loc: (34...39) = "break" │ └── flags: ∅ ├── @ UntilNode (location: (52...67)) │ ├── keyword_loc: (57...62) = "until" │ ├── closing_loc: ∅ │ ├── predicate: │ │ @ TrueNode (location: (63...67)) │ ├── statements: │ │ @ StatementsNode (location: (52...56)) │ │ └── body: (length: 1) │ │ └── @ NextNode (location: (52...56)) │ │ ├── arguments: ∅ │ │ └── keyword_loc: (52...56) = "next" │ └── flags: ∅ ├── @ UntilNode (location: (69...86)) │ ├── keyword_loc: (76...81) = "until" │ ├── closing_loc: ∅ │ ├── predicate: │ │ @ TrueNode (location: (82...86)) │ ├── statements: │ │ @ StatementsNode (location: (69...75)) │ │ └── body: (length: 1) │ │ └── @ ReturnNode (location: (69...75)) │ │ ├── keyword_loc: (69...75) = "return" │ │ └── arguments: ∅ │ └── flags: ∅ └── @ UntilNode (location: (88...109)) ├── keyword_loc: (99...104) = "until" ├── closing_loc: ∅ ├── predicate: │ @ CallNode (location: (105...109)) │ ├── receiver: ∅ │ ├── call_operator_loc: ∅ │ ├── message_loc: (105...109) = "bar?" │ ├── opening_loc: ∅ │ ├── arguments: ∅ │ ├── closing_loc: ∅ │ ├── block: ∅ │ ├── flags: ∅ │ └── name: "bar?" ├── statements: │ @ StatementsNode (location: (88...98)) │ └── body: (length: 1) │ └── @ CallNode (location: (88...98)) │ ├── receiver: ∅ │ ├── call_operator_loc: ∅ │ ├── message_loc: (88...91) = "foo" │ ├── opening_loc: ∅ │ ├── arguments: │ │ @ ArgumentsNode (location: (92...98)) │ │ └── arguments: (length: 2) │ │ ├── @ SymbolNode (location: (92...94)) │ │ │ ├── opening_loc: (92...93) = ":" │ │ │ ├── value_loc: (93...94) = "a" │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "a" │ │ └── @ SymbolNode (location: (96...98)) │ │ ├── opening_loc: (96...97) = ":" │ │ ├── value_loc: (97...98) = "b" │ │ ├── closing_loc: ∅ │ │ └── unescaped: "b" │ ├── closing_loc: ∅ │ ├── block: ∅ │ ├── flags: ∅ │ └── name: "foo" └── flags: ∅