lex ignore /space+/ literal `* `( `) `! token SEMI_NL /';\n'/ token id /[a-zA-Z_0-9]+/ end def item [id] { lhs = cons item ["( " ^r1 " )"] } | [`( item* `)] { lhs = cons item ["( " ^r2 " )"] } def A [] { print( 'A\n' ) } def B [] { print( 'B\n' ) } def start [A item* `!] | [B item* SEMI_NL] parse Start: start[ stdin ] print( Start, "\n" ) ##### IN ##### a b c ( d1 d2 ) e f g ; ##### EXP ##### A B ( a )( b )( c )( ( d1 )( d2 ) )( e )( f )( g );