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.
Antworten:
Ich sehe kein Problem mit Ihrer ersten Grammatik und Bison beschwert sich nicht über das Rendering, das ich damit gemacht habe.
Ich (und Bison) sehe einen Konflikt in Ihrer zweiten Grammatik (die nicht dieselbe Sprache beschreibt wie die erste BTW). Nachdem Sie
id id id
mit einem ausstehenden gesehen haben^
, wissen Sie nicht, ob Ihr letzterid
und der letzte^
ein F sein sollten oder ob Sie die drei IDs zusammenhalten sollten, um ein A zu bilden, das mit dem '^' gesammelt wird.Nach deinem Kommentar bearbeiten:
Eine direkte Wiedergabe Ihrer Regeln:
wird mehrdeutig sein - und daher Konflikte haben -, weil Sie nicht angeben, ob die Präfixversion von
^
Vorrang vor den anderen (Postfix-) Operatoren hat. Ich erinnere mich nicht, wie es in Pascal war, aber Sie können beide Effekte mit bekommenund
Nochmals bearbeiten: eine gemischte Version, die meinem Verständnis dessen entspricht, was Sie im Kommentar fragen (ich finde das weiterhin verwirrend und betrachte die Komplexität der Grammatik - mit zweimal angegebenen Postoperatoren - als Hinweis, dass dies so ist :-))
quelle
a.b^.c
. Ich habe es nur hinzugefügt, um zu zeigen, wo ich angefangen habe.a.b^.c
aus der ersten Grammatik :EXP -> POST -> POST . id -> POST ^ . id -> POST . id ^ . id -> id . id ^ . id
. Können Sie ein Beispiel für einen problematischen Ausdruck geben, der das Prioritätsproblem zeigt?