Sei sulla pagina 1di 17

UNIDAD 5. ANALISI LXICO 5.

1 FUNCIONES DEL ANALIZADOR LXICO


El analizador lxico es la primera fase de un compilador. Su principal funcin consiste en leer los caracteres de entrada y elaborar como salida una secuencia de componentes lxicos que utiliza el analizador sintctico para hacer el anlisis. Esta interaccin, suele aplicarse convirtiendo al analizador lxico en una subrutina o corrutina del analizador sintctico. Recibida la orden Dame el siguientecomponente lxico del analizador sintctico, el analizador l xico lee loscaracteres de entrada hasta que pueda identificar el siguiente componente lxico. Estos componentes lxicos representan: Palabras reservadas: if, while, do, . . . Identicadores: asociados a variables, nombres de funciones, tipos definidos por el usuario, etiquetas,... Por ejemplo: o Forma: una letra seguida de letras o nmeros. Ej. a, b1, c3D o Atributo nombre: string con la secuencia de caracteres que forma e lidentificador en maysculas. Ej. A, B1, C3D Operadores: = * + - / == > < &! = . . . Smbolos especiales: ; ( ) [ ] f g ... Constantes numricas: literales que representan valores enteros, en coma flotante, etc, 982, 0xF678, -83.2E+2,... o Forma: secuencia de dgitos que puede empezar con el signo menos y puede contener un punto. Ej. 10, -3, 15.4, -54.276, .10 o Atributo valor: Double con el valor numrico. o Precisin: entero o real. Constantes de caracteres: literales que representan cadenas concretas de caracteres, \hola mundo",...

Interaccin de un analizador lxico con el analizador sintctico Otras funciones que realiza: Eliminar los comentarios del programa. Eliminar espacios en blanco, tabuladores, retorno de carro, etc, y en general, todo aquello que carezca de significado segn la sintaxis del lenguaje. Reconocer los identificadores de usuario, nmeros, palabras reservadas del lenguaje,..., y tratarlos correctamente con respecto a la tabla de smbolos (solo en los casos que debe de tratar con la tabla de smbolos).

Llevar la cuenta del nmero de lnea por la que va leyendo, por si se produce algn error, dar informacin sobre donde se ha producido. Avisar de errores lxicos. Por ejemplo, si @ no pertenece al lenguaje, avisar de un error. Puede hacer funciones de preprocesador.

5.2 Componentes lxicos, patrones y lexemas


COMPONENTE LXICO O TOKEN
El valor asociado a una categora o unidad de lxico. Se representa como un nmero entero o una constante de un byte. Ejemplo: el token de un identificador puede ser 1 o id (si id fue definida como 1).Los tokens son las unidades lxicas bsicas de igual forma que las palabras y signos de puntuacin son las unidades bsicas de un enunciado. Los tokens varan del lenguaje al lenguaje e incluso de compilador a compilador para el mismo lenguaje, la eleccin de los tokens es tarea del diseador del compilador. En la mayora de lenguajes tendremos tokens para: palabras clave: IF THEN THEN THEN = ELSE; ELSE ELSE = THEN; operadores identificadores constantes (reales, enteras y de tipo carcter), strings de caracteres y signos de puntuacin

1. Tipos de tokens: tiras especficas, tales como palabras reservadas (if, while, begin, etc.), el punto y coma, la asignacin, los operadores aritmticos o lgicos, etc. tiras no especficas, como identificadores, constantes o etiquetas. 2. Prioridad de los tokens Se da prioridad al token con el lexema ms largo: Si se lee >= y > se reconoce el primero. Si el mismo lexema se puede asociar a dos tokens, estos patrones estarn definidos en un orden determinado. Ejemplo: While palabra reservada while letra (letra | digito)* identificador Si en la entrada aparece while, se elegir la palabra reservada por estar primero. Si estas especificaciones iniciales aparecieran en orden inverso, se reconocera un token identificador

PATRN O EXPRESIN REGULAR


Definen las reglas que permiten identificar los componentes lxicos o tokens.

