2012-04-19 106 views
0

我正在用Bison編寫解析器,並且收到以下警告。野牛語法警告

fol.y:42 parser name defined to default :"parse" 
fol.y:61: warning: type clash ('' 'pred') on default action 

我一直在使用谷歌搜索的方式來擺脫他們,但幾乎都空手而歸他們的意思(更不用說如何解決這些問題),因爲每一個崗位,我發現他們有一個編譯錯誤,並警告他們自己沒有解決。有人能告訴我他們的意思,以及如何解決它們?相關代碼如下。 61行是最後一個分號。我刪除了其餘的語法,因爲它非常冗長。

%union { 
    char* var; 
    char* name; 
    char* pred; 
} 


%token <var> VARIABLE 
%token <name> NAME 
%token <pred> PRED 

%% 


fol: 
     declines clauses {cout << "Done parsing with file" << endl;} 
     ; 
declines: 
     declines decline 
     |decline 
     ; 
decline: 
     PRED decs 
     ; 

回答

1

第一條消息很可能只是警告,您沒有在文法規範中包含%start parse

第二個意思是說你的規則應該返回一個值,但是你沒有正確指定返回值的類型。 PRED返回unionpred元素;問題可能是您尚未爲declinedeclines創建%type條目。如果您有工會,則必須爲大多數(如果不是全部)規則指定類型—或者可能只是沒有明確操作的規則(以便覆蓋默認的$$ = $1;操作)。

我不相信問題出現在您指定的行中,並且由於我們沒有完整的,最小程度地重現您的問題,我們無法調查您是否對其進行驗證。 decs的規範可能是相關的(我不相信它,但它可能是)。

您可能從bison -v的輸出中獲得更多信息,這是y.output文件(或類似的文件)。

+0

我可以找到沒有例子,使用%開始解析(我不知道在哪裏包括它,只是把它放在頂部導致glibc錯誤),至於其他警告我有其他規則看起來相同下降並下降,但沒有產生錯誤。 – user381261 2012-04-20 00:48:42

+0

您可能會在'%token'行之後放置'%start',儘管如果啓動規則也是語法中的第一條規則,則不需要。但由於我們無法看到產生該警告的內容,因此我們無法輕鬆幫助您解決問題。同樣,與其他問題;在保留問題的同時修剪語法,你有點過於熱情。考慮到上面的代碼,'clauses'和'decs'都被使用,但'沒有被定義爲一個標記並且沒有規則'。添加規則'decs:NAME;'和'子句:VARIABLE;'不能幫助診斷問題; '野牛'編譯語法沒有警告。 – 2012-04-20 03:07:09