Sunteți pe pagina 1din 7

TRABAJO SEGUNDO AVANCE ANALIZADOR SINTCTICO

PRESENTADO POR: NORBERTO SANCHEZ ANGULO PEDRO MIGUEL CUADROS DE AVILA

PRESENTADO A : ING. CARLOS ALBERTO GARCIA CASTRO

FUNDACIN UNIVERSITARIA TECNOLGICO COMFENALCO FACULTAD INGENIERIA DE SISTEMAS IX SEMESTRE CARTAGENA BOLIVAR

CONTENIDO

1. MARCO TERICO (Anlisis Sintctico) 2. FUNCIN DE CADA ESTRUCTURA DE DATOS UTILIZADA PARA EL SCANNER 3. OBJETIVO DE CADA PROCEDIMIENTO Y FUNCIN UTILIZADA PARA EL SCANNER 4. DIFICULTADES EN LA ELABORACIN DEL SCANNER

1. MARCO TERICO ANLISIS SINTCTICO Es la fase del analizador que se encarga de chequear el texto de entrada en base a una gramtica dada. Y en caso de que el programa de entrada sea vlido, suministra el rbol sintctico que lo reconoce. En teora, se supone que la salida del analizador sintctico es alguna representacin del rbol

sintctico que reconoce la secuencia de tokens suministrada por el analizador lxico. Expresiones regulares en Python Las expresiones regulares, tambin llamadas regex o regexp, consisten en patrones que describen conjuntos de cadenas de caracteres. Algo parecido sera escribir en la lnea de comandos de Windows: dir *.exe *.exe sera una expresin regular que describira todas las cadenas de caracteres que empiezan con cualquier cosa seguida de .exe, es decir, todos los archivos exe. El trabajo con expresiones regulares en Python se realiza mediante el mdulo re, que data de Python 1.5 y que proporciona una sintaxis para la creacin de patrones similar a la de Perl. En Python 1.6 el mdulo se reescribi para dotarlo de soporte de cadenas unicode y mejorar su rendimiento. El mdulo re contiene funciones para buscar patrones dentro de una cadena (search), comprobar si una cadena se ajusta a un determinado criterio descrito mediante un patrn (match), dividir la cadena usando las ocurrencias del patrn como puntos de ruptura (split) o para sustituir todas las ocurrencias del patrn por otra cadena (sub). Este metodo se decidi usar como reemplazo de los autmatas debido a la complejidad que estos representan en el lenguaje python, y dado que este metodo cumple las mismas funciones que los autmatas. 2. FUNCIN DE CADA ESTRUCTURA DE DATOS UTILIZADA PARA EL SCANNER Listas(list) : Se utiliza cuando se maneja la funcin re.findall(), ya que este devuelve los valores como listas. La lista es una coleccin de datos ordenada, alguna equivalencia con otros lenguajes seria los arrays o vectores. La lista puede contener cualquier tipo de dato (enteros, cadenas y otras listas ). Las listas se pueden crear de la siguiente manera: lista = [''hola'',2,''hacker'',[1,2,3,4,5]] para imprimir una lista: print (lista)=>[''hola'',2,''hacker'',[1,2,3,4,5]] si se quiere acceder a uno de los elementos de la lista lo hacemos utilizando el nombre que hacemos referencia a la lista en este caso lo llame lista puede ser cualquiera y entre corchete indicamos un indice, dicho indice va de 0 a n-1: >>>print(lista[0])=>hola,>>>print(lista[3])=>[1, 2, 3, 4, 5] append(object) Aade un objeto al final de la lista insert (index, object ) inserta el objeto a la lista en la posicion index pop(index) Devuelve el valor de la posicion index y lo elimina de la lista. remove(value) elimina la primera ocurrencia de value 1

3. OBJETIVO DE CADA PROCEDIMIENTO Y FUNCIN UTILIZADA EN EL SCANNER GUI

1 Listas en python, Consultado el 15 de marzo de 2012, Disponible en:http://pycol.blogspot.com/2009/02/tuplas-en-python.html

QT y PyQT2 las libreras Qt, podra decirse que es a KDE lo que GTK a Gnome. Son unas practicas libreras que hacen bastante sencillo y rpido el desarrollo de aplicaciones grficas. Originalmente estaban desarrolladas para el lenguaje de programacin C++, pero debido al xito que estn cosechando, se estn realizando conversiones de las mismas a otros lenguajes de programacin como Java (De forma oficial por Trolltech) o Python. Lo mejor de esta librera es la herramienta que incluye para disear las ventanas de forma grfica (Qt-Desiger) y las herramientas que incluye para generar los Makefiles para compilar nuestros proyectos de forma casi automtica. Os dejo una captura de como se trabaja con QtDesginer. PyQT es el nombre que esta libreria toma en python. Funciones utilizadas Expresiones regulares(Modulo RE Python) Una expresin regular (RE) especifica un conjunto de cadenas que sern buscadas; las funciones de este mdulo le permite comprobar si una cadena especfica coincide con una expresin regular. re.search() : Analizar a travs de cadena en busca de un lugar donde esta expresin regular produce una coincidencia, y devuelve una instancia MatchObject correspondiente. re.compile() : Analiza a travs de un rango de cadena y busca la expresin que se le pide, despus de usar esta funcin se puede usar re.serch() , re.match(), re.sub()para encontrar la cadena especifica. re.findall(): devuelve todo el resultado de la bsqueda en forma de lista de cadenas de acuerdo al orden en que encontro cada uno de los datos que han sido indicados en el patrn. re.sub(): realiza sustituciones en cadenas basndose en expresiones regulares. sorted(list):devuelve una lista ordenada. set(list): devuelve los valores de una lista sin repetir un valor.3

