@ ProgramNode (location: (1,0)-(33,14)) ├── locals: [:foo, :ab] └── statements: @ StatementsNode (location: (1,0)-(33,14)) └── body: (length: 16) ├── @ CallNode (location: (1,0)-(1,9)) │ ├── receiver: ∅ │ ├── call_operator_loc: ∅ │ ├── message_loc: (1,0)-(1,3) = "foo" │ ├── opening_loc: ∅ │ ├── arguments: │ │ @ ArgumentsNode (location: (1,4)-(1,9)) │ │ ├── arguments: (length: 1) │ │ │ └── @ RegularExpressionNode (location: (1,4)-(1,9)) │ │ │ ├── opening_loc: (1,4)-(1,5) = "/" │ │ │ ├── content_loc: (1,5)-(1,8) = "bar" │ │ │ ├── closing_loc: (1,8)-(1,9) = "/" │ │ │ ├── unescaped: "bar" │ │ │ └── flags: ∅ │ │ └── flags: ∅ │ ├── closing_loc: ∅ │ ├── block: ∅ │ ├── flags: ∅ │ └── name: :foo ├── @ RegularExpressionNode (location: (3,0)-(3,8)) │ ├── opening_loc: (3,0)-(3,3) = "%r{" │ ├── content_loc: (3,3)-(3,6) = "abc" │ ├── closing_loc: (3,6)-(3,8) = "}i" │ ├── unescaped: "abc" │ └── flags: ignore_case ├── @ RegularExpressionNode (location: (5,0)-(5,5)) │ ├── opening_loc: (5,0)-(5,1) = "/" │ ├── content_loc: (5,1)-(5,4) = "a\\b" │ ├── closing_loc: (5,4)-(5,5) = "/" │ ├── unescaped: "a\\b" │ └── flags: ∅ ├── @ InterpolatedRegularExpressionNode (location: (7,0)-(7,11)) │ ├── opening_loc: (7,0)-(7,1) = "/" │ ├── parts: (length: 2) │ │ ├── @ StringNode (location: (7,1)-(7,5)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ │ │ │ ├── content_loc: (7,1)-(7,5) = "aaa " │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "aaa " │ │ └── @ EmbeddedVariableNode (location: (7,5)-(7,10)) │ │ ├── operator_loc: (7,5)-(7,6) = "#" │ │ └── variable: │ │ @ GlobalVariableReadNode (location: (7,6)-(7,10)) │ │ └── name: :$bbb │ ├── closing_loc: (7,10)-(7,11) = "/" │ └── flags: ∅ ├── @ InterpolatedRegularExpressionNode (location: (9,0)-(9,16)) │ ├── opening_loc: (9,0)-(9,1) = "/" │ ├── parts: (length: 3) │ │ ├── @ StringNode (location: (9,1)-(9,5)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ │ │ │ ├── content_loc: (9,1)-(9,5) = "aaa " │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "aaa " │ │ ├── @ EmbeddedStatementsNode (location: (9,5)-(9,11)) │ │ │ ├── opening_loc: (9,5)-(9,7) = "\#{" │ │ │ ├── statements: │ │ │ │ @ StatementsNode (location: (9,7)-(9,10)) │ │ │ │ └── body: (length: 1) │ │ │ │ └── @ CallNode (location: (9,7)-(9,10)) │ │ │ │ ├── receiver: ∅ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ ├── message_loc: (9,7)-(9,10) = "bbb" │ │ │ │ ├── opening_loc: ∅ │ │ │ │ ├── arguments: ∅ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ ├── block: ∅ │ │ │ │ ├── flags: variable_call │ │ │ │ └── name: :bbb │ │ │ └── closing_loc: (9,10)-(9,11) = "}" │ │ └── @ StringNode (location: (9,11)-(9,15)) │ │ ├── flags: ∅ │ │ ├── opening_loc: ∅ │ │ ├── content_loc: (9,11)-(9,15) = " ccc" │ │ ├── closing_loc: ∅ │ │ └── unescaped: " ccc" │ ├── closing_loc: (9,15)-(9,16) = "/" │ └── flags: ∅ ├── @ ArrayNode (location: (11,0)-(11,27)) │ ├── elements: (length: 2) │ │ ├── @ MatchWriteNode (location: (11,1)-(11,21)) │ │ │ ├── call: │ │ │ │ @ CallNode (location: (11,1)-(11,21)) │ │ │ │ ├── receiver: │ │ │ │ │ @ RegularExpressionNode (location: (11,1)-(11,14)) │ │ │ │ │ ├── opening_loc: (11,1)-(11,2) = "/" │ │ │ │ │ ├── content_loc: (11,2)-(11,13) = "(?bar)" │ │ │ │ │ ├── closing_loc: (11,13)-(11,14) = "/" │ │ │ │ │ ├── unescaped: "(?bar)" │ │ │ │ │ └── flags: ∅ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ ├── message_loc: (11,15)-(11,17) = "=~" │ │ │ │ ├── opening_loc: ∅ │ │ │ │ ├── arguments: │ │ │ │ │ @ ArgumentsNode (location: (11,18)-(11,21)) │ │ │ │ │ ├── arguments: (length: 1) │ │ │ │ │ │ └── @ CallNode (location: (11,18)-(11,21)) │ │ │ │ │ │ ├── receiver: ∅ │ │ │ │ │ │ ├── call_operator_loc: ∅ │ │ │ │ │ │ ├── message_loc: (11,18)-(11,21) = "baz" │ │ │ │ │ │ ├── opening_loc: ∅ │ │ │ │ │ │ ├── arguments: ∅ │ │ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ │ │ ├── block: ∅ │ │ │ │ │ │ ├── flags: variable_call │ │ │ │ │ │ └── name: :baz │ │ │ │ │ └── flags: ∅ │ │ │ │ ├── closing_loc: ∅ │ │ │ │ ├── block: ∅ │ │ │ │ ├── flags: ∅ │ │ │ │ └── name: :=~ │ │ │ └── locals: [:foo] │ │ └── @ LocalVariableReadNode (location: (11,23)-(11,26)) │ │ ├── name: :foo │ │ └── depth: 0 │ ├── opening_loc: (11,0)-(11,1) = "[" │ └── closing_loc: (11,26)-(11,27) = "]" ├── @ RegularExpressionNode (location: (13,0)-(13,6)) │ ├── opening_loc: (13,0)-(13,1) = "/" │ ├── content_loc: (13,1)-(13,4) = "abc" │ ├── closing_loc: (13,4)-(13,6) = "/i" │ ├── unescaped: "abc" │ └── flags: ignore_case ├── @ RegularExpressionNode (location: (15,0)-(15,26)) │ ├── opening_loc: (15,0)-(15,3) = "%r/" │ ├── content_loc: (15,3)-(15,24) = "[a-z$._?][\\w$.?\#@~]*:" │ ├── closing_loc: (15,24)-(15,26) = "/i" │ ├── unescaped: "[a-z$._?][\\w$.?\#@~]*:" │ └── flags: ignore_case ├── @ RegularExpressionNode (location: (17,0)-(17,37)) │ ├── opening_loc: (17,0)-(17,3) = "%r/" │ ├── content_loc: (17,3)-(17,35) = "([a-z$._?][\\w$.?\#@~]*)(\\s+)(equ)" │ ├── closing_loc: (17,35)-(17,37) = "/i" │ ├── unescaped: "([a-z$._?][\\w$.?\#@~]*)(\\s+)(equ)" │ └── flags: ignore_case ├── @ RegularExpressionNode (location: (19,0)-(19,25)) │ ├── opening_loc: (19,0)-(19,3) = "%r/" │ ├── content_loc: (19,3)-(19,23) = "[a-z$._?][\\w$.?\#@~]*" │ ├── closing_loc: (19,23)-(19,25) = "/i" │ ├── unescaped: "[a-z$._?][\\w$.?\#@~]*" │ └── flags: ignore_case ├── @ RegularExpressionNode (location: (21,0)-(24,1)) │ ├── opening_loc: (21,0)-(21,3) = "%r(" │ ├── content_loc: (21,3)-(23,0) = "\n(?:[\\w\#$%_']|\\(\\)|\\(,\\)|\\[\\]|[0-9])*\n (?:[\\w\#$%_']+)\n" │ ├── closing_loc: (24,0)-(24,1) = ")" │ ├── unescaped: "\n(?:[\\w\#$%_']|\\(\\)|\\(,\\)|\\[\\]|[0-9])*\n (?:[\\w\#$%_']+)\n" │ └── flags: ∅ ├── @ CallNode (location: (26,0)-(26,16)) │ ├── receiver: │ │ @ RegularExpressionNode (location: (26,0)-(26,8)) │ │ ├── opening_loc: (26,0)-(26,1) = "/" │ │ ├── content_loc: (26,1)-(26,7) = "(?#\\))" │ │ ├── closing_loc: (26,7)-(26,8) = "/" │ │ ├── unescaped: "(?#\\))" │ │ └── flags: ∅ │ ├── call_operator_loc: ∅ │ ├── message_loc: (26,9)-(26,11) = "=~" │ ├── opening_loc: ∅ │ ├── arguments: │ │ @ ArgumentsNode (location: (26,12)-(26,16)) │ │ ├── arguments: (length: 1) │ │ │ └── @ StringNode (location: (26,12)-(26,16)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: (26,12)-(26,13) = "\"" │ │ │ ├── content_loc: (26,13)-(26,15) = "hi" │ │ │ ├── closing_loc: (26,15)-(26,16) = "\"" │ │ │ └── unescaped: "hi" │ │ └── flags: ∅ │ ├── closing_loc: ∅ │ ├── block: ∅ │ ├── flags: ∅ │ └── name: :=~ ├── @ RegularExpressionNode (location: (28,0)-(28,9)) │ ├── opening_loc: (28,0)-(28,3) = "%r#" │ ├── content_loc: (28,3)-(28,8) = "pound" │ ├── closing_loc: (28,8)-(28,9) = "#" │ ├── unescaped: "pound" │ └── flags: ∅ ├── @ InterpolatedRegularExpressionNode (location: (30,0)-(30,13)) │ ├── opening_loc: (30,0)-(30,1) = "/" │ ├── parts: (length: 2) │ │ ├── @ StringNode (location: (30,1)-(30,5)) │ │ │ ├── flags: ∅ │ │ │ ├── opening_loc: ∅ │ │ │ ├── content_loc: (30,1)-(30,5) = "aaa " │ │ │ ├── closing_loc: ∅ │ │ │ └── unescaped: "aaa " │ │ └── @ EmbeddedStatementsNode (location: (30,5)-(30,11)) │ │ ├── opening_loc: (30,5)-(30,7) = "\#{" │ │ ├── statements: │ │ │ @ StatementsNode (location: (30,7)-(30,10)) │ │ │ └── body: (length: 1) │ │ │ └── @ CallNode (location: (30,7)-(30,10)) │ │ │ ├── receiver: ∅ │ │ │ ├── call_operator_loc: ∅ │ │ │ ├── message_loc: (30,7)-(30,10) = "bbb" │ │ │ ├── opening_loc: ∅ │ │ │ ├── arguments: ∅ │ │ │ ├── closing_loc: ∅ │ │ │ ├── block: ∅ │ │ │ ├── flags: variable_call │ │ │ └── name: :bbb │ │ └── closing_loc: (30,10)-(30,11) = "}" │ ├── closing_loc: (30,11)-(30,13) = "/o" │ └── flags: once ├── @ MatchWriteNode (location: (32,0)-(33,10)) │ ├── call: │ │ @ CallNode (location: (32,0)-(33,10)) │ │ ├── receiver: │ │ │ @ RegularExpressionNode (location: (32,0)-(33,4)) │ │ │ ├── opening_loc: (32,0)-(32,1) = "/" │ │ │ ├── content_loc: (32,1)-(33,3) = "(?)" │ │ │ ├── closing_loc: (33,3)-(33,4) = "/" │ │ │ ├── unescaped: "(?)" │ │ │ └── flags: ∅ │ │ ├── call_operator_loc: ∅ │ │ ├── message_loc: (33,5)-(33,7) = "=~" │ │ ├── opening_loc: ∅ │ │ ├── arguments: │ │ │ @ ArgumentsNode (location: (33,8)-(33,10)) │ │ │ ├── arguments: (length: 1) │ │ │ │ └── @ StringNode (location: (33,8)-(33,10)) │ │ │ │ ├── flags: ∅ │ │ │ │ ├── opening_loc: (33,8)-(33,9) = "\"" │ │ │ │ ├── content_loc: (33,9)-(33,9) = "" │ │ │ │ ├── closing_loc: (33,9)-(33,10) = "\"" │ │ │ │ └── unescaped: "" │ │ │ └── flags: ∅ │ │ ├── closing_loc: ∅ │ │ ├── block: ∅ │ │ ├── flags: ∅ │ │ └── name: :=~ │ └── locals: [:ab] └── @ LocalVariableReadNode (location: (33,12)-(33,14)) ├── name: :ab └── depth: 0