2012-04-19 12 views
0

私はBisonとパーサを書いています。私は次の警告を受け取ります。私は、私は彼らと一緒に見つかったすべてのポストので、それらを取り除くための方法を検索するには、Googleを使用してきたが、かなり多く、彼らは(それらを修正するかどうかははるかに少ない)を意味するもので手ぶらで出ている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が含まれていなかっただけで警告可能性があります。

第2の意味は、値を返すはずのルールがあり、返される値のタイプが正しく指定されていないことを意味します。 PREDはunionpred要素を返します。問題は、declinedeclinesのエントリが%typeに作成されていない可能性があります。組合がある場合は、すべてではないにしてもほとんどのタイプのタイプを指定する必要があります。—または明示的なアクションを持たないルール(デフォルトの$$ = $1;アクションを上書きするように)。

あなたが指定した行に問題があるとは確信していません。私たちはあなたの問題を完全に最小限に再現していないため、検証することはできません。 decsの仕様は関連しているかもしれません(私はそれが確信していませんが、そうかもしれません)。

y.outputファイル(またはそれに類するもの)のbison -vの出力から詳細が得られる場合があります。

+0

%start parseを使用した例はありません(どこに入れるべきか分からず、一番上に置くだけでglibcエラーが発生します)。他の警告については、エラーは発生しませんでした。 – user381261

+0

'%token'を'%token'行の後ろに置いていますが、開始規則も文法の最初の規則である必要はありません。しかし、その警告がどのように生成されたのかわからないので、簡単には解決できません。同様に、他の問題もあります。あなたは問題を残しながら文法をトリミングして少し熱心でした。上記のコードでは、 'clauses'と' decs'の両方が使われますが、 'トークンとして定義されておらず、ルールもありません'。ルール 'decs:NAME;'と 'clauses:VARIABLE;を追加することは問題の診断に役立ちません。 'bison'は警告なしで文法をコンパイルします。 –