INTRODUCCION A YACC
Yacc proporciona una herramienta general para imponer la estructura ante la entrada a un programa de computadora. El usuario de Yacc prepara una especificación del proceso de entrada; esto incluye las reglas que describen la estructura de la entrada, el código que se invocarán cuando se reconocen estas reglas, y una rutina baja para hacer la entrada básica. Yacc entonces genera una función para controlar el proceso de entrada. Esta función, llamada un programa de análisis, llama la rutina baja user-supplied de la entrada (el analizador léxico) para tomar los artículos básicos (llamados símbolo) del flujo de entradas. Este símbolo se organiza según las reglas de la estructura de la entrada, llamadas las reglas de la gramática; cuando una de estas reglas se ha reconocido, después se invoca el código del usuario proveió para esta regla, una acción,; las acciones tienen la capacidad de volver valores y de hacer uso los valores de otras acciones.
Yacc se escribe en un dialecto portable de C[1 ] y de las acciones, y el subprograma de la salida, está en C también. Por otra parte, muchas de las convenciones sintácticas de Yacc siguen C.
El corazón de la especificación de la entrada es una colección de reglas de la gramática. Cada regla describe una estructura permisible y le da un nombre. Por ejemplo, una regla de la gramática pudo ser
fecha: día del month_name ', ' año;
Aquí, la fecha, el month_name, el día, y el año representan las estructuras del interés en el proceso de entrada; probablemente, el month_name, el día, y el año se definen a otra parte. La coma ``,'' se incluye en apóstrofes; esto implica que la coma es aparecer literalmente en la entrada. El servicio de los dos puntos y del punto y coma simplemente como puntuación en la regla, y no tiene ninguna significación en controlar la entrada. Así, con definiciones apropiadas, la entrada
De julio el 4 de 1776
pudo ser emparejado por la regla antedicha.
Una parte importante del proceso de entrada es realizada por el analizador léxico. Esta rutina de usuario lee el flujo de entradas, reconociendo las estructuras de nivel inferior, y comunica este símbolo al programa de análisis. Por razones históricas, una estructura reconocida por el analizador léxico se llama un símbolo terminal, mientras que la estructura reconocida por el programa de análisis se llama un símbolo no terminal. Para evitar la confusión, los símbolos terminales serán referidos generalmente como símbolo.
Hay abatimiento considerable en decidir a si reconocer las estructuras usando las reglas léxicas del analizador o de la gramática. Por ejemplo, las reglas
month_name: ' J ' ' a ' ' n '; month_name: ' F ' ' e ' ' b '; . . . month_name: ' D ' ' e ' ' c ';
pudo ser utilizado en el ejemplo antedicho. El analizador léxico necesitaría solamente reconocer letras individuales, y el month_name sería un símbolo no terminal. Tales reglas bajas tienden para perder tiempo y el espacio, y pueden complicar la especificación más allá de la capacidad de Yacc de ocuparse de ella. Generalmente, el analizador léxico reconocería los nombres del mes, y vuelve una indicación que un month_name fue considerado; en este caso, el month_name sería un símbolo.
Los caracteres literales tales como ``,'' se deben también pasar a través del analizador léxico, y también se consideran símbolo.
Los archivos de la especificación son muy flexibles. Es realively fácil agregar al ejemplo antedicho la regla
fecha: '/' ' del mes/' del día año;
el permitir
7/4/1776
como sinónimo para
De julio el 4 de 1776
En la mayoría de los casos, esta nueva regla se podía `` deslizar en '' a un sistema de trabajo con esfuerzo mínimo, y poco peligro de la entrada existente de interrupción.
La entrada que es leída puede no conformarse con las especificaciones. Estos errores de la entrada se detectan desde son teóricamente posibles con una exploración de izquierda a derecha; está así, no solamente la ocasión de la lectura y de computar con los malos datos de entrada reducidos substancialmente, pero los malos datos pueden ser encontrados generalmente rápidamente. La gestión de error, con tal que como parte de las especificaciones de la entrada, permite el reingreso de malos datos, o la continuación del proceso de entrada después de saltar sobre los malos datos.
En algunos casos, Yacc no puede producir un programa de análisis cuando está dado un sistema de especificaciones. Por ejemplo, las especificaciones pueden ser uno mismo contradictorio, o pueden requerir un mecanismo más de gran alcance del reconocimiento que eso disponible para Yacc. Los casos anteriores representan errores del diseño; los últimos casos pueden ser corregidos a menudo haciendo el analizador léxico más de gran alcance, o reescribiendo algunas de las reglas de la gramática. Mientras que Yacc no puede manejar todas las especificaciones posibles, su energía compara favorable con los sistemas similares; por otra parte, las construcciones a las cuales sea difícil para Yacc
la manija es también con frecuencia difícil para que los seres humanos dirijan. Algunos usuarios han divulgado que la disciplina de formular las especificaciones válidas de Yacc para su entrada reveló errores del concepto o del diseño temprano en el desarrollo de programa.
La teoría que Yacc subyacente ha sido elsewhere. Yacc se ha utilizado extensivamente en usos prácticos numerosos, incluyendo la pelusa, el recopilador de C portable, y un sistema para componer tipo de mathematics.
Las varias secciones siguientes describen el proceso básico de preparar una especificación de Yacc; La sección 1 describe la preparación de las reglas de la gramática, de la sección 2 la preparación de las acciones provistas usuario asociadas a estas reglas, y de la sección 3 la preparación de analizadores léxicos. La sección 4 describe la operación del programa de análisis. La sección 5 discute varias razones por las que Yacc puede no poder producir un programa de análisis de una especificación, y qué a hacer sobre él. La sección 6 describe un mecanismo simple para dirigir precedences del operador en expresiones aritméticas. La sección 7 discute la detección y la recuperación de error. La sección 8 discute el ambiente de funcionamiento y las características especiales de los programas de análisis Yacc producen. La sección 9 da algunas sugerencias que deban mejorar el estilo y la eficacia de las especificaciones. La sección 10 discute algunos asuntos avanzados, y la sección 11 da reconocimientos. El apéndice A tiene un breve ejemplo, y el apéndice B da un resumen del sintaxis de la entrada de Yacc. El apéndice C da un ejemplo usando algunas de las características más avanzadas de Yacc, y, finalmente, el apéndice D describe los mecanismos y el sintaxis apoyados no más de largo activamente, pero con tal que para la continuidad histórica con más viejas versiones de Yacc.