context ctx i: int j: int k: int lex ignore /space+/ literal '*', '(', ')' token id /[a-zA-Z_]+/ end def foo [id] int f() { i = i + 1 } def item [id] | [foo] | ['(' item* ')'] { i = 0 f() f() f() print( i '\n' ) } def start [item*] end ctx CTX: ctx = cons ctx [] parse InputP: ctx::start( CTX ) [stdin] Input: ctx::start = InputP.tree print( Input '\n' )