LALR文法でのreduce reduceおよびshift reduce error


7

Pascalの文法を書く必要がありますが、問題を引き起こしていることが1つだけあります。

演算子があるとしましょう(優先度の低いものから高いものに並べ替えられます)。

  1. Postfix^
  2. 接頭辞^
  3. [ ]、及び.、(同じ優先順位と左連想)。
  4. 唯一の終端はid小文字であるです。

次に、式が次のとおりだとします。

  1. 任意のID。
  2. Postfix^演算子を使用した式。
  3. プレフィックス^演算子を含む任意の式。
  4. .後に続く任意の式id
  5. とを含む任意の式[および]

次に、shift-reduceとreduce-reduceの競合なしにLALR文法を作成する方法、またはそれができない場合は、それができないことをどのように証明できるかを知りたいです。

いくつかの例:

good:
a.b.c.d               
a.b^.c
^a.b^
a.b^^[c]^^.d.e        
^^a.b^.d.e^[]

bad:
a.^b.c

接頭辞がなければ^、この問題は簡単に解決できますが、接頭辞の記号が原因で問題が解決しません。誰か助けてもらえますか?これまでの私の解決策:

// this works without the prefix but it does not produce a.b^.c which is wrong.
A ::= B | A ^ ;
B ::= C | ^ B ;
C ::= id | C [ A ] | C . id;

したがって、接頭辞は最初のドットの前にのみ発生し、ドットの間には、後置記号^と角括弧しか存在できないと考えました。だから私はこれを思いつきました:

A ::= B | A ^ ;
B ::= C | ^ B ;
C ::= id | C [ A ] |id D;
D ::= id E;
F ::= E | F ^;
E ::= id | F . id;

しかし、これは3つの競合を引き起こします。


Pascal時代のプレフィックス^をまったく覚えていません。そして^^を含む構文は絶対にありません。Pascalは再帰的降下で解析できるように注意深く設計されており、LL(1)はLR(0)の厳密なサブセットです。
フォンブランド2013

回答:


4

私はあなたの最初の文法に何の問題も見ていません、そしてバイソンは私がそれをしたレンダリングについて文句を言いません。

私(およびバイソン)は、2番目の文法(最初のBTWと同じ言語を記述していない)で1つの矛盾を見つけました。id id id保留中^ので見た後、最後のとがFであるかどうか、または「^」で収集されるAを形成する3つのIDを一緒に保持idする^必要があるかどうかがわかりません。


コメントの後に編集します。

ルールの直接レンダリング:

EXP ::= id | EXP ^ | ^ EXP | EXP . id | EXP [ EXP ]

はあいまいになります。つまり、競合が発生します。これは、のプレフィックスバージョンが^他の(ポストフィックス)演算子よりも優先されるかどうかを指定しないためです。パスカルでどうだったか覚えていませんが、両方の効果を得ることができます

EXP ::= POST | ^ EXP
POST ::= id | POST ^ | POST . id | POST [ EXP ]

そして

EXP ::= PRE | EXP ^ | EXP . id | EXP [ EXP ]
PRE ::= id | ^ PRE

もう一度編集します。コメントであなたが尋ねたことに対する私の理解に対応する混合バージョン(私はこれを混乱させ続け、文法の複雑さを考慮します— post演算子が2回指定されているため、ヒントとしてそうです:-))

EXP ::= PRE | POST2
POST2 ::= PRE '^' | POST2 '^' | POST2 '.' id | POST2 '[' EXP ']'
PRE ::= POST | '^' PRE
POST ::= id | POST '.' id | POST '[' EXP ']'

最初の文法には矛盾はありませんが、が生成されないため、誤りa.b^.cです。どこから始めたのかを示すために追加しました。
zidarsk8 2012

ソリューションには2つの問題があります。1つ目は、ab ^ .cのように、質問に挙げた優れた例がすべて生成されないことです。2つ目は、優先度が考慮されないため、間違った式ツリーが作成されることです。
zidarsk8

@ zidarsk8、a.b^.c最初の文法からの派生:EXP -> POST -> POST . id -> POST ^ . id -> POST . id ^ . id -> id . id ^ . id。優先問題を示す問題のある表現の例を挙げていただけますか?
AProgrammer

最初のバージョン:接尾辞^は、接頭辞^演算子よりも優先されます(それは良くありません)。2番目のバージョン:接頭辞^はドット演算子よりも優先されます(これも適切ではありません)。結合されたバージョンは、ab ^ .cを生成できないバージョンです。優先順位の問題は、それがどのように解析されるかということですab ^ .cは((ab)^)。c ...であり、(a。(b ^))。c ...ではなく^ b ^は解析されるべきです(^ b)^。試していただきありがとうございます。申し訳ありませんが、解決策を断っていますが、機能しません。
zidarsk8 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.