Ich versuche, eine einfache Grammatik mit einem LALR (1) Parser-Generator zu analysieren (Bison, aber das Problem ist nicht spezifisch für dieses Tool), und ich treffe ein Shift-Reduce-Konflikt. Die Dokumentation und andere Quellen, die ich gefunden habe, um diese Festsetzung neigen dazu, eine zu sagen oder mehrere der folgenden Optionen:Wie man einen Shift-Reduce-Konflikt in einer eindeutigen Grammatik löst
- Wenn die Grammatik nicht eindeutig ist (zB if-then-else Mehrdeutigkeit), ändern Sie die Sprache, die Mehrdeutigkeit zu beheben .
- Wenn es sich um ein Operator-Vorrangproblem handelt, geben Sie den Vorrang explizit an.
- Übernehmen Sie die Standardauflösung und sagen Sie dem Generator, dass er sich nicht darüber beschweren soll.
jedoch keiner von ihnen scheint meine Situation anzuwenden: die Grammatik eindeutig ist, soweit ich das beurteilen kann (obwohl es natürlich mit nur einem Charakter von Look-Ahead-mehrdeutig ist), hat es nur einen Betreiber und die Die Standardauflösung führt dazu, dass Fehler bei richtiger Eingabe analysiert werden. Gibt es Techniken zur Überarbeitung der Definition einer Grammatik, um Shift-Reduce-Konflikte zu entfernen, die nicht in die obigen Buckets fallen?
Für Konkretion, hier ist die Grammatik in Frage:
%token LETTER
%%
%start input;
input: /* empty */ | input input_elt;
input_elt: rule | statement;
statement: successor ';';
rule: LETTER "->" successor ';';
successor: /* empty */ | successor LETTER;
%%
Die Absicht ist, durch Semikolons getrennt Zeilen der Form "[A-Za-z] +" oder „[A-Za-z parsen ] -> [A-Za-z] + ".
Bah, ich bin ein wenig rostig mit Compilation-Theorie ... Wissen Sie, wo der Konflikt in Ihrer Grammatik ist? –
Bison sagte: "POSIX sagt, dass die% Star Regel vor der %% Zeile erscheinen muss". –