Вы находитесь на странице: 1из 6

LENGUAJES FORMALES Y AUTMATAS

PRCTICA DE LABORATORIO 6
En esta prctica estudiaremos cmo se tratan en la herramienta bison ciertos tipos de ambigedades gramaticales. Bsicamente estudiaremos ciertas reglas que nos permitirn resolver los conflictos de desplazamiento/reduccin. En principio bison propone una solucin por defecto, que consiste en optar siempre por el desplazamiento. Sin embargo, el lengua e de especificacin incorpora, adems, elementos que permitirn al dise!ador de la gramtica, elegir en cada caso la opcin que desee. Representac !n te"t#a$ %e$ a#t!&ata "on la opcin -v de la herramienta bison, adems de generarse un reconocedor sintctico se crea un fichero de te#to en el que se describe el autmata $%$&'() asociado a la gramtica especificada. *or e emplo si al siguiente fichero de entrada '"anasint.y")+ %token NUMERO %% expre : expre '+' expre | expre '*' expre | NUMERO ; le aplicamos la herramienta bison con la opcin -v+ bison -oanasint.c - d -v anasint.y obtenemos 'adems de los ficheros "anasint.h" , "anasint.c") un fichero denominado "anasint.out" que contendr ciertas estad-sticas relativas a la gramtica, , lo que a nosotros ms nos interesa, la definicin te#tual del autmata. Esta definicin te#tual consistir en una descripcin de cada uno de los estados que componen el autmata, por e emplo+ state 2 expre expre -> -> expre . '+' expre expre . '*' expre (rule 1) (rule 2)

$ '+' '*'

go to state 7 shift, and go to state 3 shift, and go to state 4

