| INSTITUTO POLITÉCNICO NACIONAL ESCUELA SUPERIOR DE CÓMPUTO |

Introducción | Contenido | Bibliografía

Introducción
Contenido
UNIDAD I
UNIDAD II
UNIDAD III
UNIDAD IV
UNIDAD V Introducción 5.1 Estructura de un programa en YACC 5.2 Definición del tipo de la pila de YACC 5.3 Terminales y no terminales en YACC

5.4 Precedencia y asociatividad en YACC

5.5 Manejo de Errores en YACC

5.6 Desarrollo de una aplicación utilizando LEX y YACC

UNIDAD VI
UNIDAD VII
UNIDAD VIII
UNIDAD IX
PROBLEMARIO
Bibliografía

5.3 Terminales y no terminales en YACC

> Yacc proporciona una herramienta general para imponer estructuras de entrada a un programa de computadora. El usuario de yacc prepara una especificación del proceso de entrada; esto incluye reglas que describen la estructura de entrada, código que se va a llamar cuando estas reglas sean reconocidas, y una rutina de bajo nivel para hacer la entrada básica.

> Entonces yacc genera una función para controlar el proceso de entrada. Esta función, llamada parser, llama a la rutina de entrada de bajo nivel proporcionada por el usuario (llamada analizador léxico) para recopilar los elementos básicos (llamados tokens) de la entrada. Estos tokens están organizados según las reglas de estructuras de entrada, llamadas reglas gramaticales; cuando una de estas reglas ha sido reconocida, entonces se llama al código de usuario proporcionado por esta regla, en acción; las acciones tienen la habilidad de devolver valores y hacer uso de los valores de otras acciones.

> El corazón de la especificación de entrada es una colección de reglas gramaticales.

> Cada regla describe una estructura permisible y le da un nombre.

> La sección de reglas está formada de una o más reglas gramaticales. Una regla gramatical tiene la forma:

> A : CUERPO;

> A representa un nombre no terminal, y CUERPO representa una secuencia de cero o más nombres y literales. Los dos puntos o el punto y coma son puntuaciones yacc.

> Los nombres pueden tener longitud arbitraria, y pueden estar compuestos de letras, el punto ( . ), el símbolo de subrayado ( _ ) y dígitos no iniciales. Las letras mayúsculas y minúsculas son distintas. Los nombres que se usan en el cuerpo de una regla gramatical pueden representar tokens o símbolos no terminales.

> Una literal consta de un carácter incluido entre comillas simples ( ‘ ). Al igual que en C, el signo barra invertida ( \ ) es un carácter de escape dentro de literales, y se reconocen todos los caracteres de escape de C. Por lo tanto:

> ‘ \n ’ Newline
> ‘ \r ’ Retorno de carro
> ‘ \” ’ Comillas simples
> ‘ \\ ’ Barra invertida
> ‘ \t ’ Tabulador
> ‘ \b ’ Backspace
> ‘ \f ’ Salto de página
> ‘ \xxx ‘ “xxx” en octal

> Por un número de razones técnicas, el carácter ASCII NUL (‘ \0 ' o 0) no se deberá usar nunca en reglas gramaticales.
> Si hay varias reglas gramaticales con el mismo término izquierdo, entonces se puede usar la barra vertical para evitar volver a escribir el término izquierdo. Además, el punto y coma al final de una regla se puede omitir delante de una barra vertical. Por lo tanto las reglas gramaticales.

> A : B C D ;
> A : E F ;
> A : G ;

> Se pueden dar en yacc como:

> A : B C D
> | E F
> | G
> ;

> No es necesario que todas las reglas gramaticales con el mismo término izquierdo aparezcan juntas en la sección de reglas gramaticales, aunque esto hace a la entrada mucho más legible, y es más fácil de cambiar.

> Si un símbolo no terminal coincide con el literal vacío. Esto se puede indicar de una forma obvia:

> vacio : ;

> Los nombres que representan tokens tienen que ser declarados; esto se hace más fácilmente escribiendo

> %token nombre1 nombre2 ...

> Cada símbolo no terminal tiene que aparecer en el término izquierdo de al menos una regla.

> De todos los símbolos no terminales, uno, llamado el símbolo de comienzo, tiene una particular importancia. El parser está diseñado para reconocer el símbolo de comienzo; por lo tanto, este símbolo representa la estructura mayor y más general descrita por las reglas gramaticales. Por defecto, el símbolo de comienzo se toma como el término izquierdo de la primera regla gramatical de la sección de reglas. Es posible, y de hecho deseable, declarar explícitamente el símbolo de comienzo en la sección de declaraciones, usando la palabra reservada %start:

> % start symbol

> El final de la entrada para el parser se señala por medio de un token especial llamado “señal de final”. Si los tokens, hasta, pero no incluyendo, la señal de final forman una estructura la cual coincide con el símbolo de comienzo, la función parser regresa a quien la ha llamado después de que se reconoce la señal de final y éste acepta la entrada. Si la señal de final se ve en cualquier otro contexto, esto es un error.

> Es misión del analizador léxico proporcionado por el usuario devolver la señal de final cuando sea apropiado.

> Normalmente la señal de final representa un estado de I/O obvio, tal como el final del archivo o el final de un registro.

> Atrás Siguiente

##### Introducción / Contenido / Unidad I / Unidad II / Unidad III / Unidad IV / Unidad V / Unidad VI / Unidad VII / Unidad VIII / Unidad IX / Problemario / Bibliografía

##### Inicio

##### Créditos

José Sánchez Juárez, Andrés Ortigoza Campos, Fabiola Ocampo Botello