domingo, 21 de noviembre de 2010

HERRAMIENTAS PARA GENERAR COMPILADORES

             Herramientas tradicionales
- Lex/Yacc
- Pclex
- Pcyacc
- Bison
- Flex
Ventajas:
- Generan analizadores eficientes, incluso más que los que pudiéramos hacer de manera manual.
- Los analizadores ascendentes reconocen la mayor parte de los lenguajes
Desventajas:
- Yacc usa herramientas externas para que le provean los tokens necesarios
- Las acciones semánticas asociadas con las producciones de los no terminales de las gramáticas son difíciles de depurar
- Yacc no genera árboles de análisis sintáctico
- Mezcla las especificaciones sintácticas con las semánticas
- Incrementos en la dificultad del trabajo de depuración de puesto que los errores que cometen el fichero de especificación con solo visibles en el analizador generado.


Herramientas de nueva generación

ANTLR

- Se considera el lex/yacc del nuevo milenio.
- Genera árboles sintácticos descendentes .
- Escrito íntegramente en JAVA.
- Genera código en JAVA o C++.
Ventajas:
- Buena integración de los analizadores léxicos y sintácticos
- El código  generado por ANTLR es mas fácil  de entender y depurar que el YACC.
- Las especificaciones gramaticales de ANTLR permiten la notación BNF y generan árboles de análisis sintáctico.
Desventajas:
- Genera analizadores menos eficientes que los generados por YACC.
- Los ficheros de especificación de ANTLR son muy complejas.
- El proceso de depurado consta de las siguientes fases:
1)    Escribir el código de acciones.
2)    Compilar el fichero de especificaciones
3)    Compilar y ejecutar el programa generado
4)    Localizar errores del programa
5)    Corregir errores en el fichero de especificaciones

JAVACC

- Inicialmente se llamo JACK.
- Similar al ANTLR.
- Analizador ascendente.

Ventajas:

- Buena integración y los analizadores léxicos y sintáctico.
- Genera analizadores sintácticos descendentes basados en la gramática.
- Incluye la herramienta JJTREE para generar árboles sintácticos.
Desventajas:
- Las mismas que ANTLR

Otras herramientas

BYACC/JAVA

- Extensión de YACC para generar código JAVA en vez de C/C++.
- Fichero de especificaciones igual que YACC
- Código y declaraciones de lenguaje escritos en JAVA.

COCO/JAVA

- Generados de compiladores que a partir de la descripción del lenguaje mediante una gramática LL genera un analizador sintáctico y un analizador léxico para dicho lenguaje.

CUP

- Versión LEX/YACC para JAVA (su forma de trabajo es análoga).
JACCIE
- JAVA  BASED COMPILER.-Compiler in an Interactive Environment.
- Herramienta educativa que se puede utilizar para visualizar las técnicas de compilación.
- Dos principales componentes: un generador de analizadores léxicos y una variedad de generadores de generadores sintácticos.
JELL
- Es un generador de analizadores sintácticos que genera analizadores descendentes a partir de gramáticas LL.

Kits para la construcción de compiladores

COKTAIL

Conjunto de herramientas para construir compiladores
- REXàgenerador de analizadores léxicos.
- LALRàgenerador de analizadores sintácticos.
- ELLàgenerador de analizadores sintácticos.
- ASTàgenerador de árboles sintácticos.
- AGàpermite procesar gramáticas atribuidas.

 

ELI

- Combina una variedad de herramientas estándar para implementar potentes estrategias en la construcción de compiladores.
- Se pueden generar automáticamente implementaciones de lenguajes completos a partir de las especificaciones de la aplicación.
- Contiene librerías de especificaciones reusables.

PCCT

- Escrito inicialmente en C++ para generar compiladores en C++.
- Portado a JAVA y llamado ANTLR.XX
- Consta de 3 herramientas:
·        ANTLRàgenerador de analizadores de sintácticos
·        DLGàgenerador de analizadores léxicos
·        SORCERERàgenerador de árboles sintácticos 

 HERRAMIENTAS PARA GENERAR COMPILADORES

Herramientas tradicionales
- Lex/Yacc
- Pclex
- Pcyacc
- Bison
- Flex
Ventajas:
- Generan analizadores eficientes, incluso más que los que pudiéramos hacer de manera manual.
- Los analizadores ascendentes reconocen la mayor parte de los lenguajes
Desventajas:
- Yacc usa herramientas externas para que le provean los tokens necesarios
- Las acciones semánticas asociadas con las producciones de los no terminales de las gramáticas son difíciles de depurar
- Yacc no genera árboles de análisis sintáctico
- Mezcla las especificaciones sintácticas con las semánticas
- Incrementos en la dificultad del trabajo de depuración de puesto que los errores que cometen el fichero de especificación con solo visibles en el analizador generado.


Herramientas de nueva generación

ANTLR

