要看懂 parse.c 需要對 Bison 有一定瞭解,可是 https://www.gnu.org/software/bison/manual/bison.html 文件很長,就算只是掃過去都要不少時間。
用前面最簡單的例子實際走看看流程,能不能稍微有點感覺
pp Ripper.sexp <<~RUBY
RUBY
# => [:program, [[:void_stmt]]]
output 裡的 void_stmt
沒有在 parse.y 內直接定義,想先弄清楚它的來源。
先看 program
的定義和產生的 C code 比較
program
的組成有個 top_compstmt
,就字面猜上述沒內容的例子應該是對應到 top_stmts : none
top_stmts : none
{
/*%%%*/
$$ = NEW_BEGIN(0, &@$);
/*% %*/
/*% ripper: stmts_add!(stmts_new!, void_stmt!) %*/
}
none : /* none */
{
$$ = Qnull;
}
;