LEXEMA
Es cada secuencia de caracteres concreta que encaja con un patrn, es decir, escomo una instancia de un patrn. Ejm: 8, 23, 50 (son lexemas que encajan con el patrn ( 0 | 1 | 2 | ... | 9) + ). Una vez detectado que un grupo de caracteres coincide con un patrn, se ha detectado un lexema. A continuacin se le asocia un nmero, que se le pasar al sintctico, y, si es necesario, informacin adicional, como puede ser una entrada en la tabla de smbolos. La tabla de smbolos suelen ser listas encadenadas de registros con parte variable: listas ordenadas, rboles binarios de bsqueda, tablas hash, etc. Ejm: Hacer un analizador lxico que nos reconozca los nmeros enteros, los nmeros reales y los identificadores de usuario. Vamos a hacer este ejemplo en C. Terminales ( 0 ... 9) + (0 ... 9)*. (0 ... 9) + Expresin Regular -> NUM_ENT -> NUM_REAL

(a ... z) (a ... z 0 ... 9) * ->ID Asociado a la categora gramatical de nmero entero tendremos el token NUM_ENT que puede equivaler por ejemplo al nmero 280; asociado a la categora gramatical nmero real tendremos el token NUM_REAL que equivale al nmero 281; asociado a la categora gramatical identificador de usuario tendremos el token ID que equivale al nmero 282. ( 0 ... 9) + (0 ... 9)*. (0 ... 9) + (a ...z) (a ...z 0...9) * { return 280;} { return 281;} { return 282;}

Si tuviramos como texto de entrada el siguiente: 95.7 99 hola El analizador lxico intenta leer el lexema ms grande; el 95 encaja con el primer patrn, pero sigue, al encontrarse el punto, se da cuenta de que tambin en caja con el segundo patrn, entonces como este es ms grande, toma la accin del segundo patrn, return NUM_REAL. El 99 coincide con el patrn NUM_ENT, y la palabra con ID. Los espacios en blanco no coinciden con ningn patrn. En vez de trabajar con los nmeros 280, 281, 282, se definen mnemotcnicos. # define NUM_ENT # define NUM_REAL # define NUM_ID ( \t \n) (0 ... 9) + (0 ... 9) *. (0 ... 9) + (a ... z) (a ... z 0 ... 9)* 280 281 282 {return NUM_ENT;} {return NUM_REAL;} {return ID;}

Las palabras que entran por el patrn ( \t \n) no tienen accin asociada, por lo que , por defecto, se consideran solo espaciadores. Ejemplo: Programa UNO; Inicio Escribe (Hola); Fin. Cuya tabla de tokens es la siguiente: Programa UNO ; Inicio Escribe ( Hola ) ; Fin Palabra reservada Identificador Delimitador Palabra reservada Palabra reservada Smbolo Identificador compuesto Smbolo Delimitador Palabra reservada

