前面提到 AST tree node 生成順序與 bison grammar match 順序的理解不太精確。
從 parse.y 看,program
會是 %start
預設的 rule,所以 parser 會從試著找 program
開始。因為 program
的 action 裡有前置動作,所以在產生的 parse.c 裡在 program
之上還有一段
case 2: /* $@1: %empty */
#line 1580 "../parse.y"
{
SET_LEX_STATE(EXPR_BEG);
local_push(p, ifndef_ripper(1)+0);
}
#line 9406 "parse.c"
break;
而整個解析會在 match 到 program
時結束。雖然 program
會說是起始規則,但它是解析的終點。