- Se considera el lex/yacc del nuevo milenio.
- Genera árboles sintácticos descendentes .
- Escrito íntegramente en JAVA.
- Genera código en JAVA o C++.
Ventajas:
- Buena integración de los analizadores léxicos y sintácticos
- El código  generado por ANTLR es mas fácil  de entender y depurar que el YACC.
- Las especificaciones gramaticales de ANTLR permiten la notación BNF y generan árboles de análisis sintáctico.
Desventajas:
- Genera analizadores menos eficientes que los generados por YACC.
- Los ficheros de especificación de ANTLR son muy complejas.
- El proceso de depurado consta de las siguientes fases:
1)    Escribir el código de acciones.
2)    Compilar el fichero de especificaciones
3)    Compilar y ejecutar el programa generado
4)    Localizar errores del programa
5)    Corregir errores en el fichero de especificaciones

JAVACC

- Inicialmente se llamo JACK.
- Similar al ANTLR.
- Analizador ascendente.

Ventajas:

- Buena integración y los analizadores léxicos y sintáctico.
- Genera analizadores sintácticos descendentes basados en la gramática.
- Incluye la herramienta JJTREE para generar árboles sintácticos.
Desventajas:
- Las mismas que ANTLR


Otras herramientas

BYACC/JAVA

- Extensión de YACC para generar código JAVA en vez de C/C++.
- Fichero de especificaciones igual que YACC
- Código y declaraciones de lenguaje escritos en JAVA.

COCO/JAVA

- Generados de compiladores que a partir de la descripción del lenguaje mediante una gramática LL genera un analizador sintáctico y un analizador léxico para dicho lenguaje.

CUP

- Versión LEX/YACC para JAVA (su forma de trabajo es análoga).
JACCIE
- JAVA  BASED COMPILER.-Compiler in an Interactive Environment.
- Herramienta educativa que se puede utilizar para visualizar las técnicas de compilación.
- Dos principales componentes: un generador de analizadores léxicos y una variedad de generadores de generadores sintácticos.
JELL
- Es un generador de analizadores sintácticos que genera analizadores descendentes a partir de gramáticas LL.
Kits para la construcción de compiladores

COKTAIL

Conjunto de herramientas para construir compiladores
- REXàgenerador de analizadores léxicos.
- LALRàgenerador de analizadores sintácticos.
- ELLàgenerador de analizadores sintácticos.
- ASTàgenerador de árboles sintácticos.
- AGàpermite procesar gramáticas atribuidas.



ELI

- Combina una variedad de herramientas estándar para implementar potentes estrategias en la construcción de compiladores.
- Se pueden generar automáticamente implementaciones de lenguajes completos a partir de las especificaciones de la aplicación.
- Contiene librerías de especificaciones reusables.

PCCT

- Escrito inicialmente en C++ para generar compiladores en C++.
- Portado a JAVA y llamado ANTLR.XX
- Consta de 3 herramientas:
·        ANTLRàgenerador de analizadores de sintácticos
·        DLGàgenerador de analizadores léxicos
·        SORCERERàgenerador de árboles sintácticos

miércoles, 17 de noviembre de 2010

Funciones polimórficas

Un procedimiento normal permite que las proposiciones de su cuerpo se ejecuten con argumentos de tipos fijos; cada vez que se llama un procedimiento polimórfico, las proposiciones de su cuerpo pueden ejecutarse con argumentos de tipos distintos. El término “polimórfico” también se aplica a cualquier parte de código que pueda ejecutarse con argumentos de tipos distintos, de modo que se puede hablar de funciones, así como de operadores polimórficos.
Los operadores predefinidos para indicar matrices, aplicar funciones y manipular apuntadores son generalmente polimórficos porque no se limitan a una determinada clase de matriz, función o apuntador.

¿Porqué la funciones polimórficas?
Las funciones polimórficas resultan atractivas porque facilitan la implantación de algoritmos que manipulan estructuras de datos, independientemente de los tipos de los elementos en la estructura de datos. Por ejemplo, es conveniente tener un programa que determine la longitud de una lista sin que sea necesario conocer los tipos de los elementos de la lista.

GRAMATICAS INDEPENDIENTES DE CONTEXTO

Se puede describir la sintaxis de las construcciones de los lenguajes de programación por medio de gramáticas independientes de contexto.
Una gramática  describe de forma natural la estructura jerárquica de muchas construcciones de los lenguajes de programación.
Consta de :  

TERMINALES.  Símbolos básicos con que se forman las cadenas.  Para un lenguaje de programación, cada palabra clave/reservada  es un terminal.
                        prop_if            if         expr       prop       else       prop
                                                           terminales

NO TERMINALES.  Son variables sintácticas que denotan conjuntos de cadenas (identificadotes o variables).  Los no terminales definen conjuntos de cadenas que ayudan a definir el lenguaje generado por la gramática.  Imponen una estructura jerárquica sobre el lenguaje que es útil tanto para el análisis sintáctico como para la traducción.
                        prop_if           expr       prop       son no terminales