2011-02-20 8 views
0

私はパーサーに取り組んでいます。私は本当に不満です。ハッピー/ YACCをシフトするときに減らす

new int[3][][] 

または

new int[3] 

そのほとんどが最後に空の配列を除いて、正しく解析します。言語では、我々のような表現を持つことができます。

Expression : int 
      char 
      null 
      (...many others...) 
      new NewExpression 

、その後NewExpressionは次のとおりです:私のパーサで 私が持っている

NewExpression : NonArrayType '[' Expression ']' EmptyArrays 
       | NonArrayType '[' Expression ']' 

、その後EmptyArraysは、1つまたは複数の空の中括弧で - EmptyArraysが空の文字列を導出した場合、それは20のシフトを追加/削減競合:私はパーサーの.infoファイルを調べたときに

EmptyArrays : EmptyArrays EmptyArray 
      | EmptyArray 
EmptyArray : '[' ']' 

はしかし、私はこれを取得:

State 214¬ 
¬ 
▸ NewExpression -> NonArrayType lbrace Expression rbrace . EmptyArrays (rule 80)¬ 
▸ NewExpression -> NonArrayType lbrace Expression rbrace . (rule 81)¬ 
¬ 
▸ dot   reduce using rule 81¬ 
▸ ';'   reduce using rule 81¬ 
▸ ','   reduce using rule 81¬ 
▸ '+'   reduce using rule 81¬ 
▸ '-'   reduce using rule 81¬ 
▸ '*'   reduce using rule 81¬ 
▸ '/'   reduce using rule 81¬ 
▸ '<'   reduce using rule 81¬ 
▸ '>'   reduce using rule 81¬ 
▸ '<='   reduce using rule 81¬ 
▸ '>='   reduce using rule 81¬ 
▸ '=='   reduce using rule 81¬ 
▸ '!='   reduce using rule 81¬ 
▸ ')'   reduce using rule 81¬ 
▸ '['   reduce using rule 81 --I expect this should shift 
▸ ']'   reduce using rule 81¬ 
▸ '?'   reduce using rule 81¬ 
▸ ':'   reduce using rule 81¬ 
▸ '&&'   reduce using rule 81¬ 
▸ '||'   reduce using rule 81 

私たちは状態214にあり、左のブレースを見ると、スタックに移動してEmptyArraysを解析し続ける必要があります。

私は、手荷物の余分な部分(例えば、NewExpressionで解析を開始することによって余分なものをすべて取り除くと、追加の角かっこが正しく解析されるため、何が起こっているのか正確にはわかりません。式、ステートメント、または文法の非終端記号が左かっこで始めることはできません。特に、私はif/else文のために同様の規則を持っているので、shift/reduce競合を生成しますが、次のトークンがelseであればシフトすることを選択します(この問題は十分に文書化されています)。

何がうまくいかないのか理解できますか?私はあなたの助けに本当に感謝しています、私は本当に問題を把握しようと風車で傾いています。

答えて

1

この現象が発生する%left '['のようなもので '['と ']'の優先順位が設定されている可能性があります。優先順位宣言を削除すると、ここにあるシフト/リダクションの競合が表示されます。シフト/リダクションの競合の理由については、おそらくルールがあります。

Expression: Expression '[' Expression ']' 

問題は、NewExpressionExpressionなので、このようなインデックスが続く可能性があり、 '['の先読みを見て、それがインデックス式の先頭かEmptyArrayの開始かどうかを判断できません - それは2トークン先読みを必要とするでしょう。

この特定のケースで試すことができることは、あなたのレクサーがここに必要な余分な先読みを行い、[]を単一のトークンとして認識させることです。

+0

ええ、それはまさに問題であることが判明しました。私は昨日の午後、間違った場所で問題を探していて、問題が何であるか分かったら、実際には同じ解決法を得ました。ありがとう!このバグが私を殺していました。 –

関連する問題