Yacc

YACC
Información sobre la plantilla
Parte de la familia Compiladores
Yet another compiler c.jpg
Programa que parte de un archivo escrito y genera un analizador sintáctico basado en una gramática analítica escrita en una notación
CreadorStephen Curtis Johnson
Modelo de desarrolloSoftware Libre
Lanzamiento inicial1970
Última versión estableFlex y Bison (Análogos a lex y yacc respectivamente)
GéneroCompiladores
Sistemas Operativos compatiblesUnix,Plan 9, OpenSolaris
IdiomaInglés
LicenciaAT&T

Yacc. Llamado genéricamente así debido a que sus siglas provienen del inglés Yet Another Compiler Compiler un programa que parte del archivo escrito en el lenguaje específico Lenguaje de Descripción de Gramática y genera el código en C, C++ o Pascal. Permite un lenguaje propio para automatizar tareas repetitivas que, de otra manera, tendrían que hacerse manualmente, dilapidando mucho tiempo y subutilizando las posibilidades de las computadoras actuales


Lenguaje de descripción de gramática

El archivo que se le da al Yacc par que éste lo procese y genere en el lenguaje fuente deseado está escrito con un diseño para tal fin, y es bastante sencillo, pues no posee un propósito general. Pero mantiene la potencia del lenguaje de salida que se utilice, pues todas las construcciones válidas aquí pueden escribirse si se utiliza una serie de convenios rigurosamente especificados. Este archivo se denomina de entrada, mientras que al generado por el Yacc es el de salida al de la fuente en que es escrito.

El archivo de entrada al Yacc consta de 2 partes fundamentales. La primera es un encabezamiento donde se definen los tipos de datos con los que se va a trabajar y se declaran los tokens, o palabras del lenguaje que se define. En la segunda se especifican todas las reglas que definen de forma rigurosa y unívoca la gramática del lenguaje que se desea interpretar. Además se precisa qué es lo que se realiza a cada uno de los casos posibles.

Adaptar el Yacc

EL Yacc utiliza como tipo de dato implícito el entero. Quiere decir que las expresiones $$ y $n son valores enteros. En la mayoría de las aplicaciones nos interesa trabajar con datos más complejos.

El Yacc posibilita redefinir el tipo de dato implícito utilizado. Usualmente ello se hace si se redefine la macro (YYSTYPE) como una estructura en (C/C++ o un record en Pascal) o una unión en (C/C++). Una vez redefinida la macro YYSTYPE, es necesario referirse a cada uno de los campos de esa estructura, por medio de la sintaxis del lenguaje de salida utilizado. En el caso de C/C++, el acceso a dichos campos se realiza por el operador “.” para los objetos y “- >” en los punteros. Para el Pascal el acceso se obtiene por medio del operador “.” para los objetos, pero con el operador “^” para los punteros.

Otra adaptación es utilizar el intérprete de nuestro lenguaje para ilustrar, no un fichero leído desde el disco u otro periférico, sino una expresión que está en memoria. En ese caso es necesario redefinir la macro (YYREAD).

Aplicaciones prácticas

Si tenemos un programa de imágenes. Es posible asociar cada una de las acciones que puede ejecutar el usuario a un procedimiento escrito en lenguaje fuente del programa (ya sea C/C++, Pascal, Delphi, Visual Basic) u otro cualquiera. Se puede crear un lenguaje de macros para el programa e incluir todas las funciones que el nuestro es capaz de realizar. Funciones como AjustarBrillo (entero n) o AjustaContraste (entero n). Es factible crear nuestros propios tipos de datos o clases de objeto, en este caso serían: Histograma o Paleta.

Los objetos o instancias de dichas clases pudieran considerarse como arreglos de números enteros o reales, pero con propiedades adicionales. Así es posible creas un lenguaje orientado a objetos, de modo que las funciones del programa puedan ejecutarse como métodos de objetos predefinidos.

Creación de nuevos lenguajes

Los lenguajes actuales no soportan metaclases con la extensión y profundidad deseada. El Yacc permite definir nuestro propio lenguaje. No es crear un compilador para competir, sino de crear un lenguaje adecuado para la programación con metaclases. Una vez que se tenga una implementación que trabaje, extensiva a todo el mundo, pronto aparecerán ambientes de desarrollo para este lenguaje. Esto si las metaclases facilitan el trabajo y resultan, al menos, bastante eficientes.

Una característica que no puede faltar en este tipo de lenguajes es la posibilidad de llamar directamente a funciones del sistema. En Windows, significa poder cargar cualquier biblioteca dinámica DLL y llamar a cualquier función presente en dicha biblioteca. Siempre que se declaren dichas funciones como se hace, por ejemplo, en Visual Basic.

Es necesario ofrecer algunas facilidades para la depuración de programas escritos en esos lenguajes, además, en éste deben incluirse funciones de entrada/salida y de interacción con el usuario, considerando la posibilidad de crear diálogos para recibir información de los usuarios.


Fuente

  • Díaz, Antonio: ¿Qué es el YACC?, en GIGA Número 3, 1998.