私はパーサーに取り組んでいます。私は本当に不満です。ハッピー/ 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であればシフトすることを選択します(この問題は十分に文書化されています)。
何がうまくいかないのか理解できますか?私はあなたの助けに本当に感謝しています、私は本当に問題を把握しようと風車で傾いています。
ええ、それはまさに問題であることが判明しました。私は昨日の午後、間違った場所で問題を探していて、問題が何であるか分かったら、実際には同じ解決法を得ました。ありがとう!このバグが私を殺していました。 –