Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 3
Tema 3
Bibliograf a: Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, t ecnicas y herramientas, Tema 4, p ag.: 163-186. Louden, K.C. (1997), Compiler Construction: Principles and Practice, Tema 3, p aginas: 93-140. Contenidos: 1. El proceso de an alisis sint actico. 2. Especicaci on sint actica de los lenguajes de programaci on: aticas independientes del contexto versus exprea ) Gram siones regulares. b ) Gram aticas independientes del contexto versus gram aticas dependientes del contexto. 3. Derivaciones y arboles sint acticos. 4. Gram aticas limpias y bien formadas. uedad en las gram aticas. Elimi5. El problema de la ambig naci on: a ) Mediante reglas de precedencia. b ) Mediante transformaci on. on de los m etodos de an alisis sint actico. 6. Clasicaci
71
72
3.1.
Funciones del analizador sint actico: Comprobar si la cadena de componentes l exicos proporcionada por el analizador l exico puede ser generada por la gram atica que dene el lenguaje fuente (Gram atica Independiente del Contexto, GIC). Construir el arbol de an alisis sint actico que dene la estructura jer arquica de un programa y obtener la serie de derivaciones para generar la cadena de componentes l exicos. El arbol sint actico se utilizar a como representaci on intermedia en la generaci on de c odigo. Informar de los errores sint acticos de forma precisa y signicativa y deber a estar dotado de un mecanismo de recuperaci on de errores para continuar con el an alisis.
gram. indep. contexto
programa fuente
analizador lxico
componente lxico
analizador sintctico
analizador
rbol semntico anlisis sintctico
gestor errores
tabla de smbolos
El an alisis sint actico se puede considerar como una funci on que toma como entrada la secuencia de componentes l exicos producida por el an alisis l exico y produce como salida el arbol sint actico. En la realidad, el an alisis sint actico hace una petici on al an alisis l exico del componente l exico siguiente en la entrada (los s mbolos terminales) conforme lo va necesitando en el proceso de an alisis, conforme se mueve a lo laro de la gram atica. Reconocedor versus analizador sint actico
Un reconocedor trata de determinar simplemente si la cadena puede o no ser generada por la gram atica (salida boolena). Podr amos preguntar algo m as. Si queremos reconocer las estructuras propias de los lenguajes de programaci on en el chero de entrada para guiar la traducci on, es necesario conocer su estructura jer arquica, el arbol de an alisis sint actico.
3.2.
La mayor a de las construcciones de los lenguajes de programaci on se pueden representar con una gram atica independiente del contexto (GIC). La mayor a de las construcciones de los lenguajes de programaci on implican recursividad y anidamientos. G = {S, VT , VN T , P }, S: el axioma o s mbolo de inicio VT : conjunto de terminales, los componentes l exicos VN T : conjunto de no-terminales P: conjunto de reglas de producci on de la forma VN T X1 , . . . , Xn , con Xi (VT VN T ) Pregunta: Si las expresiones regulares son un caso particular de GIC, por qu e no se incluye la especicaci on l exica como parte de la sintaxis? Los AFD son muy sencillos de implementar y son muy ecientes frente a los aut omatas a pila necesarios para reconocer las GIC, la eciencia del traductor se ver a comprometida. Expresiones regulares o gram aticas independientes del contexto? Las expresiones regulares no permiten construcciones anidadas tan comunes en los lenguajes de programaci on: par entesis equilibrados, concordancia de pares de palabras clave como begin-end, do-while, ... Por ejemplo: consideremos el problema de los par entesis equilibrados en una expresi on aritm etica. El hecho de que haya un
74
par entesis abierto obliga a que haya un par entesis cerrado. Este problema es similar a considerar el lenguaje L = {aba, aabaa, aaabaaa, . . . , } = {an ban 0} Si intentamos escribir una expresi on regular, lo m as pr oximo ser a: {a ba } pero no se garantiza que el n umero de as antes y despu es sea el mismo. Las expresiones regulares NO SABEN contar. NO es posible especicar la estructura de un lenguaje de programaci on con s olo expresiones regulares. Son sucientes las gram aticas independientes del contexto? NO, existen ciertos aspectos de los lenguajes de programaci on que no se pueden representar con una GIC. A estos aspectos se les llama aspectos sem anticos, son aspectos en general dependientes del contexto. Por ejemplo, el problema de declaraci on de los identicadores antes de uso. Se podr a representar mediante el lenguaje L={wcw tal que w (a|b) } este lenguaje no puede ser representado por una GIC. Por qu e no usar gram aticas contextuales? Su reconocimiento es demasiado complejo para ser eciente en un problema pr actico. Ser a en el tema de an alisis sem antico donde se abordar a estos problemas mediante el uso de acciones concretas (acciones sem anticas) que no son propias de la gram atica en s . Ser a codigo escrito para hacer las comprobaciones sem anticas necesarias (tipos, declaraci on antes de uso, ...)
TypeList VarList IdList Parameter ParameterList SimpleType TypeDenoter CompositeType FieldList StatementList Statement AssignStm LeftValue IfStm ElseStm WhileStm FunctionStm ReturnStm WriteStm ReadStm Arg Num ArgList Expression
76
3.3.
Dada , (VT VN T ) cadenas arbitrarias de s mbolos gramaticales, se dice que A es una derivaci on, si existe una producci on A . Sea S , si (VT VN T ) se dice que es una forma de frase o forma sentencial si (VT ) se dice que es una frase o sentencia. Existen dos tipos de derivaciones: Derivaci on m as a la izquierda: se sustituye en cada paso el no-terminal m as a la izquierda de la forma de frase. La denotaremos por: mi Derivaci on m as a la derecha: se sustituye en cada paso el no-terminal m as a la derecha de la forma de frase. La denotaremos por: md Por ejemplo para la gram atica:
E id | num | E + E | ( E ) | - E
Si queremos derivar la frase (id + id) E E (E + E ) (id + E ) (id + id) derivaci on m as a la izquierda. E E (E + E ) (E + id) (id + id) derivaci on m as a la derecha.
77
3.3.1.
Un arbol de an alisis sint actico indica c omo a partir del axioma de la gram atica se deriva una frase (cadena) del lenguaje. Dada una gram atica independiente del contexto, un arbol de an alisis sint actico es un arbol tal que: z est a etiquetada con el s mbolo inicial. 1. La ra 2. Cada hoja est a etiquetada con un componente l exico. Las hojas de izquierda a derecha forman la frase (el programa fuente). 3. Cada nodo interior est a etiquetado con un no-terminal. 4. Si A es un no-terminal y X1 , X2 , . . . , Xn son sus hijos de izquierda a derecha, entonces existe la producci on A X1 , X2 , . . . , Xn , con Xi (VT VN T ). El arbol de an alisis sint actico contiene en general mucha m as informaci on que la estrictamente necesaria para generar el c odigo. Se puede construir una estructura m as sencilla, los arboles abstractos de an alisis sint actico. Ejemplo: expresiones aritm eticas (igual sem antica, menor complejidad)
Entrada: id * id E E * E id * id
* + id id id
78
3.4.
Llamamos s mbolo vivo al s mbolo a partir del cual se puede derivar una cadena de terminales. Llamamos s mbolo muerto a los s mbolos no-vivos, no generan una cadena del lenguaje. Llamamos s mbolo inaccesible si nunca aparece en la parte derecha de una producci on. A las gram aticas que contienen estos tipos de s mbolos se les llama gram aticas sucias. Teorema 1: si todos los s mbolos de la parte derecha de una producci on son s mbolos vivos, entonces el s mbolo de la parte izquierda tambi en lo es. Algoritmo para detectar s mbolos muertos 1. Hacer una lista de no-terminales que tengan al menos una producci on con s olo s mbolos terminales en la parte derecha. 2. Dada una producci on, si todos los no-terminales de la parte derecha pertenecen a la lista, entonces podemos incluir en la lista al no-terminal de la parte izquierda de la producci on. 3. Cuando ya no se puedan incluir m as s mbolos en la lista mediante la aplicaci on del paso 2, la lista contendr a los s mbolos no-terminales vivos y el resto ser an s mbolos muertos.
79
Teorema 2: si el s mbolo no-terminal de la parte izquierda de una producci on es accesible, entonces todos los s mbolos de la parte derecha tambi en lo son. Algoritmo para detectar s mbolos inaccesibles 1. Se inicializa una lista de no-terminales que sabemos que son accesibles con el axioma. 2. Si la parte izquierda de una producci on est a en la lista, entonces se incluye en la misma al no-terminal que aparece en la parte derecha de la producci on. as s mbolos a la lista medi3. Cuando ya no se pueden incluir m ante la aplicaci on del paso 2, entonces la lista contendr a todos los s mbolos accesibles y el resto de los no-terminales ser an innacesibles. Para limpiar una gram atica primero se eliminan los s mbolos muertos y despu es los s mbolos inaccesibles. Una gram atica est a bien formada si es limpia y adem as no contiene producciones- . Para eliminar producciones- , remitirse a la signatura de TALF. Ejemplo: limpiar la gram atica
SaAB|A AcBd Be|fS CgD|hDt Dx|y|z
80
3.5.
Una gram atica es ambigua cuando para una determinada sentencia produce m as de un arbol de derivaci on. La gram atica siguiente es ambigua:
E id | num | E + E | E * E | ( E ) | - E
Supongamos la sentencia
id + id * id
E + E * E num
num E num
El signicado sem antico es DIFERENTE. No existe una u nica traducci on posible. Se genera c odigo diferente. No existe un algoritmo que determine con certeza en un plazo nito de tiempo si una gram atica es ambigua o no. A lo sumo que se ha llegado en el estudio de la ambig uedad es que hay algunas condiciones que de cumplirse determinan la ambig uedad, pero en el caso de no cumplirse no se puede decir que la gram atica es no ambigua. Necesidad de evitar las gram aticas ambiguas. C omo? transformando la gram atica o estableciendo precedencias entre operadores y de asociatividad. Se puede eliminar la ambig uedad transformando la gram atica agrupando todos los operadores de igual precedencia en grupos y asociando a cada uno una regla, de forma que los que tengan menor precedencia aparezcan m as cercanos al s mbolo de inicio, precedencia en cascada. Esto conlleva el aumento de la complejidad de la gram atica y con ello en la del arbol sint actico. La gram atica deja de ser intuitiva.
81
IMPORTANTE: Una regla recursiva a izquierdas, hace que el operador sea asociativo por la izquierda. Una regla recursiva a derechas hace que el operador sea asociativo por la derecha. Ejemplo 2: el problema del dangling else y el convenio de la asociaci on al if m as cercano.
statement if stmt | other if stmt if ( exp) statement | if ( exp) statement else statement exp 0 | 1
Por ejemplo: para la sentencia if (0) if (1) other else other tenemos dos arboles de derivaci on. Crear los dos arboles ...
82
3.6.
Atendiendo a la forma en que se construye el arbol de an alisis sint actico los m etodos de an alisis sint actico se clasican: M etodos descendentes: se parte del s mbolo de inicio de la gram atica que se coloca en la ra z y se va construyendo el arbol desde arriba hacia abajo hasta las hojas, eligiendo la derivaci on que da lugar a una concordancia con la cadena de entrada. Se basa en la idea de predice una derivaci on y establece una concordancia con el s mbolo de la entrada (predict/match). El an alisis sint actico descendente corresponde con un recorrido prejo del arbol de an alisis sint actico (primero expandimos el nodo que visitamos y luego procesamos los hijos).
S Sujeto Verbo Objeto Sujeto el Nombre | un Nombre Objeto el Nombre | un Nombre Verbo el Nombre | un Nombre Nombre perro | gato | le on
Ejemplo:
El le on caz o un gato
Crear el arbol... Problemas: recursi on a izquierdas, diferentes alternativas en una producci on, c omo conseguir un coste lineal?
83
M etodos ascendentes: se construye el arbol de an alisis sint actico desde las hojas hasta la ra z. En las hojas est a la cadena a analizar y se intenta reducirla al s mbolo de inicio de la gram atica que est a en la ra z. Se trata de desplazar-se en la cadena de entrada y encontrar una subcadena para aplicar una reducci on (una regla de producci on a la inversa), (shiftreduce). El an alisis sint actico ascendente corresponde con un recorrido postorden del arbol (primero reconocemos los hijos y luego mediante una reducci on reconocemos el padre). Insertar un ejemplo de como efectivamente los dos tipos de an alisis corresponden con los tipos de recorrido prejo y postjo. Atendiendo a la forma en que procesan la cadena de entrada se clasican en: M etodos direccionales: procesan la cadena de entrada s mbolo a s mbolo de izquierda a derecha. M etodos no-direccionales: acceden a cualquier lugar de la cadena de entrada para construir el arbol. Necesitan tener toda la cadena de componentes l exicos en memoria. M as costosos, no se suelen implementar. Atendiendo al n umero de alternativas posibles en una derivaci on se clasican en: M etodos deterministas: dado un s mbolo de la cadena de entrada se puede decidir en cada paso cu al es la alternativa/derivaci on adecuada a aplicar, s olo hay una posible. No se produce retroceso y el coste el lineal. M etodos no-deterministas: en cada paso de la construcci on del arbol se deben probar diferentes alternativas/derivaciones para ver cual es la adecuada, con el correspondiente aumento del coste. Importancia de los m etodos direccionales y deterministas en el dise no de traductores. El determinismo por la necesidad de eciencia (coste lineal frente a exponencial que le har a prohibitivo en el dise no pr actico de traductores) y porque las herramientas para la generaci on de traductores asumen esta condici on. Los
84
no direccionales no deterministas
Unger
Predice/Concuerda 1 en anchura 1 en profundida
direccionales
deterministas
m etodos direccionales por la propia naturaleza secuencial en que se va procesando los s mbolos del chero fuente de izquierda a derecha.
3.7. EJERCICIOS
85
3.7.
Ejercicios
1. (0.2 ptos) Dadas la siguiente gram atica, elimina los s mbolos muertos e inaccesibles.
SaABC|Dd AaBC Bb Cc Dd Egh
amatica, escribe la derivaci on 2. (0.2 ptos) Dada la siguiente gr m as a la izquierda, el arbol de an alisis sint actico y el arbol sint actico abstracto para las siguientes expresiones: (a) 3+4*56; (b) 3*(4-5+6)
exp exp addop term | term addop + | term term mulop factor | factor mulop *| / factor ( exp ) | num
3. (0.2 ptos) Dada la siguiente gr amatica simplicada de una expresi on en LISP: (a) escribe las derivaciones m as a la derecha y m as a la izquierda de la entrada (a 23 (m x y )). Dibuja el arbol de an alisis sint actico para esa sentencia.
lexp atom | list atom number | identier list ( lexp-seq ) lexp-seq lexp-seq lexp | lexp
atica, construya el arbol de 4. (0.2 ptos) Dada la siguiente gram an alisis sint actico para la frase not (true or false). Es una gram atica ambigua?
86
AL ANALISIS TEMA 3. INTRODUCCION SINTACTICO bexp bexp or bterm | bterm bterm bterm and bfactor | bfactor bfactor not bfactor | ( bexp ) | true | false
atica para expresiones booleanas 5. (0.2 ptos) Escribe una gram que incluya las constantes true y false, los operadores and, or y not y los par entesis. Se ha de tener en cuenta que el operador or tiene menor precedencia que el operador and y este menor que el operador not. Construye la gram atica de forma que los operadores and y or sean asociativos por la izquierda y el operador not por la derecha. 6. (0.2 ptos) Comprueba que se puede resolver el problema de la ambig uedad del dangling else transformando la gram atica a la forma:
statment matched-stmt | unmatched-stmt matched-stmt if ( exp ) matched-stmt else matched-stmt | other unmatched-stmt if ( exp ) statement | if ( exp ) matched-stmt else unmatched-stmt exp 0 | 1
Justicar usando un ejemplo. 7. (0.2 ptos) Comprueba que el intento de resolver el problema de la ambig uedad del dangling else no es adecuado:
statment if ( exp ) statement | matched-stmt matched-stmt if ( exp ) matched-stmt else statment | other exp 0 | 1