2017-05-10 72 views
0

爲什麼我必須在以下語法片段中明確使用$<nVal>4野牛語法%類型和%令牌

我以爲%type <nVal> expr行會刪除需要,所以我可以簡單地把$4

難道不可以使用expr的不同定義,以便我可以嗎?

%union 
{ 
    int nVal; 
    char *pszVal; 
} 

%token <nVal> tkNUMBER 
%token <pszVal> tkIDENT 
%type <nVal> expr 

%% 

for_statement : tkFOR 
       tkIDENT { printf("I:%s\n", $2); } 
       tkEQUALS 
       expr  { printf("A:%d\n", $<nVal>4); } // Why not just $4? 
       tkTO 
       expr  { printf("B:%d\n", $<nVal>6); } // Why not just $6? 
       step-statement 
       list 
       next-statement; 

expr : tkNUMBER { $$ = $1; } 
; 

更新以下RICI的答案。這現在工作一種享受:

for_statement : tkFOR 
       tkIDENT { printf("I:%s\n", $2); } 
       tkEQUALS 
       expr  { printf("A:%d\n", $5 /* $<nVal>5 */); } 
       tkTO 
       expr  { printf("A:%d\n", $8 /* $<nVal>8 */); } 
       step-statement 
       list 
       next-statement; 

回答

2

爲什麼我要在下面的語法片斷明確使用$<nVal>4

其實,如果你想參考expr,你應該使用$5$4tkEQUALS,它沒有聲明類型,所以任何使用都必須明確鍵入。 $3是之前的midrule動作,它沒有值,因爲$$未在該動作中分配。

通過相同的邏輯,第二個expr$8; $6是第二個midrule動作,它也沒有價值(也沒有類型)。

Bison manual

中期規則行動本身算作規則的組成部分之一。當在同一規則中稍後出現另一個動作時(通常在末尾會出現另一個動作),這會有所不同:在計算n要在$n中使用時,您必須對符號和符號進行計數。

+0

謝謝 - 你是完全正確的。 – SparkyNZ

+0

我明白了 - 一個「中間規則動作」是出現在規則中間的大括號「斑點」,而不是出現在最後。所以如果我在最後有一條規則,我所有的原始編號都可以工作。使用中間規則操作時,我需要在編號中包含中間規則斑點。 – SparkyNZ