27.08.2013 Views

documentación

documentación

documentación

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

se convierte en token anticipado. La acción en el estado 3 para el token B es shift 6; se apila el<br />

estado 6, y se borra el token anticipado. La pila ahora contiene los estados 0, 3, y 6. En el estado<br />

6, sin consultar el token anticipado, el parser reduce por:<br />

inicio : A B<br />

que es la regla 2. Dos estados, el 6 y el 3, son desapilados, dejando descubierto el estado 0.<br />

La acción en ese estado para inicio es un goto:<br />

inicio goto 2<br />

Se apila el estado 2 que se convierte en el estado actual. En el estado 2, el próximo token, C,<br />

debe ser leído. La acción es shift 5, así que el estado 5 es apilado, así que ahora la pila tiene los<br />

estados 0, 2, y 5, y se borra el token anticipado. En el estado 5, la única acción es reducir por la<br />

regla 3. Esta tiene un símbolo en el lado derecho, así que un estado, el 5, es desapilado, y el<br />

estado 2 queda descubierto. La acción para fin (el lado izquierdo de la regla 3) en el estado 2 es<br />

un goto al estado 4. Ahora, la pila contiene los estados 0, 2, y 4. En el estado 4, la única acción<br />

es reducir por la regla 1. Hay dos símbolos a la derecha, así que los dos estados de arriba son<br />

desapilados, descubriendo de nuevo el estado 0. En el estado 0, hay un goto para lista; causando<br />

que el parser entre al estado 1. En este estado, se lee la entrada, y se obtiene la marca de fin de<br />

archivo, indicada por $end en el archivo y.out. La acción en el estado 1 (cuando se encuentra la<br />

marca de fin) finaliza exitosamente el parsing.<br />

Usando Yacc<br />

Hay cuatro pasos para crear un parser:<br />

1. Escribir una especificación Yacc que describe la gramática. Este archivo usa la<br />

extensión .y por convención.<br />

2. Escribir un analizador léxico que puede producir una corriente de tokens. Esta rutina<br />

puede ser generada por Lex o codificada a mano en C. El nombre de la rutina léxica es<br />

yylex.<br />

3. Ejecutar Yacc sobre la especificación para generar el código fuente del parser. El<br />

archivo de salida es nombrado y_tab.c por Yacc.<br />

4. Compilar y vincular los archivos fuentes del parser y del analizador léxico y cualquier<br />

archivo de programa relacionado.<br />

El archivo de salida y_tab.c contiene una rutina de parsing llamada yyparse que llama a la<br />

rutina léxica yylex cada vez que necesita un token. Como Lex, Yacc no genera un programa<br />

completo; yyparse debe ser llamado desde una rutina main. Un programa completo también<br />

requiere una rutina de errores llamada yyerror que es llamada cuando yyparse encuentra un<br />

error. Tanto la rutina main como yyerror pueden ser provistas por el programador, aunque se<br />

proveen versiones por defecto de esas rutinas en las librerías de Yacc, y estas librerías pueden<br />

ser vinculadas al parser usando la opción -ly durante la compilación.<br />

Escribiendo una Especificación Yacc<br />

Una especificación Yacc describe una gramática libre de contexto que puede ser usada<br />

para generar un parser. Esta gramática tiene cuatro clases de elementos:<br />

1. Tokens, que son un conjunto de símbolos terminales<br />

2. Elementos sintácticos, que son un conjunto de símbolos no terminales<br />

3. Reglas de producción que definen un símbolo no terminal (el lado izq.) en términos de<br />

una secuencia de no terminales y terminales (lado derecho)<br />

8

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

Saved successfully!

Ooh no, something went wrong!