Está en la página 1de 14

INSTITUTO POLITECNICO NACIONAL

UPIICSA

HERRAMIENTAS
AUTOMATIZADAS PARA UN
ANALIZADOR SINTACTICO

EQUIPO 5
Por qu hacer anlisis sintctico?

Podemos proveer una definicin precisa y fcil de


entender

Una gramtica apropiada imparte estructura a un


lenguaje de programacin

Podemos construir automticamente un parser que


determine si el programa es sintcticamente correcto

Ayuda en el proceso de traduccin

Fcil modificar/aadir al lenguaje


Anatoma de un Compilador
Entrada y Salida de un
Parser
ENTRADA:

Token Stream rbol de Parseo


Implementando un Parser
Implementar un parser para algunas CFGs
puede ser muy difcil
Tenemos que ver el input y elegir una produccin
No podemos elegir una produccin sin look ahead

Hay varias tcnicas


Cada una puede manejar algunas CFGs
Categorizacin de las tcnicas
Qu es una herramienta de anlisis
sintctico?

Una herramienta de anlisis sintctico


nos permitir averiguar si un fichero de
entrada cualquiera respeta las reglas de
una Gramtica concreta.
ANTL Grammatica
R parser generator

Ejemplos
YAC de ellas GNU
C son: Bison
JavaC
C
ANTLR cae dentro de la categora de meta-

Que es
programas, por ser un programa que escribe
otros programas. Partiendo de la

ANTLR? descripcin formal de la gramtica de un


