These is a simplified version of the rules to resolve conflicts and ambiguities in a Yacc-like parser generator:
💡
Precedence Rules
- La precedencia de los tokens se hace en la cabecera del programa Jison; esto es: antes del primer
%%
usando la sintáxis%left token ...
,%right token ...
o%nonassoc token ...
- La precedencia de una regla de producción es la precedencia del último token que aparece en la parte derecha de la regla.
- Por ejemplo la precedencia de será la precedencia que le demos al token en la cabecera del programa Jison.
- Si no existen tokens en la parte derecha con precedencia asignada o bien si la precedencia por defecto no es la deseada, se puede usar la directiva
%prec
para asignar la precedencia deseada a la regla. Por ejemplo:asigna la precedencia del tokenexp: '-' exp %prec 'STRONG'
STRONG
a la reglaexp: '-' exp
- Cuando el parser detecta un conflicto y ve que hay dos posibles vias de continuar la construcción del árbol: Una que indica que quizá se aplicó la regla y otra que indica que quizá se pueda seguir leyendo el token a la entrada,
- El parser compara las precedencias del token y de la regla y se queda con el de mas prioridad.
- Si es el token quien tiene mayor prioridad avanzará en la lectura desplazando el token y buscando nuevos símbolos (se dice que hace un shift; en este caso el AST se "hundirá" a derechas) y
- Si es la regla completará el subárbol parcial y continuará en su construcción del árbol (se dice que hace un reduce y en este caso el árbol construido estará más hundido a izquierdas)
- Los tokens declarados en la misma línea mediante una declaración
%left
o%right
tienen igual precedencia e igual asociatividad. - La precedencia es mayor cuanto mas abajo su posición en el texto