PROCEDIMIENTO DE LECTURA DEL ARCHIVO: self.filedialog = QtGui.QFileDialog.getOpenFileName(self, 'Open file','/home')-->Obtiene el .html que fue buscado en el navegador de archivos carga = open(self.filedialog, 'r')-->abre el archivo para su futura lectura html =carga.read()--> lee el archivo para luego ser manipulado. PROCEDIMIENTOS DE ELIMINACIN DE CADENAS SEGN EL PATRN: def quitar_com(data): p = re.compile(r'#.*') return p.sub('', data)
2

Python QT http://plagatux.es/2007/12/python-qt-pyqt-desarrollo-facil-y-rapido-de-aplicaciones-con-gui/

3 Expresiones regulares y operaciones, Consultado el 15 de marzo de 2012, Disponible en: http://docs.python.org/library/re.html

elimina los comentarios que se encuentren dentro del script

def quitar_coma(data): p =re.compile(r',') return p.sub('\n', data) cambia las comas(,) por un salto de linea ej: a,b,c =a\nb\nc . para mejorar las busquedas de variables def quitar_pala(data): p = re.compile(r'entero|cadena|fecha|logico|real|si.*|finsi|sino|recibe.*|mq.*|finmq|para.*| finpara|""|envia.*|haga.*|[a-zA-Z]=.*') return p.sub('', data) encuentra todos los patrones que estan dentro de la expresion regular y los reemplaza por (null) es decir borra todo lo que encuentra segn los patrones dados Nota: Existen prodecimientos parecidos a este ultimo dentro del programa que realizan una funcin similar o tienen un objetivo similar PROCEDIMIENTO PARA VALIDAR EL CARCTER DE FIN DE LINEA (;)
for item in mylist: -->busca dentro de la variable mylist if item: new_str += item + '\n' data=open('data.txt', 'w')-->crea un nuevo documento data=open('data.txt', 'a') data.write(new_str)-->guarda el script sin lineas en blanco en el documento data.close()-->se cierra para que guarde cambios load=open('data.txt', 'r')-->abre nuevamente el documento sube=load.readlines()-->lee el nuevo documento carga=map(lambda s: s.strip(), sube)-->separa las lineas que contiene el script pattern = re.compile(r"([0-9A-Za-z,""()];)").-->RE para buscar las lineas que contienen (;) validacion = [x for x in carga if pattern.search(x)]-->hace una busqueda donde todas las lineas tengan ( ;) si no esta busqueda no coincide con el tamao de la primera lista lanza error...

PROCEDIMIENTO DE BSQUEDA DE PALABRAS EN EL SCRIPT:


found=cargar.find(str(self.ventana.buscador.text()))-->carga la palabra que se escribe en LineText start = 0 count = 0 while True:-->mientras sea Verdadero index=cargar.find(str(self.ventana.buscador.text()),start)-->Comenzar Busqueda if found>=0: -->si encuentra un valor mayor que 0 self.ventana.word.setText(self.ventana.buscador.text())-->imprima la palabra que esta buscando count=count + 1 else: self.ventana.word.setText("none")-> si no hay palabras coincidientes coloca none.. self.ventana.times.setText("none") if index == -1: break start = index + 1 self.ventana.times.setText(str(count))--->imprime las veces que se encontro la palabra

PROCEDIMIENTO PARA VALIDAR SENTENCIA DECLARE: Dentro de la clase syntax.py se agregan las siguientes reglas para colorear los errores si se encuentra un declare mal formado : # Validacin de la sentencia Declare

