2016-06-18 1 views
0

解決シフトは/バイソン

method_call: T_ID T_LPAREN method_arg_list T_RPAREN T_SEMICOLON 

value: T_ID T_LSB expr T_RSB 
    | T_ID; 

method_arg_list: /* Empty */ 
       | method_arg method_arg_list; 

method_arg: string_constant 
      | expr; 

expr: value 
    | '(' expr ')'; 

に従っているとの競合を持っている文法で競合を減らす問題は、それがT_IDを読み取るときに、それがシフトすると、次の 'を読んでする必要があるかどうかわからないということですしかし、次のトークンが左かっこであるかどうかを確認するべきではないでしょうか?

私はバイソンとパーサには一般的に新しく、私は何を書き直すことができるのでしょうか?文法や紛争を解決する?

State 60 

37 method_call: T_ID . T_LPAREN method_arg_list T_RPAREN T_SEMICOLON 
67 value: T_ID . T_LSB expr T_RSB 
68  | T_ID . 

T_LPAREN shift, and go to state 71 
T_LSB  shift, and go to state 72 

T_LPAREN [reduce using rule 68 (value)] 
$default reduce using rule 68 (value) 
+0

私たちはあなたを助けることができるようにするための十分な情報がありません。エラーを再現するMCVE([MCVE])を生成する必要があります。それはいくつかのトークンを列挙します(実際の文法では非終端記号であるにもかかわらず、非終端記号の一部をトークンとしてリストすることもあります)。 'yacc -v'(' bison -v')の出力に、問題のある状態だけのshift/reduce競合レポートを表示します。問題を再現するには十分な文法が必要ですが、問題を再現できるだけの文法はありません。私はまだ何が起こったのか把握しようとしています...いくつかのことを変更した後にエラーが消え@JonathanLeffler –

+0

... – GalaxyVintage

+0

私は 'かどうかわからない「(」' 'T_LPAREN'であるべきで、'「)」 'は' T_RPAREN'でなければなりません。 %トークンT_ID T_LPAREN T_RPAREN T_SEMICOLON T_LSB T_RSBのstring_constant' 'と、書かれたようにバイソンはコードでOKです。私はあなたが何が壊れたのかを記録しておきたいと思います。バージョン管理システムを使用することは非常に重要になります。 –

答えて

0

編集レフラーは正しいです:私たちは、メソッド呼び出しや価値観などに依存しているかもしれないいくつかのより高いレベルsentential構造について知っておく必要があります。

私は、概念の観点から何が起こっているかを参照してください。私たちはどんな「y.output」核心ザラザラに陥っを取得する必要はありません。すべては、引数をカンマでメソッド呼び出しに分けることができなかったことに由来します。また、なぜ反復的にではなく、反復的に引数リストを収集しているのかを知りたいです。

'(' と、との間T_LPAREN ')' とT_RPARENの違いは何ですか?レックスは1つのケースで1つ返しますが、別のケースではもう1つ返しますか?シンプルなパターン\(これらの両方にマッピングすることはできませんが、1つにしかマッピングできません;パターン\は同じものになります)。また、わかりやすくするために、例えば[T_LSB]のように定義しても構いません。

関連する問題