$a anterior es la definicin del estado . del autmata, en ella se muestran los -tems que componen el estado, , las acciones a realizar desde dicho estado ante los s-mbolos '$' 'fin de fichero), '+' , '*'. In'(r&e %e c(n'$ ct(s /na de los usos ms importantes de la definicin te#tual dada en "anasint.out" es la de la localizacin de conflictos. %l procesar la gramtica anterior, bison slo nos informa de cuntos conflictos tiene, este avis lo llevar a cabo con el siguiente mensa e que aparecer tras la llamada a bison+

anasint.y contains 4 shift/reduce conflicts *ara saber qu0 reglas han provocado los conflictos tenemos que mirar en el fichero "anasint.out". En nuestro e emplo dos de los conflictos estn localizados en el estado 1, he aqu- la definicin de dicho estado+ state 5 expre expre expre '+' '*' -> -> -> expre . '+' expre expre '+' expre . expre . '*' expre (rule 1) (rule 1) (rule 2)

shift, and go to state 3 shift, and go to state 4

'+' [reduce using rule 1 (expre)] '*' [reduce using rule 1 (expre)] $default reduce using rule 1 (expre) "omo se puede observar estando en este estado , ante la aparicin del s-mbolo terminal '+' podemos desplazarlo hacia la pila o bien podemos aplicar la regla n2mero (. En la misma situacin nos encontramos cuando el siguiente s-mbolo es '*'. *or 2ltimo la accin asociada a $default es la que se aplica ante cualquier otro s-mbolo que no sea ni '+' ni '*'. N(r&a por defecto $os dos tipos de conflictos que nos podemos encontrar son+ shift/reduce 'desplazamiento/reduccin) reduce/reduce 'reduccin/reduccin) El primero de ellos ocurre cuando ante un s-mbolo terminal podemos, o bien desplazarlo hacia la pila o bien reducir lo que ha, en la pila aplicando una regla gramatical. $os dos conflictos que aparec-an en el estado 1 del e emplo anterior son de este tipo. El segundo tipo de conflictos ocurre cuando en un determinado estado se pueden reducir dos reglas distintas con los s-mbolos que ha, en la cima de la pila. Este tipo de conflictos es bastante inusual, , suele obedecer a un mal dise!o de la gramtica. "uando bison detecta un conflicto se decanta siempre por una de las dos opciones 'a no ser que e#pl-citamente le indiquemos otra cosa). $a decisin de cul es la opcin que debe tomar se basa en las siguientes normas+ %nte un conflicto de desplazamiento/reduccin se elige el desplazamiento. %nte un conflicto de reduccin/reduccin se elige la reduccin por aquella regla que se ha,a escrito antes en la definicin de la gramtica. $a aplicacin de estas normas no significa que bison detecte cul es la opcin adecuada en cada caso, simplemente se decanta por una de ellas a ciegas. Esto significa que para saber e#actamente qu0 lengua e reconoce una determinada gramtica debemos analizar los conflictos , resolverlos e#pl-citamente, sin conformarnos directamente con la solucin por defecto que asume bison. Prece%enc a ) as(c at * %a% %e (pera%(res "omo hemos dicho antes, los conflictos se resuelven de manera general aplicando unas normas por defecto, sin embargo bison tambi0n ofrece la posibilidad de cambiar esas

normas para que el dise!ador de la gramtica tenga la posibilidad de decidir en cada caso qu0 opcin es la ms adecuada. *ara comprender estos mecanismos es necesario definir previamente los conceptos de asociatividad , precedencia. En principio, estudiaremos estos conceptos vinculados a los operadores de las e#presiones aritm0ticas, aunque 'como veremos en el e ercicio 3) podrn ser generalizables a otros constructores ling-sticos. %sociatividad $a asociatividad de un operador binario nos dice en qu0 sentido tenemos que evaluar una secuencia de aplicaciones de dicho operador. *or e emplo la e#presin+ .4.4. puede evaluarse de dos formas distintas+ '.4.)4. 4. .4'.4.) 5 la primera de ellas supone que la aplicacin del operador '-' se hace de izquierda a derecha, mientras que la segunda supone que se hace de derecha a izquierda. 6e las dos, la que se asume 'por convencin) como correcta es la primera. Se dice por tanto, que el operador '-' es asociativo por la izquierda. En bison indicaremos que el operador '-' es asociativo por la izquierda con la orden %left que se inclu,e en la zona de definiciones+ %header{ ... %} ... %left '-' %% ... 7ambi0n son asociativos por la izquierda los operadores aritm0ticos '+', '*' , '/'. Si queremos que un operador sea asociativo por la derecha lo declararemos con la orden %right. $a potencia ''^') es un e emplo de operador asociativo por la derecha+ %right '^' *or 2ltimo si queremos indicar que un operador no es asociativo lo podemos indicar con la orden %nonassoc. *or e emplo los operadores relacionales+ %nonassoc '>' "on ello evitamos que se reconozcan como vlidas secuencias como 2<2<3 a pesar de que en la gramtica se inclu,a una regla como la que sigue+ expr : ... | expre '<' expre ; *recedencia Si la asociatividad nos dice qu0 hacer ante una secuencia de aplicaciones de un mismo operador, la precedencia nos dice qu0 hacer cuando combinamos operadores distintos. *or e emplo la e#presin .8.9. puede evaluarse de dos formas distintas+ '.8.)9. : .8'.9.) ;

6e las dos, la que se asume como vlida es la segunda. Se dice por tanto, que el operador <9< es ms prioritario 'o tiene ms precedencia) que el <8<. *ara indicar esta propiedad en bison, colocaremos varias instrucciones de definicin de asociatividad, de manera que las que aparezcan antes implicarn menor precedencia que las que aparezcan despu0s. $os s-mbolos que se inclu,an en la misma instruccin de definicin de asociatividad tendrn la misma precedencia. *or e emplo+ %left '+' '-' %left '*' '/' indica que '+' , '-' tienen la misma precedencia, pero menos que '*' , '/'. Prece%enc a ) as(c at * %a% %e #na re+$a "on lo visto anteriormente podemos definir la precedencia , la asociatividad de s-mbolos terminales. Sin embargo, para resolver conflictos nos hace falta tambi0n asociar precedencias a las reglas gramaticales. =a, para ello una norma por defecto+ $a precedencia de la regla se calcula en base a los s-mbolos de su parte derecha. En concreto es la del 2ltimo s-mbolo terminal de su parte derecha. *or e emplo dadas las reglas+ simb : simb '+' simb '-' simb | simb '/' simb ; $a precedencia de la primera coincide con la definida para el s-mbolo terminal '-' , la de la segunda con la definida para el s-mbolo terminal '/'. En algunos casos nos puede interesar calcular una precedencia espec-fica para una determinada regla. *or e emplo, las siguientes reglas de e#presiones tendr-an en pricipio la misma precedencia+ expre : expre '-' expre | '-' expre ... ; ,a que en las dos, el 2ltimo s-mbolo terminal '-'. Sin embargo para resolver el conflicto de desplazamiento/reduccin que se plantea entre ellas necesitamos indicar que la segunda es ms prioritaria que la primera. *ara hacer eso debemos inventarnos un token ficticio con ms precedencia que '-' , asignarle a la segunda regla 'mediante la orden %prec) la precedencia de este token ficticio+ %{ ... %} ... %left '-' %left MENOS ... %% ... expre : expre '-' expre | '-' expre %prec MENOS ... ; Res($#c !n espec,' ca %e c(n'$ ct(s

Bison va a utilizar la informacin de asociatividad , precedencia de s-mbolos , reglas para resolver los conflictos de desplazamiento/reduccin. 6e esta forma tenemos dos opciones a la hora de resolver este tipo de conflictos, o bien de arlo en manos de la norma por defecto, o bien dndole una solucin espec-fica al asignar informacin de precedencia , asociatividad a los elementos involucrados en el conflicto. %nte un conflicto de desplazamiento/reduccin ante un s-mbolo simb , una regla regl, las normas espec-ficas que hacen uso de esta informacin son las siguientes+ Si la precedencia de simb es ma,or que la de regl bison se decanta por el desplazamiento. Si la precedencia de simb es menor que la de regl bison se decanta por la reduccin. Si la precedencia de simb es igual a la de regl, debemos mirar la asociatividad - Si simb es asociativo por la izquierda+ reduccin - Si simb es asociativo por la derecha+ desplazamiento - Si simb es no asociativo+ error *or e emplo, para resolver el primero de los conflictos que se daban en el estado 1 'entre la regla expre: expre '+' expre , el s-mbolo '+') debemos indicar que '+' es asociativo por la izquierda. *ara resolver el segundo de los conflictos del estado 1 'entre la regla expre: expre '+' expre , el s-mbolo '*') debemos indicar que '*' es ms prioritario que '+'. %mbas cosas se especifican con las siguientes instrucciones ', en ese orden)+ %left '+' %left '*' /na vez que bison resuelve un conflicto utilizando informaciones de precedencias , asociatividades de a de informar de ellos. Esto no quiere decir que los conflictos de en de e#istir, sino que han sido resueltos por informaciones dadas por el dise!ador de la gramtica, , bison por tanto no se responsabiliza de ellos. C!&( c(&pr(-ar e$ (r%en %e ap$ cac !n %e $as re+$as %l igual que en flex, en las especificaciones bison podemos insertar cdigo en ". *odremos hacerlo en cualquier lugar de la parte derecha de una regla encerrando entre llaves el cdigo. *or e emplo+ %{ #include <stdio.h> %} %token NUMERO %left '+' %left '*' %% expr : expr '+' expr {printf("\n expr : expr '+' expr");} | expr '-' expr {printf("\n expr: expr '-' expr");} | NUMERO {printf("\n expr : NUMERO");} ; %%

.... %s-, cada vez que se efect2e una reduccin se mostrar en la salida cul ha sido la regla elegida. Esto nos servir para comprobar cmo se resuelven los conflictos. E.erc c (s (. "ompilar , e ecutar el 2ltimo e emplo del enunciado. "alcular manualmente el autmata $&'() , contrastarlo con el que aparece en el fichero >anasint.out". .. "ambiar la precedencia , asociatividad de los s-mbolos <8< , <9< , comprobar cmo influ,e en el orden de aplicacin de producciones. 3. Escribir una gramtica completa para las e#presiones aritm0ticas , resolver adecuadamente los conflictos que se presenten. Se debern contemplar los operadores de suma, resta, divisin, multiplicacin, potencia , menos unario 'p.e. 3). ?. Escribir una gramtica que e#tienda las e#presiones del e ercicio anterior para que se admitan e#presiones relacionales , lgicas. &esolver adecuadamente los conflictos que se presenten. Se debern contemplar los operadores ma,or '>), menor '<), igual '=), distinto '!=), Y lgico '&), O lgico '|) , NO lgico '~). 1. Escribir una gramtica para las e#presiones regulares, resolviendo los conflictos que aparezcan. ;. "ompilar la siguiente especificacin , resolver el conflicto que aparece tras la introduccin de las dos posibles formas de la estructura SI-SINO+ instruccion : SI '('expr')' instruccion sino_opcional | IDENT '=' expr ';' | '{' instrucciones '}' ; sino_opcional : SINO instruccion | /* lambda */ ; instrucciones : instruccion | instrucciones instruccion ;

Вам также может понравиться