yacc入門 (2)
『Rubyソースコード完全解説』の第9章「速習 yacc」に魅入っていました。
... 規則(群)の最後にセミコロンが必要な yacc も存在する。...
筆者はこのセミコロンが嫌いなので本書では常に省略する。(p.239)
ぷはっ、やっぱ『ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道』は「ふつう」だわw。(つまんないという意味ではなく、客層が違うので「ふつう」に端折らず丁寧に書いてある)
勢いで『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 を見る……長ぇー。