@ ProgramNode (location: (1,0)-(8,3))
├── locals: []
└── statements:
    @ StatementsNode (location: (1,0)-(8,3))
    └── body: (length: 4)
        ├── @ OrNode (location: (1,0)-(1,14))
        │   ├── left:
        │   │   @ RangeNode (location: (1,0)-(1,5))
        │   │   ├── flags: exclude_end
        │   │   ├── left:
        │   │   │   @ CallNode (location: (1,0)-(1,1))
        │   │   │   ├── flags: variable_call
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── name: :a
        │   │   │   ├── message_loc: (1,0)-(1,1) = "a"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── block: ∅
        │   │   ├── right:
        │   │   │   @ CallNode (location: (1,4)-(1,5))
        │   │   │   ├── flags: variable_call
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── name: :b
        │   │   │   ├── message_loc: (1,4)-(1,5) = "b"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── block: ∅
        │   │   └── operator_loc: (1,1)-(1,4) = "..."
        │   ├── right:
        │   │   @ RangeNode (location: (1,9)-(1,14))
        │   │   ├── flags: exclude_end
        │   │   ├── left:
        │   │   │   @ CallNode (location: (1,9)-(1,10))
        │   │   │   ├── flags: variable_call
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── name: :c
        │   │   │   ├── message_loc: (1,9)-(1,10) = "c"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── block: ∅
        │   │   ├── right:
        │   │   │   @ CallNode (location: (1,13)-(1,14))
        │   │   │   ├── flags: variable_call
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── name: :d
        │   │   │   ├── message_loc: (1,13)-(1,14) = "d"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── block: ∅
        │   │   └── operator_loc: (1,10)-(1,13) = "..."
        │   └── operator_loc: (1,6)-(1,8) = "or"
        ├── @ AndNode (location: (2,0)-(2,15))
        │   ├── left:
        │   │   @ RangeNode (location: (2,0)-(2,5))
        │   │   ├── flags: exclude_end
        │   │   ├── left:
        │   │   │   @ CallNode (location: (2,0)-(2,1))
        │   │   │   ├── flags: variable_call
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── name: :a
        │   │   │   ├── message_loc: (2,0)-(2,1) = "a"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── block: ∅
        │   │   ├── right:
        │   │   │   @ CallNode (location: (2,4)-(2,5))
        │   │   │   ├── flags: variable_call
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── name: :b
        │   │   │   ├── message_loc: (2,4)-(2,5) = "b"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── block: ∅
        │   │   └── operator_loc: (2,1)-(2,4) = "..."
        │   ├── right:
        │   │   @ RangeNode (location: (2,10)-(2,15))
        │   │   ├── flags: exclude_end
        │   │   ├── left:
        │   │   │   @ CallNode (location: (2,10)-(2,11))
        │   │   │   ├── flags: variable_call
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── name: :c
        │   │   │   ├── message_loc: (2,10)-(2,11) = "c"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── block: ∅
        │   │   ├── right:
        │   │   │   @ CallNode (location: (2,14)-(2,15))
        │   │   │   ├── flags: variable_call
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── name: :d
        │   │   │   ├── message_loc: (2,14)-(2,15) = "d"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   └── block: ∅
        │   │   └── operator_loc: (2,11)-(2,14) = "..."
        │   └── operator_loc: (2,6)-(2,9) = "and"
        ├── @ IfNode (location: (4,0)-(5,3))
        │   ├── if_keyword_loc: (4,0)-(4,2) = "if"
        │   ├── predicate:
        │   │   @ OrNode (location: (4,3)-(4,17))
        │   │   ├── left:
        │   │   │   @ FlipFlopNode (location: (4,3)-(4,8))
        │   │   │   ├── flags: exclude_end
        │   │   │   ├── left:
        │   │   │   │   @ CallNode (location: (4,3)-(4,4))
        │   │   │   │   ├── flags: variable_call
        │   │   │   │   ├── receiver: ∅
        │   │   │   │   ├── call_operator_loc: ∅
        │   │   │   │   ├── name: :a
        │   │   │   │   ├── message_loc: (4,3)-(4,4) = "a"
        │   │   │   │   ├── opening_loc: ∅
        │   │   │   │   ├── arguments: ∅
        │   │   │   │   ├── closing_loc: ∅
        │   │   │   │   └── block: ∅
        │   │   │   ├── right:
        │   │   │   │   @ CallNode (location: (4,7)-(4,8))
        │   │   │   │   ├── flags: variable_call
        │   │   │   │   ├── receiver: ∅
        │   │   │   │   ├── call_operator_loc: ∅
        │   │   │   │   ├── name: :b
        │   │   │   │   ├── message_loc: (4,7)-(4,8) = "b"
        │   │   │   │   ├── opening_loc: ∅
        │   │   │   │   ├── arguments: ∅
        │   │   │   │   ├── closing_loc: ∅
        │   │   │   │   └── block: ∅
        │   │   │   └── operator_loc: (4,4)-(4,7) = "..."
        │   │   ├── right:
        │   │   │   @ FlipFlopNode (location: (4,12)-(4,17))
        │   │   │   ├── flags: exclude_end
        │   │   │   ├── left:
        │   │   │   │   @ CallNode (location: (4,12)-(4,13))
        │   │   │   │   ├── flags: variable_call
        │   │   │   │   ├── receiver: ∅
        │   │   │   │   ├── call_operator_loc: ∅
        │   │   │   │   ├── name: :c
        │   │   │   │   ├── message_loc: (4,12)-(4,13) = "c"
        │   │   │   │   ├── opening_loc: ∅
        │   │   │   │   ├── arguments: ∅
        │   │   │   │   ├── closing_loc: ∅
        │   │   │   │   └── block: ∅
        │   │   │   ├── right:
        │   │   │   │   @ CallNode (location: (4,16)-(4,17))
        │   │   │   │   ├── flags: variable_call
        │   │   │   │   ├── receiver: ∅
        │   │   │   │   ├── call_operator_loc: ∅
        │   │   │   │   ├── name: :d
        │   │   │   │   ├── message_loc: (4,16)-(4,17) = "d"
        │   │   │   │   ├── opening_loc: ∅
        │   │   │   │   ├── arguments: ∅
        │   │   │   │   ├── closing_loc: ∅
        │   │   │   │   └── block: ∅
        │   │   │   └── operator_loc: (4,13)-(4,16) = "..."
        │   │   └── operator_loc: (4,9)-(4,11) = "or"
        │   ├── then_keyword_loc: ∅
        │   ├── statements: ∅
        │   ├── consequent: ∅
        │   └── end_keyword_loc: (5,0)-(5,3) = "end"
        └── @ IfNode (location: (7,0)-(8,3))
            ├── if_keyword_loc: (7,0)-(7,2) = "if"
            ├── predicate:
            │   @ AndNode (location: (7,3)-(7,18))
            │   ├── left:
            │   │   @ FlipFlopNode (location: (7,3)-(7,8))
            │   │   ├── flags: exclude_end
            │   │   ├── left:
            │   │   │   @ CallNode (location: (7,3)-(7,4))
            │   │   │   ├── flags: variable_call
            │   │   │   ├── receiver: ∅
            │   │   │   ├── call_operator_loc: ∅
            │   │   │   ├── name: :a
            │   │   │   ├── message_loc: (7,3)-(7,4) = "a"
            │   │   │   ├── opening_loc: ∅
            │   │   │   ├── arguments: ∅
            │   │   │   ├── closing_loc: ∅
            │   │   │   └── block: ∅
            │   │   ├── right:
            │   │   │   @ CallNode (location: (7,7)-(7,8))
            │   │   │   ├── flags: variable_call
            │   │   │   ├── receiver: ∅
            │   │   │   ├── call_operator_loc: ∅
            │   │   │   ├── name: :b
            │   │   │   ├── message_loc: (7,7)-(7,8) = "b"
            │   │   │   ├── opening_loc: ∅
            │   │   │   ├── arguments: ∅
            │   │   │   ├── closing_loc: ∅
            │   │   │   └── block: ∅
            │   │   └── operator_loc: (7,4)-(7,7) = "..."
            │   ├── right:
            │   │   @ FlipFlopNode (location: (7,13)-(7,18))
            │   │   ├── flags: exclude_end
            │   │   ├── left:
            │   │   │   @ CallNode (location: (7,13)-(7,14))
            │   │   │   ├── flags: variable_call
            │   │   │   ├── receiver: ∅
            │   │   │   ├── call_operator_loc: ∅
            │   │   │   ├── name: :c
            │   │   │   ├── message_loc: (7,13)-(7,14) = "c"
            │   │   │   ├── opening_loc: ∅
            │   │   │   ├── arguments: ∅
            │   │   │   ├── closing_loc: ∅
            │   │   │   └── block: ∅
            │   │   ├── right:
            │   │   │   @ CallNode (location: (7,17)-(7,18))
            │   │   │   ├── flags: variable_call
            │   │   │   ├── receiver: ∅
            │   │   │   ├── call_operator_loc: ∅
            │   │   │   ├── name: :d
            │   │   │   ├── message_loc: (7,17)-(7,18) = "d"
            │   │   │   ├── opening_loc: ∅
            │   │   │   ├── arguments: ∅
            │   │   │   ├── closing_loc: ∅
            │   │   │   └── block: ∅
            │   │   └── operator_loc: (7,14)-(7,17) = "..."
            │   └── operator_loc: (7,9)-(7,12) = "and"
            ├── then_keyword_loc: ∅
            ├── statements: ∅
            ├── consequent: ∅
            └── end_keyword_loc: (8,0)-(8,3) = "end"
