PRECEDENCIA
La precedencia de una regla , esta determina por la precedencia del terminal mas a derecha de dicha regla.
La precedencia de los terminales , esta determina por el orden en que se declararon , el primer terminal declarado es el de mayor precedencia y así sucesivamente.
Entendiendo estos conceptos es suficiente para nuestro propósito.Podemos jugar el orden de declaración de los terminales para favorecer un shift o un reduce
Ejemplo
Reglas :
1 ) exp_a -> exp_a + exp_a
2 ) exp_a -> exp_a * exp_a
Entrada t : = x + t *p
En algún momento y tras varias reducciones ,nos encontraremos en esta situación :
exp_a + exp_a .* p
En este punto el parse puede reducir(incorrecto) por la regla 1 o seguir leyendo (correcto) he intentar
alcanzar la regla 2 .
La precedencia de la regla 1 , es la de su terminal más a la derecha "+" ,mientras que la precedencia de la regla 2 esta determinada por la precedencia del terminal "*".
En esta situación , debemos continuar leyendo ya que la multiplicación debe de realizar antes que la
suma.En la sección de "declaraciones de token" de nuestro fichero "fichero.y" , la declaración del token
"*" debe de preceder a la declaración del token "+".
Incorrecto :
....
%token SUMA
%token MULTIPLICACION
....
%%
Solución :
....
%token MULTIPLICACION
%token SUMA
....
%%
El archivo de bison lo puede descargar aqui
No hay comentarios:
Publicar un comentario