Ich habe versucht, eine scheinbar einfache Verschiebung zu bewältigen/Konflikt ohne Erfolg zu reduzieren. Natürlich funktioniert der Parser gut, wenn ich den Konflikt einfach ignoriere, aber ich würde mich viel sicherer fühlen, wenn ich meine Regeln reorganisiere. Hier habe ich eine relativ komplexe Grammatik zu dem einzigen Konflikt vereinfacht:Shift/reduce Konflikt in yacc wegen Look-Ahead Token Begrenzung?
statement_list
: statement_list statement
|
;
statement
: lvalue '=' expression
| function
;
lvalue
: IDENTIFIER
| '(' expression ')'
;
expression
: lvalue
| function
;
function
: IDENTIFIER '(' ')'
;
Mit der Option verbose in yacc, erhalte ich diese Ausgabedatei beschreibt den Zustand mit dem erwähnten Konflikt:
state 2
lvalue -> IDENTIFIER . (rule 5)
function -> IDENTIFIER . '(' ')' (rule 9)
'(' shift, and go to state 7
'(' [reduce using rule 5 (lvalue)]
$default reduce using rule 5 (lvalue)
Thank Sie für jede Hilfe.
Ich hatte eine solche Eingabe nicht berücksichtigt. Nun, die Sprache, die ich analysiere, erfordert eine solche Mehrdeutigkeit, dass ich den Konflikt einfach ignorieren werde. – Skyler