context counting # # Regular Definitions # rl rl_ws /[ \t\n\r\v]+/ rl rl_id /[a-zA-Z_][a-zA-Z0-9_]*/ rl rl_num /[0-9]+/ # # Tokens # lex # Ignore whitespace. ignore /rl_ws/ literal `; # Tokens. token id /rl_id/ token number /rl_num/ end # # Global Data # target: int count: int # # Productions # def get_target [number] { count = 0 target = r1.data.atoi() print( 'target: ', target, '\n' ) } # Arbitrary item. def item [number] | [id] def count_items [count_inc item count_items] | [count_end] def count_inc [] { if count < target count = count + 1 else reject } def count_end [] { if count < target reject } def counted_list [get_target count_items] def start [counted_list*] { for List: counted_list in lhs { match List [Count: number Items: count_items] print( 'num items: ', Count.data.atoi(), '\n' ) i: int = 1 for Item: item in Items { print( ' item ', i, ': ', ^Item, '\n' ) i = i + 1 } } print( '*** SUCCESS ***\n' ) } end # counting Counting: counting = new counting() parse counting::start( Counting )[stdin] ##### IN ##### 3 1 b c 1 1 0 3 a b c ##### EXP ##### target: 3 target: 1 target: 0 target: 3 num items: 3 item 1: 1 item 2: b item 3: c num items: 1 item 1: 1 num items: 0 num items: 3 item 1: a item 2: b item 3: c *** SUCCESS ***