Errores Lxicos
Un traductor debe adoptar alguna estrategia para detectar, informar y recuperarse para seguir analizando hasta el final. Las respuestas ante el error pueden ser: Inaceptables: Provocadas por fallos del traductor, entrada en lazos infinitos, producir resultados errneos, y detectar slo el primer error y detenerse. Aceptables: Evitar la avalancha de errores (mala recuperacin) y, aunque ms complejo, informar y reparar el error de forma automtica. La conducta de un Analizador de Lxico es el de un Autmata finito o scanner. Deteccin del error: El analizador de Lxico detecta un error cuando no existe transicin desde el estado que se encuentra con el smbolo de la entrada. El smbolo en la entrada no es el esperado. Los errores lxicos se detectan cuando el analizador lxico intenta reconocer componentes lxicos y la cadena de caracteres de la entrada no encaja con ningn patrn. Son situaciones en las que usa un carcter invalido (@,$,",>,...), que no pertenece al vocabulario del lenguaje de programacin, al escribir mal un identificador, palabra reservada u operador.

Errores lxicos tpicos son: 1. nombre ilegales de identificadores: un nombre contiene caracteres invlidos. 2. Nmeros incorrectos: un numero contiene caracteres invlidos o no est formado correctamente, por ejemplo 3,14 en vez de 3.14 o 0.3.14. 3. errores de ortografa en palabras reservadas: caracteres omitidos, adicionales o cambiados de sitio, por ejemplo la palabra while en vez de while. 4. fin de archivo: se detecta un fin de archivo a la mitad de un componente lxico. Los errores lxicos se deben a descuidos del programador. En general, la recuperacin de errores lxicos es sencilla y siempre se traduce en la generacin de un error de sintaxis que ser detectado ms tarde por el analizador sintctico cuando el analizador lxico devuelve un componente lxico que el analizador sintctico no espera en esa posicin. Los mtodos de recuperacin de errores lxicos se basan bien en saltarse caracteres en la entrada hasta que un patrn se ha podido reconocer; o bien usar otros mtodos ms sofisticados que incluyen la insercin, borrado, sustitucin de un carcter en la entrada o intercambio de dos caracteres consecutivos. Una buena estrategia para la recuperacin de errores lxicos: si en el momento de detectar el error ya hemos pasado por algn estado final ejecutamos la accin correspondiente al ltimo estado final visitado con el lexema formado hasta que salimos de l ; el resto de caracteres ledos se devuelven al flujo de entrada y se vuelve al estado inicial; Si no hemos pasado por ningn estado final, advertimos que el carcter encontrado no se esperaba, lo eliminamos y proseguimos con el anlisis.

Generadores de analizadores lxicos (scanner generators)


Lex: Cdigo generado: C. Flex: Cdigo generado: C++. Zlex: Cdigo generado: C. Soporta cdigos de carateres de 16 bits. Jax: Cdigo generado: Java. No soporta entornos, est basado en expresiones regulares. No soporta Unicode. Jlex Cdigo generado: Java. Similar a lex. Diseado para ser usado junto con CUP. Jflex Cdigo generado: Java. Diseado para ser usado junto con CUP. Otros: Ragel, ScanGen, RE2C, Gobo, YooLex.

UNIDAD 6. ANALISI SINTCTICO


6.1 GLC
El anlisis gramatical es determinar la sintaxis, o estructura, de un programa. Por esta razn tambin se le conoce como anlisis sintctico. La sintaxis de un lenguaje de programacin por lo regular se determina mediante las reglas gramaticales de una gramtica libre de contexto. Una gramtica libre de contexto utiliza convenciones para nombrar y operaciones muy similares a las correspondientes en las expresiones regulares. Con la nica diferencia de que las reglas de una gramtica libre de contexto son recursivas. Las estructuras de datos utilizadas para representar la estructura sintctica de un lenguaje ahora tambin deben ser recursivas en lugar de lineales. La estructura bsica empleada es por lo regular alguna clase de rbol, que se conoce como rbol de anlisis gramatical o rbol sintctico. Existen dos categoras generales de algoritmos: de anlisis sintctico descendente y de anlisis sintctico ascendente (por la manera en que construyen el rbol de anlisis gramatical o rbol sintctico). Como sabemos, en una gramtica libre de contexto (GLC) G = (N, T, P, S) las producciones tienen la siguiente forma:

Las GLCs tienen una gran importancia en la definicin de lenguajes interpretacin del lenguaje natural, construccin de compiladores, etc...

de programacin,

Por comodidad a la hora de definir lenguajes, la definicin anterior se extiende a la siguiente:

En este tema veremos que una GLC escrita de esta forma ms general, siempre puede escribirse en la versin ms restrictiva (slo S puede producir).

6.2 rboles de derivacin.


Un rbol de derivacin (o rbol sintctico) es una representacin grfica de cmo se deriva una forma sentencial a partir del smbolo no-terminal inicial. Un rbol es un grafo dirigido a cclico en el cual cada nodo se conecta con un nodo distinguido, llamado nodo raz mediante un nico camino. Un nodo n1 se dice descendiente de otro nodo n2 si se puede llegar a n1 a partir de n1. El nodo raz no es descendiente de ningn nodo, y los nodos que no tienen descendientes se denominan hojas. El resto de los nodos se denominan nodos interiores.

Un rbol de derivacin tiene las siguientes propiedades: 1. El nodo raz est rotulado con el smbolo distinguido (inicial) de la Gramatica. 2. Cada hoja corresponde a un smbolo terminal o un smbolo no-terminal. 3. Cada nodo interior corresponde a un smbolo no-terminal. Un arbol de derivacin muestra grficamente las derivaciones (substituciones de smbolos no terminales) que hay que llevar a cabo para llegar a una Forma Sentencial a partir del smbolo inicial.

Ejemplos La siguiente definicin BNF describe en forma simplificada la sintaxis de una sentencia de asignacin de un lenguaje tipo Pascal:
<sent_asig> ::= <var> ':=' <expresion> <expresion> ::= <expresion> '+' <termino> | <expresion> '-' <termino> | <termino> <termino> ::= <termino> '*' <factor> |<termino> '/' <factor> | <factor> <factor> ::= ( <expresion> ) |<var> | <num> <var> ::= 'A'..'Z' <num> ::= '0'..'9'

Un rbol de derivacin correspondiente a la sentencia:


C := D - E * F

es el siguiente:

rboles de Derivacin y Gramticas Ambiguas Una Gramatica Ambigua permite ms de una Derivacion para la misma Forma Sentencial por lo que tambin habr ms de un rbol de derivacin para la misma.

Por ello basta con encontrar dos rboles derivacin distintos para la misma Forma Sentencial para demostrar que una gramtica es ambigua. Ejemplo Tal vez la instancia ms famosa de una Gramtica Ambigua sea el del else ambiguo, el cual est presente en diversos lenguajes de programacin como Pascal, C, y Java. Las sintaxis de las instrucciones if then else en Java puede especificarse con la siguiente gramtica BNF simplificada:
<instr> ::= 'if' '(' <expre> ')' <instr> | 'if' <expre> <instr> 'else' <instr> | 'a' ';' <expre> ::= 'e'

Dada la frase:
if (e) if (e) a; else a;

Pueden obtenerse dos derivaciones para la misma frase. Una es la que corresponde a la interpretacin usual de los if anidados en los lenguajes de programacin: if (e) else { a; if (e) } a; La otra es la que corresponde a la siguiente interpretacin: if (e) { if (e) a; } else a;

La ambigedad puede resolverse escribiendo una nueva gramtica:


<instr> ::= <instr_p> | <instr_n> <instr_p> ::= 'if' '(' <expre> ')' <instr_p> 'else' <instr_p> | 'a' ';' <instr_n> ::= 'if' '(' <expre> ')' <instr> | 'if' '(' <expre> ')' <instr_p> 'else' <instr_n>

lo cual hace mucho ms dificil de entender el lenguaje descrito. En la prctica, el problema del else ambiguo se resuelve con reglas de precedencia, o haciendo que esa parte del Analizador Sintactico se comporte de manera avara (greedy) y siempre trate de derivar la Forma Sentencial ms larga. Por ejemplo, si usamos la siguiente Gramatica:
<instr> ::= 'if' '(' <expre> ')' <instr> <elsepart> | 'a' ';' <elsepart> ::= 'else' <instr> | <expre> ::= 'e'

entonces un analizador sintctico descendente recursivo escoger la Derivacion esperada.

Ejemplo Dada la siguiente gramtica:


EE+E EE-E EE*E EE/E E(E) E id

Es posible construir dos rboles de derivacin para la frase:


a+b+c

Es posible escribir la gramtica para expresiones aritmticas introduciendo nuevos smbolos para los distintos niveles de precedencia de los operadores:
EE+T EE-T ET TT*F TT/F TF F(E) E id

La gramtica resultante no es ambigua.

6.3 Formas normales de Chomsky. Si L es un lenguaje independiente del contexto que no contiene la cadena vaca, entonces existe una gramtica G independiente del contexto tal que L(G)=L y el lado derecho de cualquier regla de reescritura en G consiste en un solo terminal o exactamente dos no terminales. Se dice que una gramtica cuyas reglas de reescritura se adhieren a las restricciones del teorema 2.4 tiene la FORMA NORMAL DE CHOMSKY (FNC o CNF), llamada as en honor a Noam Chomsky. Por ejemplo la siguiente gramtica cuyo smbolo inicial es S tiene la forma normal de Chomsky. S XM M SY Xx Yy Mientras que la siguiente gramtica que genera el mismo lenguaje no la tiene S xSy S xy Pasos para obtener la forma normal de Chomsky Considere la siguiente gramtica S zMz MN M yMy Nx S => zMz => zyMyz => zyNyz => zyxyz Paso 1 Introducir los nuevos no terminales YZ y convertir la gramtica anterior en la siguiente: S ZMZ MN M YMY Zz Yy Nx Paso 2 Lo siguiente es reemplazar la regla SZMZ por el par de reglas SZR; RMZ, mientrasque MYMY se reemplaza por MYP; PMY para obtener la siguiente gramtica:

S ZR R MZ MN M YP P MY Zz Yy Nx Paso 3 Finalmente la regla M N se reemplaza por la regla M x, produciendo as la siguiente gramtica ya que tiene la forma normal de Chomsky. S ZR R MZ Mx M YP P MY Zz Yy Nx

S => ZR => zMZ => zYPZ => zyPZ => zyMYZ => zyxYZ => zyxyZ => zyxyz

6.4 Diagramas de sintaxis


Diagramas de sintaxis

Un segundo mtodo alternativo para desplegar las producciones de ciertas gramticas de tipo 2 es el diagrama de sintaxis. sta es una imagen de las producciones que permite al usuario ver las sustituciones en forma dinmica, es decir, verlas como un movimiento a travs del diagrama. En la figura 10.5 se ilustrar los diagramas que resultan de la traduccin de conjuntos de producciones tpicos, que son, por lo general, todas las producciones que aparecen en el lado derecho de algn enunciado BNF.

a) <w> ::= <w1> <w2> <w3>

