Pascalの文法を書く必要がありますが、問題を引き起こしていることが1つだけあります。
演算子があるとしましょう(優先度の低いものから高いものに並べ替えられます)。
- Postfix
^
。 - 接頭辞
^
。 [ ]
、及び.
、(同じ優先順位と左連想)。- 唯一の終端は
id
小文字であるです。
次に、式が次のとおりだとします。
- 任意のID。
- Postfix
^
演算子を使用した式。 - プレフィックス
^
演算子を含む任意の式。 - が
.
後に続く任意の式id
。 - とを含む任意の式
[
および]
。
次に、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つの競合を引き起こします。