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 = new ctx() parse Input: ctx::start( CTX ) [stdin] print( Input ) ##### IN ##### a b c ( d ) e f ##### EXP ##### 3 a b c ( d ) e f