##### LM ##### lex ignore /space+/ literal `* literal `( -ni literal ni- `) literal `! `; token id /[a-zA-Z_0-9]+/ end lex ignore /space+/ token inner_t /[a-zA-Z_0-9]+/ token empty - end def inner [inner_t*] | [empty] def item [id] | [`( inner `)] def start [item* `;] parse Start: start[ stdin ] if ( ! Start ) { print( 'parse error\n' ) exit( 0 ) } for I: item in Start { print( 'item: .' I '.\n' ) if match I [ O: `( Inner: inner C: `) ] print( 'innr: .' O '.' Inner '.' C '.\n' ) } ##### IN ##### a b c ( d ) e ( ) f g; ##### EXP ##### item: .a . item: .b . item: .c . item: .( d ) . innr: .(. d .) . item: .e . item: .( ) . innr: .(. .) . item: .f . item: .g.