(r'(^Declare(\s)+(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['errordeclare']), (r'(^Declare[\w\d]+(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['errordeclare']), (r'(^Declare(\s)+[\w\d]+(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['errordeclare']), (r'(^Declare[\w\d]+(\s)+(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['errordeclare']), (r'(^Declare(\w+\d*,\w+\d*)+(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['errordeclare']), (r'((\w+\d*,\w+\d*)+(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['errordeclare']), (r'(\s(Entero|Cadena|Logico|Fecha|Real)(\s+)?$)', 0, STYLES['errordeclare']), (r'(\s(Entero|Cadena|Logico|Fecha|Real)(\s+\#.*)$)', 0, STYLES['errordeclare']), (r'(^Declare(\w+\d*,\w+\d*)+)', 0, STYLES['errordeclare']), (r'(^Declare(\s)(,))', 0, STYLES['errordeclare']), (r'(^Declare(\s)(\w+\d*,)+))', 0, STYLES['errordeclare']), (r'(^Declare(\s)(\w+\d*,)+(\s)+)', 0, STYLES['errordeclare']), (r'(^Declare(\s)((,)+)(\s)(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['errordeclare']), (r'(^Declare((,)+)(\s)(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['errordeclare']), (r'((\w+\d*,\w+\d*)+\s+;)', 0, STYLES['errordeclare']),

PROCEDIMIENTO PARA DETECTAR VARIABLES INVALIDAS: Dentro de la clase syntax.py se agregan las siguientes reglas para colorear los errores si se encuentra una variable mal formada : # Variables Erradas
(r'(^Declare(\s)([\d\W_]+)[\w\d_]{1,100}(,))', 0, STYLES['error']), (r'(^Declare(\s)([\d\W_]+)(,))', 0, STYLES['error']), (r'(^Declare(\s)([\d\W_]+)[\w\d_]{1,100}(\s))', 0, STYLES['error']), (r'(^Declare(\s)([\d\W_]+)(\s))', 0, STYLES['error']), (r'((,)([\d\W_]+)(,))', 0, STYLES['error']), (r'((,)([\d\W_]+)[\w\d_]{1,100}(,))', 0, STYLES['error']), (r'((,)([\d\W_]+)(\s)(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?)', 0, STYLES['error']), (r'((,)([\d\W_]+)[\w\d_]{1,100}(\s)(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?)', 0, STYLES['error']), (r'(^Declare(\s)([\w\d_]{16,})(,))', 0, STYLES['error']), (r'(^Declare(\s)([\w\d_]{16,})(\s)(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['error']), (r'((,)([\w\d_]{16,})(,))', 0, STYLES['error']), (r'((,)[\w\d_]{16,}(\s)(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?)', 0, STYLES['error']), (r'(^Declare(\s)(\w+\W+\d*,)+)(\s)(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['error']), (r'(,[\W\w\d\_]+(\W+)(\s)(Entero)?(Cadena)?(Logico)?(Fecha)?(Real)?;)', 0, STYLES['error']), (r'([A-Za-z0-9_],([A-Za-z0-9_]+(\W)+\s.*;)$)', 0, STYLES['error']),

DETECTAR VARIABLES: Declaradas: def declaradas(self):


self.ventana.capturador.setPlainText("") archivo=open('script.txt','r') lol=archivo.read() pat=quitar_tipo(lol) patternos = re.findall(r"Declare(.*)",pat,re.MULTILINE) for i in patternos: fixer=i+'\n' loops=quitar_final(fixer) self.cursor5 = QtGui.QTextCursor() self.cursor5 = self.ventana.capturador.textCursor() self.cursor5.insertText(str(loops))

No Declaradas:
loading= re.findall(r"\b(?!Declare).*[a-zA-Z0-9]\b",var) caf=quitar_declares(lol) lod=quitar_simbolos(caf) load=quitar_reservadas(lod)

patternos = re.findall(r"(\w+)",load,re.MULTILINE) nodeclarada=[i for i in patternos if not i in loading] print nodeclarada for inv in set(nodeclarada): fixs=inv+'\n' coops=quitar_final(fixs) self.cursor6 = QtGui.QTextCursor() self.cursor6 = self.ventana.capturador.textCursor() self.cursor6.insertText(str(coops))

Declaradas y No usadas:
loading= re.findall(r"(\w+)",var,re.MULTILINE) print 'loading',loading caf=quitar_declares(lol) lod=quitar_simbolos(caf) load=quitar_reservadas(lod) patternos = re.findall(r"([A-Za-z0-9_]{1,15})",load,re.MULTILINE) liff=sorted(set(patternos)) print 'Patternos' ,liff nodeclarada=[i for i in loading if i not in patternos] print 'Declaradas y no Usadas',nodeclarada for inv in sorted(set(nodeclarada)): fixs=inv+'\n' coops=quitar_final(fixs) self.cursor6 = QtGui.QTextCursor() self.cursor6 = self.ventana.capturador.textCursor() self.cursor6.insertText(str(coops))

4. DIFICULTADES EN LA ELABORACIN DEL SCANNER Para este segundo avance se realiz un cambio de la GUI grfica, anteriormente se us GLADE y GTK, pero por motivos de compatibilidad y de realizar algunas funciones nuevas para el proyecto se tom la decisin de portar el entorno grfico a PyQT. Adems se utilizo una clase para el coloreo de sintaxis, que se dificulto mucho su creacin y su manipulacin para crear las reglas de los datos dentro de los TextArea.

S-ar putea să vă placă și