| 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

Introducción

> El programa de entrada tiene generalmente alguna estructura; cada programa aceptado esta definido como un lenguaje de entrada. Un lenguaje de entrada puede ser tan complejo como un lenguaje de programación, o tan sencillo como una secuencia de números.

> Desafortunadamente, los dispositivos de entrada usuales son muy limitados, difíciles, de usar y a menudo carecen de verificación de validez de sus propias entradas.

> El yacc proporciona una herramienta general para describir la entrada para un programa de la computadora. El nombre yacc quiere decir “yet another compiler-compiler”. El usuario del yacc especifica las estructuras de su entrada, junto con el código que se va a llamar a medida que se reconocen cada estructura. Yacc convierte tal especificación en una subrutina que maneja el proceso de entrada; frecuentemente, es conveniente y apropiado hacer que esta subrutina maneje el flujo de control de la aplicación del usuario.

> La subrutina producida por yacc llama a una rutina proporcionada por el usuario para devolver el siguiente elemento de entrada básico. Por lo tanto, el usuario puede especificar su entrada en términos de caracteres de entrada individuales o en términos de construcciones de nivel más alto, tales como nombres y números. La rutina proporcionada por el usuario puede también manejar características idiomáticas tales como convenciones de comentarios y de continuación, las cuales normalmente desafían las especificaciones gramaticales sencillas. La clase de especificaciones aceptadas es una clase muy general: gramáticas LALR con reglas que evitan la ambigüedad.

> Además de los compiladores de C, APL, Pascal, RATFOR, etc, yacc se ha usado también para lenguajes menos convencionales, incluyendo un lenguaje de fotocomposición, varios lenguajes de calculadoras de escritorio, un sistema de recuperación de documentos, y un sistema de depuración FORTRAN.

> Yacc está escrito en un dialecto portátil de C y las acciones, y las subrutina de salida, están también en C. Lo que es más, muchas de las convenciones sintácticas del yacc siguen las del lenguaje C.

> Por ejemplo, una regla gramatical puede ser:

> fecha : nombre-mes día ‘,’ año;

> Aquí, fecha, nombre-mes, día, y año representan estructuras de interés en el proceso de entrada; presumiblemente, nombre-mes, día y año están definidos en algún otro lugar. La coma ( , ) está incluida entre comillas simples; esto implica que la coma va a aparecer literalmente en el entrada. El punto y coma y los dos puntos sirven simplemente como puntuación, y no tienen significado en el control del entrada. Por lo tanto, con las definiciones correctas, la entrada siguiente:

> julio 4, 1776

> Puede coincidir con la regla anterior.

> Una parte importante del proceso de entrada se lleva a cabo por medio del analizador léxico. Esta rutina de usuario lee el entrada reconociendo las estructuras de nivel bajo, y comunica estos tokens al parser. A las estructuras que el analizador léxico reconoce se les llama “símbolo terminal”, mientras que la estructura que reconoce el parser se le llama “símbolo no terminal”. Para evitar confusión, normalmente a los símbolos terminales se les conoce como tokens.

> Hay un considerable retraso para decidir si reconocer estructuras usando el analizador léxico o usando las reglas gramaticales. Por ejemplo, las reglas

> nombre-mes : ‘E’ ‘n’ ‘e’ ;
> nombre-mes : ‘F’ ‘e’ ‘b’ ;
> ...
> nombre-mes : ‘D’ ‘i’ ‘c’ ;

> Se podrían usar en el ejemplo anterior. El analizador léxico sólo necesitaría reconocer letras individuales, y nombre-mes sería un símbolo no terminal. Tales reglas de bajo nivel tienden a desperdiciar tiempo y espacio, y pueden complicar la especificación fuera del alcance de la habilidad de yacc para tratar con él. Normalmente el analizador léxico reconocerá los nombres de mes y devolverá una indicación de que se ha visto uno; en este caso, el nombre-mes sería un token.

> Los caracteres literales, tales como la coma, tienen que pasarse a través del analizador léxico y se consideran tokens.
> Los archivos de especificación son muy flexibles. Es relativamente fácil añadir al ejemplo anterior la regla:

> fecha : nombre-mes ‘/’ dia ‘/’ año; permitiendo
> 7 / 4 / 1776

> como un sinónimo de julio 4, 1776

> En la mayoría de los casos, esta nueva regla se podría deslizar en un sistema de trabajo con un mínimo de esfuerzo, y muy poco peligro de interrumpir la entrada existente.

> La entrada que se está leyendo puede que no reúna las especificaciones. Estos errores de la entrada se detectan tan pronto como teóricamente sea posible con una exploración de izquierda a derecha; por lo tanto, no sólo se reduce la posibilidad de leer y calcular con unos datos de entrada erróneos, sino que los datos erróneos se pueden localizar rápidamente. El manejo de errores, proporcionado como parte de las especificaciones de la entrada, permite el volver a introducir de nuevo errores en los datos, o la continuación del proceso de entrada después de saltar sobre los datos erróneos.

> En algunos casos, yacc falla al producir un parser cuando se le da un grupo de especificaciones. Por ejemplo, las especificaciones pueden ser contradictorias, o pueden requerir un mecanismo de reconocimiento más potente que el disponible para yacc. Los primeros casos representan errores de diseño; los últimos casos pueden a menudo corregirse haciendo el analizador léxico más potente, o volviendo a escribir algunas de las reglas gramaticales. Aunque yacc no puede manejar todas las especificaciones posibles, su potencia se compara favorablemente con sistemas similares; lo que es más, las construcciones que son difíciles de manejar para yacc son también frecuentemente difíciles de manejar par nosotros mismos. Algunos usuarios han informado que la disciplina de formular especificaciones yacc válidas para su entrada han revelado errores de concepción o diseño al principio del desarrollo del programa.

> Las próximas secciones siguientes describen:

> - La preparación de las reglas gramaticales.

> - La preparación de las acciones proporcionadas por el usuario relacionado con las reglas gramaticales.

> - La preparación de analizadores léxicos.

> - El funcionamiento del parser.

> - Varias razones por las que yacc puede ser incapaz de producir un parser partiendo de una especificación, y qué hacer acerca de ello.

> - Un simple mecanismo para manejar las precedencias de los operadores en las expresiones aritméticas.

> - Detección y recuperación de errores.

> - El entorno operativo y los dispositivos especiales de los parsers que yacc produce.

> Son algunos consejos sobre lo que podría mejorar el estilo y eficacia de las especificaciones.

> 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