Documentos de Académico
Documentos de Profesional
Documentos de Cultura
COMPILADORES 2010
Profesores:
Alumnos:
Introducción 1
Problemas Surgidos 4
Aspectos Relevantes
1
Introducción
2
simbolo [!$%&]
Decimal {dig}+"."{dig}+
Oper_rel {com}({letra}|{dig})*[ \n]
_dim (d|D)(i|I)(m|M)
id [a-zA-Z](([a-zA-Z0-9])|[.])*
Cadena (\")(([a-zA-Z0-9])+)(\")
coma ,
Gramaticas Regulares
program_head: _sub id parentL _param id _as _tipo parentR body_program
body_program:decl_var body_program
|decl_var body_sent
|body_sent
variable:
|id
tipo:
|_tipo
body_sent:
|sentencias body_sent
|sentencias body_program
sentencias:
|asignacion sentencias
|sent_if sentencias
|sent_loop sentencias
|decl_var sentencias
asignacion:id igual id
|id igual call_metodo
|id oper_aritm id
|igual id
|id igual cadena
|igual cadena
|id oper_rel id
var_asig:constante
|id
|cadena
|lista_operacion
constante:id
|decimal
3
|booleano
|cadena
booleano:pr_truefalse
lista_operacion:operacion
|operacion oper_aritm list_operacion
Elseif: sentencia
| sentencia elseif
|_else
sent_loop: _do body_program _until condicion
lista_condicion:condicion
|condicion _and lista_condicion
|condicion _or lista_condicion
Entrada Salida
4
If a>b then a:=a+b; Análisis correcto!!!
Para indicar el error léxico de un programa ejemplo se retornará un mensaje que indique dicho
error y se finalizará con la aplicación debido a que no tiene sentido pasar a la etapa siguiente.
En Yacc: los errores que se detecten dependerán de que si el archivo de texto que se lee responde
a las gramáticas definidas para el lenguaje, o no.
Algunos ejemplos:
Entrada Salida
Para señalar el error sintáctico se mostrará un mensaje que mencione dicho error, la línea en que
se produjo el error y, además, el token más próximo al error.
Problemas Surgidos
Durante el proceso de construcción de los analizadores nos encontramos con diversos problemas,
los cuales se describen a continuación.
En primer lugar, con la instalación de Turbo Pascal 7.0, puesto que utilizamos Windows XP, tuvimos
que buscar e instalar la versión correcta para que funcione en este sistema operativo.
Hubo problemas con las herramientas Lex y Yacc, porque al instalarlas en la carpeta BIN y
posteriormente compilarlas en Turbo Pascal, surgía un error a partir de la falta de archivos TPU
5
relacionados a los mismos. Se solucionó cambiando los directorios correspondientes en Pascal
(Options/Directories).
En varias ocasiones se presentaron problemas difíciles de resolver que nos llevaron unas cuantas
horas para darnos con la solución después de un proceso de prueba y error.
Otro problema surgido se debió al almacenamiento del archivo de texto con espacios es decir con
tabs o líneas, el programa recorría las líneas en blanco y las marcaba como erróneas.
En ciertos casos los cambios realizados en Lex y Yacc, a pesar de que estaban lógicamente
correctos, no eran admitidos a la hora de compilar el archivo .PAS en Pascal. Lo solucionamos
reiniciando todo el proceso, es decir, volviendo a compilar en disco nuevamente: Lex.PAS,
LexLib.PAS, Yacc.PAS y YaccLib.PAS, generado otra vez el analizador (léxico y/o sintáctico) y
finalmente corriendo en Pascal el archivo .PAS.
Aspectos relevantes
Números: Se reconocen decimales
Identificadores: Comienzan con una letra y pueden tener caracteres siguientes tanto sean letras
como dígitos.
Comentarios: Cualquier combinación de letras, dígitos y espacios en blanco encerrados entre " "se
reconocen pero no devuelve tokens.
En Lex (vbl.l):
Se definió un procedimiento “InfError”, el cual tiene como parámetro una cadena de texto
(string), y utilizando la función “yylineno”, muestra un mensaje de error cuando se
identifico un token que no esté definido en el lenguaje. En éste caso “yylineno” contiene la
línea del archivo actual.
6
begin
halt
end;
También se utiliza una función “yytext” que contiene a la cadena de caracteres actual.
InfError (yytext);
En Yacc (vby.y):
Aquí se define un procedimiento “yyError”, con un parámetro “msg” que reconoce una
cadena (string), el cual muetra un mensaje de error. Éste procedimiento utiliza dos
funciones: “yylineno” (muestra la línea donde se produjo el error) y “yytext” (muestra el
símbolo en donde se encuentra el error).
begin
end;
Códigos Fuentes .L .Y
vbl.l
7
vby.y
8
9