b) <w> ::= <w1><w2> | <w1>a | bc<w2>

c) <w> ::= ab<w>.

d) <w> ::= ab | ab<w>.

e) Figura

6.5 Eliminacin de la ambigedad.


Una gramtica ambigua permite ms de una derivacin para la misma forma Sentencial por lo que tambin habr ms de un [rbol de derivacin] para la misma. Por ello basta con encontrar dos [rboles derivacin] distintos para la misma forma Sentencial para demostrar que una gramtica es ambigua. A continuacin se presentan conceptos importantes dentro del estudio de las caractersticas de las gramticas:

AMBIGEDAD: Sea G = { N , T , P , S } una gramtica libre de contexto y sea L(G) el lenguaje generado por esa gramtica. Si existe un string w (donde w oe L(G) ) para el cual existen dos ms formas de realizar la derivacin de ms a la izquierda (S w) existen dos ms formas de realizar la derivacin de ms a la derecha (S w), entonces se dice que: G es una gramtica ambigua. TIPOS DE AMBIGEDAD: Dentro del estudio de gramticas existen dos tipos fundamentales de ambigedad, los cuales son: Ambigedad Inherente: Las gramticas que presentan este tipo de ambigedad no pueden utilizarse para lenguajes de programacin, ya que por ms transformaciones que se realicen sobre ellas, NUNCA se podr eliminar completamente la ambigedad que presentan. Ambigedad Transitoria: Este tipo de ambigedad puede llegar a ser eliminada realizando una serie de transformaciones sobre la gramtica original. Una vez que se logra lo anterior, la gramtica queda lista para ser reconocida por la mayor parte de los analizadores sintcticos. (Se le considera "ambigedad" porque existen mtodos para realizar anlisis sintctico que no aceptan gramticas con estas caractersticas): Dnde se presenta la Ambigedad Transitoria: Generalmente la ambigedad se presenta cuando existen producciones con factores comunes (distintas alternativas para un smbolo no-terminal que inician de la misma forma); cuando existen producciones que son recursivas izquierdas (producciones para un smbolo no-terminal en las cuales el primer smbolo de su forma sentencial es ese mismo smbolo no-terminal). Cmo solucionar el problema de la Ambigedad Transitoria?: Para eliminar este tipo de ambigedad, es necesario, primero eliminar: - Factores comunes izquierdos inmediatos y No-inmediatos. - Recursividad izquierda inmediata y No-inmediata. Equivalencia y ambigedad Dos gramticas son equivalentes si generan el mismo lenguaje, es decir, si. (Adelanto: averiguar en general si dos gramticas son equivalentes es un problema no computable.) Sea una gramtica. Tanto como es una derivacin para la palabra. Una sentencia es ambigua si existe ms de una derivacin para ella en una gramtica. Una gramtica es ambigua si su lenguaje contiene una sentencia ambigua, es decir, se puede derivar la misma sentencia con dos (o ms) derivaciones distintas. Un lenguaje es ambiguo (o incluso se dice inherentemente ambiguo) si todas las gramticas que Generan el lenguaje son ambiguas. Ejemplo: no es ambigua, entonces no es ambiguo.

