@ ProgramNode (location: (1,0)-(37,16))
├── locals: []
└── statements:
    @ StatementsNode (location: (1,0)-(37,16))
    └── body: (length: 10)
        ├── @ AndNode (location: (1,0)-(1,19))
        │   ├── left:
        │   │   @ CallNode (location: (1,0)-(1,7))
        │   │   ├── receiver:
        │   │   │   @ CallNode (location: (1,4)-(1,7))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (1,4)-(1,7) = "foo"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :foo
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (1,0)-(1,3) = "not"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: ∅
        │   │   └── name: :!
        │   ├── right:
        │   │   @ CallNode (location: (1,12)-(1,19))
        │   │   ├── receiver:
        │   │   │   @ CallNode (location: (1,16)-(1,19))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (1,16)-(1,19) = "bar"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :bar
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (1,12)-(1,15) = "not"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: ∅
        │   │   └── name: :!
        │   └── operator_loc: (1,8)-(1,11) = "and"
        ├── @ CallNode (location: (3,0)-(3,16))
        │   ├── receiver:
        │   │   @ AndNode (location: (3,4)-(3,15))
        │   │   ├── left:
        │   │   │   @ CallNode (location: (3,4)-(3,7))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (3,4)-(3,7) = "foo"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :foo
        │   │   ├── right:
        │   │   │   @ CallNode (location: (3,12)-(3,15))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (3,12)-(3,15) = "bar"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :bar
        │   │   └── operator_loc: (3,8)-(3,11) = "and"
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (3,0)-(3,3) = "not"
        │   ├── opening_loc: (3,3)-(3,4) = "("
        │   ├── arguments: ∅
        │   ├── closing_loc: (3,15)-(3,16) = ")"
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: :!
        ├── @ CallNode (location: (5,0)-(5,7))
        │   ├── receiver:
        │   │   @ CallNode (location: (5,4)-(5,7))
        │   │   ├── receiver: ∅
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (5,4)-(5,7) = "foo"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: variable_call
        │   │   └── name: :foo
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (5,0)-(5,3) = "not"
        │   ├── opening_loc: ∅
        │   ├── arguments: ∅
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: :!
        ├── @ AndNode (location: (7,0)-(8,5))
        │   ├── left:
        │   │   @ CallNode (location: (7,0)-(7,7))
        │   │   ├── receiver:
        │   │   │   @ CallNode (location: (7,4)-(7,7))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (7,4)-(7,7) = "foo"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :foo
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (7,0)-(7,3) = "not"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: ∅
        │   │   └── name: :!
        │   ├── right:
        │   │   @ CallNode (location: (7,12)-(8,5))
        │   │   ├── receiver:
        │   │   │   @ CallNode (location: (8,2)-(8,5))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (8,2)-(8,5) = "bar"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :bar
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (7,12)-(7,15) = "not"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: ∅
        │   │   └── name: :!
        │   └── operator_loc: (7,8)-(7,11) = "and"
        ├── @ AndNode (location: (11,0)-(13,5))
        │   ├── left:
        │   │   @ CallNode (location: (11,0)-(11,7))
        │   │   ├── receiver:
        │   │   │   @ CallNode (location: (11,4)-(11,7))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (11,4)-(11,7) = "foo"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :foo
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (11,0)-(11,3) = "not"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: ∅
        │   │   └── name: :!
        │   ├── right:
        │   │   @ CallNode (location: (12,4)-(13,5))
        │   │   ├── receiver:
        │   │   │   @ CallNode (location: (13,2)-(13,5))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (13,2)-(13,5) = "bar"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :bar
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (12,4)-(12,7) = "not"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: ∅
        │   │   └── name: :!
        │   └── operator_loc: (11,8)-(11,11) = "and"
        ├── @ AndNode (location: (16,0)-(20,5))
        │   ├── left:
        │   │   @ CallNode (location: (16,0)-(16,7))
        │   │   ├── receiver:
        │   │   │   @ CallNode (location: (16,4)-(16,7))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (16,4)-(16,7) = "foo"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :foo
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (16,0)-(16,3) = "not"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: ∅
        │   │   └── name: :!
        │   ├── right:
        │   │   @ CallNode (location: (17,2)-(20,5))
        │   │   ├── receiver:
        │   │   │   @ CallNode (location: (20,2)-(20,5))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (20,2)-(20,5) = "bar"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :bar
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (17,2)-(17,5) = "not"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: ∅
        │   │   └── name: :!
        │   └── operator_loc: (16,8)-(16,11) = "and"
        ├── @ CallNode (location: (22,0)-(25,1))
        │   ├── receiver:
        │   │   @ CallNode (location: (22,4)-(22,7))
        │   │   ├── receiver: ∅
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (22,4)-(22,7) = "foo"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: variable_call
        │   │   └── name: :foo
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (22,0)-(22,3) = "not"
        │   ├── opening_loc: (22,3)-(22,4) = "("
        │   ├── arguments: ∅
        │   ├── closing_loc: (25,0)-(25,1) = ")"
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: :!
        ├── @ CallNode (location: (27,0)-(33,3))
        │   ├── receiver:
        │   │   @ CallNode (location: (30,0)-(30,3))
        │   │   ├── receiver: ∅
        │   │   ├── call_operator_loc: ∅
        │   │   ├── message_loc: (30,0)-(30,3) = "foo"
        │   │   ├── opening_loc: ∅
        │   │   ├── arguments: ∅
        │   │   ├── closing_loc: ∅
        │   │   ├── block: ∅
        │   │   ├── flags: variable_call
        │   │   └── name: :foo
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (27,0)-(27,3) = "not"
        │   ├── opening_loc: (27,3)-(27,4) = "("
        │   ├── arguments: ∅
        │   ├── closing_loc: (33,2)-(33,3) = ")"
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: :!
        ├── @ CallNode (location: (35,0)-(35,14))
        │   ├── receiver:
        │   │   @ FlipFlopNode (location: (35,4)-(35,14))
        │   │   ├── left:
        │   │   │   @ CallNode (location: (35,4)-(35,7))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (35,4)-(35,7) = "foo"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :foo
        │   │   ├── right:
        │   │   │   @ CallNode (location: (35,11)-(35,14))
        │   │   │   ├── receiver: ∅
        │   │   │   ├── call_operator_loc: ∅
        │   │   │   ├── message_loc: (35,11)-(35,14) = "bar"
        │   │   │   ├── opening_loc: ∅
        │   │   │   ├── arguments: ∅
        │   │   │   ├── closing_loc: ∅
        │   │   │   ├── block: ∅
        │   │   │   ├── flags: variable_call
        │   │   │   └── name: :bar
        │   │   ├── operator_loc: (35,8)-(35,10) = ".."
        │   │   └── flags: ∅
        │   ├── call_operator_loc: ∅
        │   ├── message_loc: (35,0)-(35,3) = "not"
        │   ├── opening_loc: ∅
        │   ├── arguments: ∅
        │   ├── closing_loc: ∅
        │   ├── block: ∅
        │   ├── flags: ∅
        │   └── name: :!
        └── @ CallNode (location: (37,0)-(37,16))
            ├── receiver:
            │   @ ParenthesesNode (location: (37,4)-(37,16))
            │   ├── body:
            │   │   @ StatementsNode (location: (37,5)-(37,15))
            │   │   └── body: (length: 1)
            │   │       └── @ FlipFlopNode (location: (37,5)-(37,15))
            │   │           ├── left:
            │   │           │   @ CallNode (location: (37,5)-(37,8))
            │   │           │   ├── receiver: ∅
            │   │           │   ├── call_operator_loc: ∅
            │   │           │   ├── message_loc: (37,5)-(37,8) = "foo"
            │   │           │   ├── opening_loc: ∅
            │   │           │   ├── arguments: ∅
            │   │           │   ├── closing_loc: ∅
            │   │           │   ├── block: ∅
            │   │           │   ├── flags: variable_call
            │   │           │   └── name: :foo
            │   │           ├── right:
            │   │           │   @ CallNode (location: (37,12)-(37,15))
            │   │           │   ├── receiver: ∅
            │   │           │   ├── call_operator_loc: ∅
            │   │           │   ├── message_loc: (37,12)-(37,15) = "bar"
            │   │           │   ├── opening_loc: ∅
            │   │           │   ├── arguments: ∅
            │   │           │   ├── closing_loc: ∅
            │   │           │   ├── block: ∅
            │   │           │   ├── flags: variable_call
            │   │           │   └── name: :bar
            │   │           ├── operator_loc: (37,9)-(37,11) = ".."
            │   │           └── flags: ∅
            │   ├── opening_loc: (37,4)-(37,5) = "("
            │   └── closing_loc: (37,15)-(37,16) = ")"
            ├── call_operator_loc: ∅
            ├── message_loc: (37,0)-(37,3) = "not"
            ├── opening_loc: ∅
            ├── arguments: ∅
            ├── closing_loc: ∅
            ├── block: ∅
            ├── flags: ∅
            └── name: :!
