Estoy tratando de analizar una gramática en ocamlyacc (más o menos lo mismo que el yacc normal) que admite la aplicación de funciones sin operadores (como en Ocaml o Haskell) y el surtido normal de operadores binarios y unarios. Obtengo un conflicto de reducción/reducción con el operador '-', que puede usarse tanto para la sustracción como para la negación. Este es un ejemplo de la gramática que estoy usando:Resolviendo reducir/reducir el conflicto en 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) };
El problema es que cuando se obtiene una expresión como "A - B" el analizador no sabe si esto se debe reducir como "una (- b) "(negación de b, seguida de la aplicación) o" a - b "(sustracción). La reducción de la resta es correcta. ¿Cómo resuelvo el conflicto a favor de esa regla?
El '% left APPLY' /'% prec APPLY' resuelve la ambigüedad para 'a b c' - su asociativo de la izquierda (por lo que es (a b) c) y tiene precedencia menor que cualquier otra cosa. El problema es que las reglas de precedencia no funcionan para las ambigüedades que se manifiestan como reducir/reducir conflictos. –