##### LM ##### context accum_bt lex ignore /[ \t\n]+/ token id1 /[a-zA-Z_][a-zA-Z_0-9]*/ def one [ id1* ] end OneParser: accum lex ignore /[ \t]+/ token id2 /[a-zA-Z_][a-zA-Z_0-9]*/ literal `! `; token NL /'\n'/ def A1 [] { print( "A1\n" ) } def A2 [] { print( "A2\n" ) } def item2 [id2] { send OneParser [' extra '] send OneParser [$r1] } def two [A1 item2* `! NL] | [A2 item2* `; NL] end end # accum_bt AccumBt: accum_bt = cons accum_bt[] AccumBt.OneParser = cons parser[] parse Two: accum_bt::two(AccumBt)[ stdin ] send AccumBt.OneParser ['\n'] eos print( ^Two ) print( ^( AccumBt.OneParser.tree ) '\n' ) ##### IN ##### a b c d e ; ##### EXP ##### A1 A2 a b c d e ; extra a extra b extra c extra d extra e