27.08.2013 Views

documentación

documentación

documentación

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Debido a que un mismo número puede ser usado para identificar a una regla y también a un<br />

estado, puede producirse alguna confusión. La acción:<br />

. reduce 18<br />

se refiere a la regla 18 de la gramática, mientras que la acción:<br />

IF shift 34<br />

se refiere al estado 34.<br />

Supongamos que la regla:<br />

A : x y z ;<br />

está siendo reducida. La acción reduce depende del símbolo a la izquierda (A, en este caso)<br />

y el número de símbolos en el lado derecho (tres, en este caso). Al reducir, las tres estados en el<br />

tope de la pila se desapilan. (En general, el número de estados desapilados iguala al número de<br />

símbolos en el lado derecho de la regla). En efecto, estos estados eran los que se apilaron al<br />

reconocer x, y y z, y ya no servirán para ningún propósito. Al desapilar estos estados, queda<br />

descubierto el estado en que el parser estaba al comenzar a procesar la regla. Usando esta<br />

estado y el símbolo del lado izquierdo de la regla, se ejecuta un shift de un nuevo estado a pila, y<br />

el parsing continúa. Sin embargo, hay diferencias entre un shift normal y el procesamiento del<br />

símbolo del lado izquierdo, así que a esta acción se la llama goto. En particular, el token<br />

anticipado es borrado por un shift, pero no es afectado por un goto. Así que el estado<br />

descubierto al hacer el reduce contendrá una acción como la siguiente:<br />

A goto 20<br />

que produce que el estado 20 se apile y se convierta en el estado actual.<br />

En efecto, la acción reduce vuelve atrás el reloj del parser, desapilando estados hasta<br />

descubrir el estado en el que el lado derecho de la regla fue visto por primera vez. El parser se<br />

comporta, entonces, como si hubiera visto el lado izquierdo en ese momento.<br />

Las otras dos acciones del parser son conceptualmente mucho más simples. La acción<br />

accept indica que el parser ha visto la entrada completa y que ésta cumple con la<br />

especificación. Esta acción aparece sólo cuando el token anticipado es la marca de fin de<br />

archivo, e indica que parser ha completado su trabajo. La acción error representa un lugar<br />

donde el parser no puede continuar el proceso de acuerdo con la especificación. Los tokens que<br />

ha visto, junto con el anticipado, no pueden ser seguidos por nada que constituya una entrada<br />

legal. El parser reporta el error e intenta recuperar la situación y continuar con el parsing.<br />

Sea la siguiente especificación Yacc:<br />

%token A B C<br />

%%<br />

lista : inicio fin<br />

;<br />

inicio : A B<br />

;<br />

fin : C<br />

;<br />

Cuando Yacc es ejecutado con la opción -v, produce un archivo llamado y.out que contiene<br />

una descripción legible del parser. El archivo y.out correspondiente a la gramática anterior (con<br />

algunas estadísticas al final) es el siguiente:<br />

6

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!