You are on page 1of 6

INGENIERIA DE SISTEMAS Y COMPUTACION

COMPILADORES

Presentado a:

Elaborado por:

UNIVERSIDAD TECNOLOGICA DE PEREIRA Pereira Risaralda 2011

Documentacin Analizador Lxico #hacemos el llamado a la librera PLY que contiene las herramientas necesarias para la interpretacin de expresiones regulares import ply.lex as lex #definicion palabras reservadas de java las cuales son necesaras para idenficarlas como palabras reservadas del sistema, las hacemos como un arreglo de listas reserved= { 'class': 'CLASS', 'return': 'RETURN', 'this': 'THIS', 'extends': 'EXTENDS', 'if': 'IF', 'new': 'NEW', 'void': 'VOID', 'else': 'ELSE', 'length': 'LENGTH', 'int': 'INT', 'while': 'WHILE', 'true': 'TRUE', 'bolean': 'BOLEAN', 'break': 'BREAK', 'false': 'FALSE', 'string': 'STRING', 'continue': 'CONTINUE', 'null': 'NULL', } #listado de token, recordemos que los token son un bloque de texto categorizado tokens =[ 'DIFERENTE', 'ID', 'IGUAL', 'NUMERO', 'PARENTIZ', 'CADENA', 'PARENTDER', 'SUMA', 'CORCHETEIZ', 'RESTA', 'CORCHETEDER', 'MULTI', 'COMA', 'DIVISION', 'PUNTO', 'NUM_HEXAD', 'PCOMA', 'NUM_NOTAC_CIENTF', 'LLAVEIZQ', 'NUM_REAL', 'LLAVEDER', 'MOD', 'COMENTARIOB', 'OR', 'COMENTARIOL'] + 'AND', list(reserved.values()) 'NOT', 'MENOR', 'MENIGUAL', 'MAYOR', 'MAYIGUAL', 'COMPARADOR',

#listado de expresiones regulares mediante token para el reconocimiento de las mismas mediante un identificador #EXPRESIONES REGULARES # Operadores t_SUMA = r'\+' t_RESTA = r'-' t_MULTI = r'\*' t_DIVISION = r'/' t_MOD = r'%' t_OR = r'\|\|' t_AND = r'&&' t_NOT = r'!' t_MENOR = r'<' t_MAYOR = r'>' t_MENIGUAL = r'<=' t_MAYIGUAL = r'>=' t_COMPARADOR = r'==' t_DIFERENTE = r'!=' t_IGUAL = r'\=' t_PARENTIZ = r'\(' t_PARENTDER = r'\)' t_CORCHETEIZ = r'\[' t_CORCHETEDER = r'\]' t_COMA = r',' t_PUNTO = r'\.' t_PCOMA = r';' t_LLAVEIZQ = r'\{' t_LLAVEDER = r'\}' t_CADENA = r'\"([\w\+\-\*/!#$%&,:;<=>@`~ \(\)\'\.\?\[\]\{\}\^\|(\\\\)(\\\")(\\t)(\\n)]*)\"' #acontinuacion los procedimientos y funciones que permiten reconocer los datos ingresados para estos ser evaludos y arrojarnos un resultado lexico # para identificar e ignorar saltos de linea def t_NEWLINE(t): r'\n+' t.lexer.lineno += t.value.count('\n') #expresion regular que me identifica un error en numero entero def t_ERRORNUMERO(t): r'0+[1-9][0-9]*' print "Error en NUMERO, en la linea '%d': NO ES ENTERO '%s'" %(t.lineno, t.value)

