yacc入門 (2)

Rubyソースコード完全解説』の第9章「速習 yacc」に魅入っていました。

... 規則(群)の最後にセミコロンが必要な yacc も存在する。...
筆者はこのセミコロンが嫌いなので本書では常に省略する。(p.239)

ぷはっ、やっぱ『ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道』は「ふつう」だわw。(つまんないという意味ではなく、客層が違うので「ふつう」に端折らず丁寧に書いてある)

勢いで『Rubyを256倍使うための本 無道編』ポチッと買っちゃった。


Rubyソースコード完全解説 ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道 Rubyを256倍使うための本 無道編


で、該当の goal posts (ブロック・パラメータ囲み記号s) 部分はここか。

block_var_def   : '|' opt_bv_decl '|'
                    {
                    /*%%%*/
                        $$ = NEW_ITER((NODE*)1, 0, $2);
                    }
                | tOROP
                    {
                    /*%%%*/
                        $$ = NEW_ITER((NODE*)1, 0, 0);
                    }
                | '|' block_var opt_bv_decl '|'
                    {
                    /*%%%*/
                        $$ = NEW_ITER($2, 0, $3);
                    }
                ;

(コメントは削った)

super YACC guru の皆さーん、ココがハックするところですよー。


ここの '|' をリテラルから kDO や kEND のようなものに変えて、block_var を paren_args 相当にしなきゃいけないのかな? んー、違うなー、相手は '|' 演算子だからなー。'(' や '{' と一緒にしたらまずいのか。
opt_bv_decl は ";" とか "," みたいだから、とりあえず無視して、block_var を見る……長ぇー。