2012-12-04 27 views
0

我的來自bison的「.output」文件有許多變量,名稱分別爲$ @ 1,$ @ 2,...,$ @ 38。這些都與中期行爲規則有關,我正在研究的語法有很多,但在某種程度上我還沒有完全辨別。它們代表非終結符號,與中期行爲規則有某種關係。這就是我所能說的。

編輯:


input.y(漫畫版):

%start statement 

%% 

statement: /* empty */ { print("testA"); } 
    | ';'   { print("testB"); } 
    |  statement { print("testC"); } thing1 thing2 { print("testD"); } 
    ; 

input.output(漫畫版):

0 $accept: statement $end 

1 statement: /* empty */ 
2  | ';' 

3 [email protected]: /* empty */ 

4 statement: statement [email protected] thing1 thing2 

10 thing1: /*empty*/ 
20 thing2: /*empty*/ 
+0

OK的副本,我看着這個多一些,並據此編輯我的答案。 – rici

回答

2

把中間 - 規則中的規則動作幾乎與添加非te相同一個空的右手邊和相同的動作(現在是最後一個動作),除了動作語義值的編號。 (野牛讓你在生產開始之前用負指數來引用語義值;除了野牛會爲你計算堆棧偏移量外,這是用於中等規則操作的機制)。

插入的空的非終端被「命名爲」@1, @2, ...。你會在狀態描述中看到這些;它會看起來像每一箇中期的行動已經被一個@i佔位符(這實際上是發生了什麼)所取代。

編輯

事實證明,中端規則操作可能被命名爲[email protected]@n。據在行527 reader.c一個有幫助的註釋(在v2.6.5,這是最新的版本,因爲我寫的):

/* If the midrule's $$ is set or its $n is used, remove the `$' from the 
    symbol name so that it's a user-defined symbol so that the default 
    %destructor and %printer apply. */ 

換句話說,中間規則操作將在其名稱中的$精確如果它沒有任何價值(它既沒有設置價值,也沒有任何人使用該值);如果它有一個值(我猜我的差不多總是這樣),那麼它的名字就不會有$

我相信神祕的解決方案。

1

至於Bison 2.3,中間規則動作的匿名符號被命名爲@N,但它在Bison 2.4中被更改爲[email protected]。見http://lists.gnu.org/archive/html/bison-patches/2006-10/msg00075.html

底線是:如果你看到@N,它的高時間更新Bison :)

+0

這是不正確的。你會在bison 2.6.5生成的輸出文件中發現@N(我不知道你提到的補丁的相關性是什麼,但它是古老的歷史)。關鍵是在reader.c:527的評論(在2.6.5版本中)。 (我有動機去檢查這個,因爲我有一個幾乎是最新的野牛,它給我看了'@ N'的名字。) – rici

+0

謝謝你指出這一點! FWIW,Bison 2.7的文檔闡明瞭這一點:http://www.gnu.org/software/bison/manual/bison.html#Mid_002dRule-Action-Translation – akim