#expresion regular que me identifica una notacion cientifica def t_NUM_NOTAC_CIENTF(t): # Notacion cientifica. r'([0-9]+(\.[0-9]+)?([eE]+[-+]?[0-9]+))+' t.lexer.lineno += t.value.count('\n') return t #expresion regualar que me identifca un natacion hexadecimal def t_NUM_HEXAD(t): # Hexadecimal. r'0[xX][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]' t.lexer.lineno += t.value.count('\n') return t #expresion regular que me dentifica un numero real def t_NUM_REAL(t): r'([0][\.][0-9]+([e][+-]?[0-9]+)?|[1-9][0-9]*[\.][0-9]+([e][+-]?[0-9]+)?)' return t # expresion regular que me identifica un numero entero positivo incluyendo el 0 def t_NUMERO(t): r'(0|[1-9][0-9]*)' t.value = int(t.value) return t #expresion regular que me muestra cuando es un identificador def t_ID(t): r'[a-zA-Z][a-zA-Z0-9_]*' t.type=reserved.get(t.value,'ID') return t #expresion regular para los comentarios en bloque def t_COMENTARIOB(t): #r'/[*].*' r'/\*(.|\n)*?\*/' print "COMENTARIO EN BLOQUE '%d':'%s'" %(t.lineno, t.value) pass #expreson regular que me muestra cuando el comentaro el bloque no se ha cerrado def t_ERRORCOMENTARIOB(t): r'/[*].*' print "Error en COMENTARIOBLOQUE, en la linea '%d': NO CERRADO '%s'" %(t.lineno, t.value) t.lineno+=t.value.count('\n') t.lexer.skip(1) #expresion regular que me identifica cuando hay un comentario en linea def t_COMENTARIOL(t): r'//[^\n]*' t.lineno+=t.value.count('\n') return t

#expresion regular que me identifica cuando hay error en las cadenas de archivos, cuando estas #no se cierran def t_ERRORCADENA(t): r'\"[^"]*[\n]' print "Error en LEXICO, en la linea '%d': NO SE RECONOCE CADENA '%s'" %(t.lineno, t.value) #expresion regular que me muestra errores de caracteres desconocidos que no esten #nombrados dentro de los token o identificadores como tal... errores de simbolos raros def t_error(t): print "Error en caracter: '%s'. En la linea '%d' "%(t.lineno, t.value) t.lexer.skip(1) #expresion que me ignora los tabulados. enter . espacios t_ignore=' \t'

lexer = lex.lex() ## leer el archivo fuente archivo = open("codigo.txt", 'r') texto = archivo.read() archivo.close() lexer.input(texto) while True: tok = lexer.token() if not tok: break print tok RETROALIMENTACION Tiempo de Elaboracin del Programa: para la elaboracin del proyecto se utilizo mas de dos semanas Parte ms difcil e interesante: bueno un problema es acoplarse al lenguaje de programacin ver como maneja secuencias y todo eso, adems la definicin de las expresiones regulares para el reconociemiento de de identificadores y el optimo resultado de las mismas Un parte interesante dentro de la elaboracin del proyecto es que con base a lo ejecutado se pueden hacer muchas cosas elaborar restricciones segn lo que se quiere, no solo pensado en este proyecto si no pensado en la vida laboral y util

Bugs: Bueno dentro de los bugs mas comunes podemos decir que gira en torno a la definicin de las expresiones regulares ya que sabemos que de ests dependen que dicha secuencia reconozca y de cmo resultado algo optimo

Nombraremos las que mas causaron dificultad dentro de la elaboracin de las mismas o o o Identificacin de nmeros hexadecimales Errores en comentarios en bloque Definicin de las expresiones regulares para cada uno de los procesos

Mediante la elaboracin de dicho proyecto se modificaron muchas de las definiciones en cuanto a las expresiones regulares, se consultaron en paginas de internet y algunos documentos para podre establecer un ptimo desempeo y un optimo ejecutamiento de las mismas 6). CASOS DE PRUEBA Se hicieron las respectivas pruebas mediante cdigo y pelabras o caracteres que se escriban dentro de un archivo plano, en este caso dentro del archivo codigo.txt A continuacin un pequea muestra de los caracteres o cdigos ingresados y mencionados anteriormente

//algun pedacito de codigo en java...... /* miremos que sucede con este comentario en bloques esta como bueno */

algun pedacito de codigo java 45666456 0.234235345 10E-12 000023424 while return extend

You might also like