lenguaje, ANTLR genera un programa que
determina si una sentencia o palabra
pertenece a dicho lenguaje (reconocedor),
ANTLR (ANother Tool for utilizando algoritmos LL(*) de parsing. Si a
Language Recognition; en dicha gramtica, se le aaden acciones
espaol "otra herramienta escritas en un lenguaje de programacin, el
para reconocimiento de reconocedor se transforma en un traductor
lenguajes") es una o intrprete.
herramienta creada Adems, ANTLR proporciona facilidades
principalmente por Terence para la creacin de estructuras intermedias
Parr, que opera sobre de anlisis (como ser ASTs - Abstract Sintax
lenguajes, proporcionando un Tree), para recorrer dichas estructuras, y
marco para construir provee mecanismos para recuperarse
reconocedores automticamente de errores y realizar
(parsers),intrpretes, compilad reportes de los mismos.
ores y traductores de ANTLR es un proyecto bajo licencia BSD,
lenguajes a partir de las viniendo con todo el cdigo fuente
descripciones gramaticales de Cmo funciona?
disponible, y preparado para su instalacin
los mismos (conteniendo bajo plataformas Linux, Windows y Mac OS
acciones semnticas a X.
GNU Bison

Bison convierte la descripcin formal de un


GNU bison es un programa
lenguaje, escrita como una gramtica libre de
generador de analizadores
contexto LALR, en un programa en C, C++, o
sintcticos de propsito
Java que realiza anlisis sintctico. Es utilizado
general perteneciente al
para crear analizadores para muchos
proyecto GNU disponible
lenguajes, desde simples calculadoras hasta
para prcticamente todos los
lenguajes complejos. Para utilizar Bison, es
sistemas operativos, se usa
necesaria experiencia con la sintaxis usada
normalmente acompaado
para describir gramticas.
de flex aunque los
GNU bison tiene compatibilidad con Yacc:
analizadores lexicos se
todas las gramticas bien escritas para Yacc,
pueden tambin obtener de
funcionan en Bison sin necesidad de ser
otras formas.
modificadas. Cualquier persona que est
familiarizada con Yacc podra utilizar Bison sin
problemas.
Bison fue escrito en un principio por Robert
Corbett; Richard Stallman lo hizo compatible
con Yacc y Wilfred Hansen de la Carnegie
Grammatica es un generador Se lee un archivo de la gramtica (en un
de C # y Java parser formato Extended BackusNaur Form) y
(compilador crea as un comentario legible en C # o
compilador). Mejora en las cdigo fuente de Java para el analizador.
herramientas similar (como Da una recuperacin automtica de
yacc y ANTLR) creando as, un errores, los mensajes de error de lectura y
comentario y el cdigo fuente una clara separacin entre la gramtica y
legible, por tener la el cdigo fuente.
recuperacin automtica de
errores y mensajes de error
detallados, y por el apoyo
para probar y depurar las
gramticas sin generar cdigo Grammatica apoya LL (k) las
fuente. gramticas con un nmero
ilimitado de fichas de la ventaja
mirada. Es bastante bien probado,
y se ha auto-recibimiento desde
la versin 0.1. La documentacin
contiene una completa lista de
caractersticas , as como
una comparacin con otros
generadores analizador .
JavaCC (Java Compiler
Compiler) es un generador de
analizadores sintcticos de
cdigo abierto para el lenguaje
de programacin Java. JavaCC
es similar a Yacc en que genera J
un parser para una gramtica
presentada en notacin BNF, a
con la diferencia de que la
salida es en cdigo Java. A
diferencia de Yacc, JavaCC
v
genera analizadores
descendentes (top-down), lo
a En 1996, Sun
Microsystems liber un
que lo limita a la clase de
parser llamado Jack. Los
gramticas LL(K) (en particular,
desarrolladores
la recursin desde izquierda no
se puede usar). El constructor de C responsables
crearon su
de Jack
propia
C
rboles que lo acompaa,
compaa llamada
JJTree, construye rboles de
Metamata y cambiaron el
abajo hacia arriba (bottom-up).
nombre Jack a JavaCC.
Metamata se convirti en
WebGain. Despus de que
WebGain finalizara sus
Yacc
Yacc no es directamente un analizador sino un generador de analizadores. A
partir de un fichero fuente en yacc, se genera un fichero fuente en C que
contiene el analizador sintctico. Sin embargo, un analizador sintctico de
yacc no puede funcionar por s solo, sino que necesita un analizador lxico
externo para funcionar. Dicho de otra manera, el fuente en C que genera
yacc contiene llamadas a una funcin yylex() que debe estar definida y debe
devolver el tipo de lexema encontrado. Adems, es necesario incorporar
tambin una funcin yyerror(), que ser invocada cuando el analizador
sintctico encuentre un smbolo que no encaja en la gramtica.
<Seccin de
Un programa fuente de Yacc se parece
definiciones>
bastante a uno de lex. La diferencia
%%
principal est en la seccin de reglas,
<Seccin de reglas>
que en vez de expresiones regulares
(obligatoria)
contiene las reglas de la gramtica:
%%
<Seccin de rutinas>
LA SECCIN DE DECLARACIONES
puede incluir varias cosas, tal y como ocurra en lex, pero ahora su funcin
principal no es definir expresiones regulares, sino declarar los smbolos
terminales de la gramtica mediante la directriz %token. Todo lo que no sea un
terminal, ser considerado un smbolo no
terminal, y por tanto debe haber un a regla para l:
%token IF,ELSE,LLAVE_AB,LLAVE_CE,IDENT

LA SECCIN DE REGLAS
contiene la gramtica en s. Componentes es una combinacin de terminales y
no terminales que describe al no terminal de la izquierda de la regla:
no_terminal: componentes {acciones en C}

LA SECCIN DE RUTINAS
tiene la misma funcin que la de lex, pero yacc (dependiendo de su variante)
no define por defecto las funciones main(), yylex() e yyerror(), as que hay que
incluirlas aqu, o bien en otro fichero que se enlazar en la fase final de la
compilacin.

Yacc genera una funcin llamada yyparse() que contiene el analizador


sintctico. Esta funcin se comporta como una mquina de estados cuya
misin es intentar reducir todo el fichero de entrada al smbolo inicial de
la gramtica (el primero que se haya definido). Si yacc lo consigue, el
analizador sintctico volver sin error, y en caso contrario, se invocar a la
funcin yyerror(), que debe estar definida tambin en algn sitio.
Seccin de Reglas en
Yacc
Una regla de yacc es parecida a una de lex, pero en vez de un
patrn regular, especifica una regla de la gramtica. Las reglas
deben estar dadas de forma que la parte izquierda conste de un
nico smbolo no terminal, y la parte derecha indique la
combinacin de terminales y no terminales de que puede estar
compuesto. Adems, toda regla debe incluir una accin en C que
se ejecutar en cuanto yacc consiga encontrar los componentes del
smbolo resultado:

smbolo_result: componentes accin_en_C

El smbolo resultado
debe estar situado en la primera posicin de la lnea, es decir, que
no puede haber espacios antes del smbolo resultado.

Los componentes
son una combinacin de terminales y no terminales separados por
espacios en blanco.

La accin

También podría gustarte