Si una sentencia es ambigua (en el caso de las gramticas libres de contexto) tenemos dos rboles de derivacin para la misma sentencia. 6.6 Generacin de matriz predictiva ( clculo first y follow) FIRST Si es cualquier cadena de smbolos gramaticales, se considera FIRST() como el conjunto de terminales que encabezan las cadenas derivadas de . Si *==> , entonces tambin est en FIRST(). Para calcular FIRST(X) para algn smbolo X de la gramtica, se aplican las siguientes reglas hasta que no se pueda aadir nada nuevo al conjunto FIRST: 1. Si X es terminal, entonces FIRST(X) es {X}. 2. Si X es no terminal y existe la produccin X , entonces aadir a FIRST(X). 3. Si X es no terminal y X Y1 Y2 .. . Yk es una produccin entonces, para todo i (con i variando desde 1 hasta k) tal que Y1 , Y2 , ..., Yi-1 sean todos no terminales y FIRST(Y1), FIRST(Y2), ..., FIRST(Yi-1) contengan todos , se aaden todos los smbolos no nulos de FIRST(Yi ) a FIRST(X). Finalmente, si est en FIRST(Yj ) para j = 1, 2, ..., k (o sea, en todos), entonces se aade a FIRST(X). Dicho de otra forma, lo anterior significa que todos los elementos de FIRST(Y1), excepto , pertenecen tambin a FIRST(X). Si Y1 no deriva , entonces ya ha terminado el clculo de FIRST(X), pero en caso contrario, es decir, si Y1 = * => , entonces todos los elementos de FIRST(Y2) excepto pertenecen tambin a FIRST(X), y as sucesivamente. Finalmente, si todos los Yi derivan , entonces se aade a FIRST(X). FOLLOW Se define FOLLOW(A), para el no terminal A, como el conjunto de terminales a que pueden aparecer inmediatamente a la derecha de A en alguna forma sentencial, es decir, el conjunto de terminales a tal que haya una derivacin de la forma S= * =>Aa para algn y . Si A puede ser el smbolo de ms a la derecha en alguna forma sentencial, entonces $ est en FOLLOW(A). Para calcular FOLLOW(A) para un smbolo no terminal A, se aplican las siguientes reglas hasta que no se pueda aadir nada ms al conjunto FOLLOW. 1. $ est en FOLLOW(S), siendo S el axioma de G. 2. Si existe una produccin A B, entonces todo lo que est en FIRST(), excepto , est en FOLLOW(B). 3. Si existe la produccin A B y FIRST() contiene (es decir, =*=>), o bien si existe una produccin A B, entonces todo lo que est en FOLLOW(A) est en FOLLOW(B).

