Ich muss eine Grammatik für Pascal schreiben, und es gibt nur eine Sache, die Probleme verursacht.
Nehmen wir an, wir haben Operatoren (sortiert nach Priorität von niedrig nach hoch):
- Postfix
^
. - Präfix
^
. [ ]
, und.
, (gleiche Priorität und linker Assoziativ).- Das einzige Terminal
id
ist ein Kleinbuchstabe.
Nehmen wir nun an, ein Ausdruck ist:
- Beliebige ID.
- Beliebiger Ausdruck mit dem Postfix-
^
Operator. - Beliebiger Ausdruck mit dem Präfixoperator
^
. - Jeder Ausdruck mit
.
gefolgt vonid
. - Jeder Ausdruck mit
[
und ein anderer Ausdruck und]
.
Jetzt möchte ich wissen, wie ich eine LALR-Grammatik ohne Shift-Reduce- und Reduce-Reduce-Konflikte erstellen kann, ODER wenn dies nicht möglich ist, wie kann ich beweisen, dass dies nicht möglich ist.
Einige Beispiele:
good:
a.b.c.d
a.b^.c
^a.b^
a.b^^[c]^^.d.e
^^a.b^.d.e^[]
bad:
a.^b.c
Ohne das Präfix ^
ist dieses Problem leicht zu lösen, aber das Präfixzeichen bringt mich immer wieder auf den Punkt. Kann jemand helfen? Meine bisherigen Lösungen:
// 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;
Daher dachte ich, dass das Präfix nur vor dem ersten Punkt auftreten kann und zwischen Punkten nur ein Postfix ^
und Klammern stehen können. Also habe ich mir Folgendes ausgedacht:
A ::= B | A ^ ;
B ::= C | ^ B ;
C ::= id | C [ A ] |id D;
D ::= id E;
F ::= E | F ^;
E ::= id | F . id;
Dies führt jedoch zu 3 Konflikten.