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