6.6 Generadores de analizadores sintcticos


Yacc Tipo de analizador: Ascendente, LALR(1). Cdigo generado: C, C++. Caractersticas adicionales:

Se puede integrar con Lex dejando a ste el anlisis lxico. La precedencia se puede definir al margen de la gramtica, manteniendo sta ms simple. Conjuntamente con Memphis se puede construir un rbol sintctico como salida del analizador. Bison Tipo de analizador: Ascendente, LALR(1). Cdigo generado: C, parece que hay una versin para Eiffel que no he encontrado. Caractersticas adicionales: Compatible con Yacc: una gramtica de entrada para Yacc puede utilizarse en Bison sin ninguna modificacin. Grammatica Tipo de analizador: Descendente, LL(k). Cdigo generado: C#, Java. Caractersticas adicionales: Soporte para depurar las gramticas sin necesidad de generar el analizador. Genera cdigo legible y comentado. Mensajes de error detallados durante el anlisis. Sid Tipo de analizador: Descendente, LL(1). Cdigo generado: C. Caractersticas adicionales: Transforma la gramtica a una gramtica LL(1) si puede, eliminando recursividad por la izquierda y factorizando. YaYacc Tipo de analizador: Ascendente, LALR(1). Cdigo generado: C++. Caractersticas adicionales: El generador slo corre sobre FreeBSD, pero el cdigo generado no est ligado a ninguna plataforma concreta. GOLD Tipo de analizador: Ascendente (LALR(1)). Cdigo generado: Multilenguaje (Java, C#, ANSI C, Delphi, Python, VB, VB .NET, VC++, wxWidgets, todos los lenguajes .NET, todos los lenguajes ActiveX). Caractersticas adicionales: Incluye anlisis lxico. El cdigo fuente est disponible tambin en numerosos lenguajes. Byacc/Java Tipo de analizador: Ascendente, LALR(1). Cdigo generado: Java. Caractersticas adicionales: COCO/R Tipo de analizador: Descendente, LL(k). Cdigo generado: C#, Java, Oberon, Pascal, Modula-2, C, C++, Delphi, Unicon. Caractersticas adicionales: Incluye el analizador lxico. TP Lex/Yacc Tipo de analizador: Ascendente, LALR(1). Cdigo generado: Turbo y Borland Pascal, Delphi. Caractersticas adicionales:

