Ich versuche, eine Grammatik in ocamlyacc (ziemlich genau das gleiche wie reguläre yacc) zu analysieren, die Funktion Anwendung ohne Operatoren (wie in Ocaml oder Haskell) und das normale Sortiment unterstützt von binären und unären Operatoren. Ich bekomme einen Konflikt mit dem Operator '-', der sowohl für die Subtraktion als auch für die Negation verwendet werden kann. Hier ist ein Beispiel der Grammatik Ich verwende:Auflösung reduzieren/reduzieren Konflikt in yacc/ocamlyacc
%token <int> INT
%token <string> ID
%token MINUS
%start expr
%type <expr> expr
%nonassoc INT ID
%left MINUS
%left APPLY
%%
expr: INT
{ ExprInt $1 }
| ID
{ ExprId $1 }
| expr MINUS expr
{ ExprSub($1, $3) }
| MINUS expr
{ ExprNeg $2 }
| expr expr %prec APPLY
{ ExprApply($1, $2) };
Das Problem ist, dass, wenn Sie einen Ausdruck wie erhalten „a - b“ der Parser nicht weiß, ob dies sollte reduziert werden, als „a (- b) "(Negation von b, gefolgt von der Anwendung) oder" a - b "(Subtraktion). Die Subtraktionsreduktion ist korrekt. Wie kann ich den Konflikt zugunsten dieser Regel lösen?
Das '% links APPLY' /'% prec APPLY' löst die Ambiguität für 'a b c' - seine linke assoziative (also seine (a b) c) und niedrigere Priorität als alles andere. Das Problem besteht darin, dass Vorrangregeln nicht für Mehrdeutigkeiten gelten, die Konflikte reduzieren/reduzieren. –