Los rboles sintcticos en la prctica son realmente difciles de construir porque ocuparan mucho espacio. Alternativamente se usan pilas.
En la Pila se guarda informacin sobre los nodos delrbol sintctico relevantes en cada fase del proceso.Teora Lenguajesrbol sintctico relevantes en cada fase del proceso.Para el caso descendente: en la pila se guardan losnodos no expandidos.
El analizador sintctico recibe una secuencia de tokens y decide si la secuencia est correcta o no.Los analizadores ms usados estn basados en un anlisis que puede ser descendente o ascendente. Para realizar este anlisis se deben construir los rboles sintcticos (derivacin).rboles sintcticos (derivacin).Dificultad: Bsqueda de la regla a aplicar, esto se efecta analizando la cadena de entrada de izquierda a derecha.Los analizadores sintcticos ms eficientes se basan en gramticas LL y LR.
Anlisis Lexicogrfico El analizador lexicogrfico, o explorador, es la parte del compilador que lee el programa fuente, carcter a carcter, y construye a partir de ste unas entidades primarias llamadas tokens. Es decir, el analizador lexicogrfico transforma el programa fuente en tiras de tokens.
Funciones de analizador lexicogrfico Funcin principal del analizador lxico Leer los caracteres de entrada y elaborar como salida una secuencia de componentes lxicos que utiliza el analizador sintctico para hacer el anlisis. Funciones secundarias. Eliminar del programa fuente comentarios y espacios en blanco (caracteres de espacio en blanco, caracteres TAB, caracteres de nueva lnea).
Relacionar los mensajes de error con el lenguaje fuente. En otras palabras, las funciones del analizador lxico-grfico son: - Eliminacin de espacios en blanco - Reconocimiento de identificadores y palabras clave - Reconocimiento de constantes - Mejorar la portabilidad del compilador
Fichas y lexemas: El analizador lexicogrfico puede tener la siguiente estructura. El analizador lxico opera bajo peticin del analizador sintctico con el fin de que este pueda avanzar en la gramtica. Tiene como propsito agrupar las expresiones en fichas. Estas fichas estn compuestas por 3 elementos: Componentes Lxicos (Token), Lexemas, Patrones Componente lxico (token): Son las unidades lgicas que genera el analizador lxico. Es el conjunto de cadenas de entrada que produce como salida el mismo componente lxico. Cada token es una secuencia de caracteres que representa una unidad de informacin en el programa fuente.
Los componentes lxicos ms comunes son los siguientes: - palabras clave o reservadas - operadores aritmticos - operadores relacionales - operadores lgicos - operador de asignacin - identificadores - constantes - cadenas - literales - signos de puntuacin - libreras
Lexema: Representan cadenas de caracteres en el programa fuente que se pueden tratar juntos como una unidad lxica. Un lexema es una secuencia de caracteres en el programa fuente con la que concuerda el patrn para un componente lxico.
Patrn: Regla que describe el conjunto de lexemas que pueden representar a un determinado componente lxico en los programas fuente.
Atributos de los componentes lxicos: El analizador lxico recoge informacin sobre los componentes lxicos en sus atributos asociados. Los componentes lxicos influyen en las decisiones del anlisis sintctico y los atributos en la traduccin de los componentes lxicos.
Errores de Patrones Si los compiladores tuvieran que procesar solamente programas correctos, su diseo e implementacin se simplificara en buena medida. Pero los programadores escriben programas incorrectos frecuentemente, y un buen compilador debe ayudar al programador a localizar e identificar los errores. Los errores en un programa pueden clasificarse en 4 grandes grupos: - lexicolgicos (escribir mal un nmero, un smbolo no permitido, etc.) - sintcticos (expresin aritmtica con parntesis no balanceados) - semnticos (aplicar un operador a un operando incompatible) - lgicos o de programacin (ciclo infinito) El analizador lxico detecta errores cuando los caracteres que restan de la entrada no forman ningn token vlido en el lenguaje. Los errores referentes a que los tokens no cumplan con las reglas estructurales (sintaxis) del lenguaje se detectan en la fase de anlisis sintctico. Durante el anlisis semntico el compilador trata de detectar estructuras que tengan una sintaxis correcta pero incorrecta semnticamente de acuerdo a las operaciones involucradas. Ejemplo si tratamos de sumar dos identificadores, uno el nombre de un arreglo y el otro el nombre de un procedimiento. Las fases de anlisis sintctico y semntico manejan usualmente la mayor parte de los errores detectables por el compilador. Como podemos apreciar en cada fase del proceso de compilacin se pueden encontrar errores. Sin embargo, despus de detectado el error, la fase puede tratar el error, de manera que el compilador pueda continuar, permitiendo as que se puedan detectar errores posteriores. Un compilador que se detenga cuando encuentre el primer error no es muy eficaz. El tratamiento de los errores durante el proceso de compilacin (en cualquiera de sus fases) debe cumplir al menos los requisitos siguientes: - reportar la presencia de los errores clara y precisamente - recuperarse de los errores lo suficientemente rpido como para ser capaz de detectar los errores siguientes - no demorar significativamente el procesamiento de los programas correctos.
Expresiones regulares Las expresiones regulares son una serie de caracteres que forman un patrn, normalmente representativo de otro grupo de carcter mayor, de tal forma que podemos comparar el patrn con otro conjunto de caracteres para ver las coincidencias.
Las expresiones regulares estn disponibles en casi cualquier lenguaje de programacin, aunque su sintaxis es relativamente uniforme, cada lenguaje usa su propio dialecto.
El poder de las expresiones regulares radica precisamente en la flexibilidad de los patrones, que pueden ser confrontados con cualquier palabra o cadena de texto que tenga una estructura conocida.
De hecho normalmente no es necesario usar funciones de expresiones regulares si vamos a usar patrones literales. Existen otras funciones (las funciones de cadena) que trabajan ms eficaz y rpidamente con literales. Mtodo de Thompson El mismo se crea en honor a Kenneth Lane Thompson, pionero en el desarrollo de sistemas operativos y procesadores. Diseador y colaborador del Sistema Operativo Unix, Lenguaje Bon,B,C. El algoritmo se construye a partir de expresiones regulares un diagrama de AFN, para luego poder generar un AFD mnimo equivalente. Utiliza una notacin estndar para generar un AFN
Para la representacin de una cadena vaca se utiliza el smbolo
Para representar un smbolo, se utilizan dos estados y una transicin para el movimiento con el smbolo rs
Para la eleccin de alternativas, crear transicionespara launin de las transiciones
Eleccin de Alternativa Para la cerradura Positiva, se agregan transicionespararetornar al estado previo, permitiendo agregar 1 oms veces el smbolo
Cerradura de Kleene Para la cerradura de Kleene, se agregan transiciones para retornar a estado previo. Y otra transicinparasaltar la transicin con r
r*
UNIDAD V: Anlisis Ascendente Consiste en construir el rbol sintctico desde abajo hacia arriba, esto es, desde los tokens hacia el axioma inicial, lo cual disminuye el nmero de reglas mal aplicadas con respecto al caso descendente (si hablamos del caso con retroceso) o ampla el nmero de gramticas susceptibles de ser analizadas (si hablamos del caso LL(1)).
Gramticas LL (k): Es un mtodo predictivo, no recursivo. Suele dar buenos resultados en aplicaciones pequeas (shells, compiladores de pequeos lenguajes, etc.) donde precedencia simple no resulta suficiente.
El mtodo de funcionamiento es independiente del lenguaje. Al variar este solo variarla la tabla. Como ya hemos comentado alguna vez, las casillas en blanco de la tabla suponen acciones semnticas, errores. Veremos en seguida su estructura y como se construye.
Conjuntos First (k): Definicin de firstkpara unagramtica gsea una cfg g = <n, , s, p >, k n (n)*se define first k: ( n ) * kfirstk() = {w */ |w <= k *w }dnde:es alguna forma sentencia generada por g. El resultado es el conjunto de terminales de longitud, a lo sumo k, con que pueden comenzar las cadenas derivadas de Propiedades de los conjuntos firstk()sicomienza con un terminalx,entonces:zfirst1() = {x} .zsi*, entoncesfirst k () z firstk() = {}
Condicin LL (k):Smbolos directores, ayudan a decidir qu regla utilizar en cada paso Condiciones necesarias para ser LL(1)
- No ambigua
- Factorizada por la izquierda
- No recursiva a izquierdas
Se dice que una gramtica cumple la condicin LL(1)si para cada par de reglas de la gramtica que tengan el mismo antecedente la interseccin de sus smbolos directores es vaca. Es decir, Si se tienen las producciones del no terminal A: A o1|o2|.....|o Nse debe cumplir que 1. PRIM(oi) PRIM(oj)=Ci =j oieE*2.Si e PIM(oj)entoncesPRIM(oi) SIG(A)=Ci =j
Eliminacin de la Recursin a la Izquierda Para eliminar la recursividad por la izquierda lo que haremos ser: Si tenemos A->Aa1|Aa2|...|Aap|b1|b2|...|bq podemos escribirlo como
A->Aai 1<=i<=p A->bj 1<=j<=q Para quitar la recursividad por la izquierda escribimos A->biA' 1<=i<=q, A' nuevo smbolo e Te A'->ajA'|l 1<=j<=p
Anlisis recursivo descendente: Esta es la fase en la construccin del analizador donde la fase de anlisis es sintctico. Esta toma como entrada el flujo de terminales y construye como salida el rbol de anlisis sintctico abstracto. El rbol de anlisis sintctico abstracto es una representacin compactada del rbol de anlisis sintctico concreto que contiene la misma informacin que ste. Existen diferentes mtodos de anlisis sintctico. La mayora caen en una de dos categoras: ascendentes y descendentes. Los ascendentes construyen el rbol desde las hojas hacia la raz. Los descendentes lo hacen en modo inverso. El que describiremos aqu es uno de los ms sencillos: se denomina mtodo de anlisis predictivo descendente recursivo.
Analizador predictivo no recursivo:Es posible construir un analizador sintctico predictivo no recursivo (APNR) manteniendo una pilapara no usar la recursividad.Estos analizadores buscan la produccin a usar dentro de una tabla de anlisis sintctico. Dentro de una tabla de anlisis sintctico.Tambin se conocen como analizadores sintcticos dirigidos por tablas.Un mtodo descendente dirigido por tablas es el mtodo que se basa en gramticas LL(1)
Algoritmos de Anlisis predictivo:Anlisis descendente recursivo (ARD)Mtodo descendente en el que se ejecuta un conjunto de mtodos recursivos para procesar la entrada.A cada no terminal de la gramtica se asocia un mtodo.La secuencia de mtodos llamados durante elprocesamiento de la entrada define implcitamente unTeora Lenguajesprocesamiento de la entrada define implcitamente unrbol de anlisis sintctico. Adicionalmente se tiene:Un mtodo de tratamiento de error Un mtodo de lectura de un smbolo de entrada (lxico) Una forma eficiente de un analizador sintctico descendente sin retroceso es el denominado Analizador sintctico predictivo.Preliminar: Dado un smbolo de entrada ay el no terminal A con Teora Lenguajes6Dado un smbolo de entrada ay el no terminal A con la siguiente produccin:A 1 2 3 . . . nes necesario conocer la nica alternativa que comienzacon el smbolo a
UNIDAD VI: Anlisis Descendente El anlisis sintctico descendente es una tcnica de anlisis sintctico que intenta comprobar si una cadena x pertenece al lenguaje definido por una gramtica L(G) aplicando los siguientes criterios: Partir del axioma de la gramtica Escoger reglas gramaticales estratgicamente Hacer derivaciones por la izquierda (LeftMostDerivation) Procesar la entrada de izquierda a derecha Obtener el rbol de anlisis sintctico o error
Implementacin por pila de un analizador corrimientos-reduccin: En el rea de los lenguajes formales, un analizador de sintaxis por precedencia simple es un tipo de analizador sintcticoascendente para gramticas libres de contexto que pueden ser utilizados para reconocer gramticas de precedencia simple. La implementacin del parser es bastante similar al analizador sintctico ascendente genrico. Una pila es utilizada para almacenar el prefijo viable de una forma sentencial de una derivacin ms a la derecha. Los smbolos , y son utilizados para identificar el pivote, por lo tanto sabremos cuando Desplazar o cuando Reducir.
Prefijos viables:Son los posibles contenidos de la pilapara cada regla de la gramtica:Hemos de decidir cundo convieneusarla para reducir m, es decir, y sabiendolo que hay en la pila",y sabiendo cual es el prximo smbolo de la entrada,saber si hemos de reducir por esa regla o no.Consideramos un paso intermedio de la derivacin derecha: que esnecesario conocer para saber cul fue el paso anterior
Gramticas LR (k):Este tipo de analizadores recibe este nombre por lo siguiente: la L hace referencia a qu el examen de la entrada se realiza de izquierda a derecha; la R se debe a que las reconstrucciones en orden inverso nos llevan a derivaciones por la derecha y la K, como ya imaginamos, es por el nmero de smbolos de anticipacin que se necesitan para una correcta toma de decisiones.
Mtodo SLR: La condicin que impone el anlisis LR(0), como ya hemos dicho, es muy restrictiva, ya que los tems completos han de aparecer en conjuntos separados. Esto no se cumple en la mayora de las gramticas que describen lenguajes de programacin. Sin embargo existe una forma sencilla de ampliar la aplicacin de sta a una gama ms amplia de gramticas, mediante la lectura de un smbolo en la entrada para determinar la funcin a realizar. Cuando una mquina de reconocimiento LR est en un determinado estado, el conjunto de tems vlidos para la subcadena que se encuentra en la pila en ese momento es precisamente el conjunto de la coleccin asociado a dicho estado. Si en este conjunto aparece un tem completo y otro tem ms (ya sea completo o no), se produce un conflicto en el anlisis LR(0), ya que no podemos decidir qu accin realizar. El caso del anlisis de la cadena tas. (t,a,s pertenecen a T, que en un momento determinado del anlisis, y tras leer la subcadena t, tendremos en la pila una subcadena viable , quedando por leer an la subcadena as. Esto nos indica que as es una forma sentencial del lenguaje. Supongamos tambin que existe un tem completo vlido asociado a esta subcadena viable, de la forma [A -> ]. Tras efectuar la reduccin correspondiente obtendramos la tira Aas, que debe ser una forma sentencial de nuestro lenguaje. Es evidente que una condicin necesaria para que esto suceda es que el smbolo a pueda aparecer a la derecha de A en alguna forma sentencial. Es decir, que a pertenezca al conjunto SIGUIENTE(A), tal y como se defini en el apartado dedicado al anlisis LL(1). Bibliografa: http://www.google.co.ve/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CB0QFj AA&url=http%3A%2F%2Fwww.dirinfo.unsl.edu.ar%2Fcompi%2Forganizacion%2Fproco m02.doc&ei=cMkRVK6vFYHLgwTNhYG4Dg&usg=AFQjCNERfazPR6QnMdnx0Px9V QV4HtUYQg