Aflex/Ayacc Tipo de analizador: Ascendente, LALR(1). Cdigo generado: Ada. Caractersticas adicionales: Basados en flex (lxico) y yacc (sintctico). AntLR Tipo de analizador: Descendente recursivo, LL(k). Cdigo generado: Java, C++, C#. Caractersticas adicionales: Construccin de ASTs. Hay abundante documentacin en la pgina, incluyendo una gua en castellano. JavaCC Tipo de analizador: Descendente recursivo, LL(k). Cdigo generado: Java. Caractersticas adicionales: Dispone de JJTree para construir el rbol. JJDoc toma una gramtica y genera documentacin HTML al estilo javaDoc. La especificacin lxica puede hacerse en la misma gramtica. SableCC Tipo de analizador: LALR(1). Cdigo generado: Java. Caractersticas adicionales: Es un framework para generar tanto compiladores como intrpretes. Genera adems del parser, tree walkers y ASTs (tipados). Analizador lxico basado en DFAs, que soporta unicode. La gramtica se especifica en EBNF. En la pgina hay abundante documentacin y ejemplo de proyectos donde se usa SableCC. AnaGram Tipo de analizador: LALR(1). Cdigo generado: C, C++. Caractersticas adicionales: LISA Tipo de analizador: LL(k). Cdigo generado: C++. Caractersticas adicionales: Incluye analizador lxico. CUP Tipo de analizador: Ascendente, LALR(1). Cdigo generado: Java. Caractersticas adicionales: La precedencia puede especificarse al margen de la gramtica. Spirit Tipo de analizador: Descendente, LL(k). Cdigo generado: C++. Caractersticas adicionales: EBNF. ParseView Tipo de analizador: Descendente, LL(k).

Cdigo generado: Java. Caractersticas adicionales: Es un visualizador basado en antlr. Oops Tipo de analizador: Descendente, LL(1). Cdigo generado: Java. Caractersticas adicionales: Se puede integrar con constructores de ASTs. Requiere un analizador lxico. La gramtica se especifica en notacin EBNF. Beaver Tipo de analizador: LALR(1). Cdigo generado: Java. Caractersticas adicionales: EBNF. Necesita un analizador lxico.

Potrebbero piacerti anche