Está en la página 1de 16

Tema 3 Introducci on al an alisis sint actico

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

AL ANALISIS TEMA 3. INTRODUCCION SINTACTICO

3.1.

El proceso de an alisis sint actico

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

obtn siguiente componente lxico

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

SINTACTICA 73 3.2. ESPECIFICACION DE LOS LENGUAJES DE PROGRAMACION

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.

Especicaci on sint actica de los lenguajes de programaci on

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

AL ANALISIS TEMA 3. INTRODUCCION SINTACTICO

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, ...)

SINTACTICA 75 3.2. ESPECIFICACION DE LOS LENGUAJES DE PROGRAMACION

Ejemplo de una gram atica para un sencillo lenguaje:


Program Declarations module id ; Declarations begin StatementList end id . type id = TypeDenoter ; TypeList Declarations | var id IdList : TypeDenoter ; VarList Declarations | function id ( Parameter ParameterList ) : SimpleType ; Declarations begin StatementList end id ; Declarations | id = TypeDenoter ; TypeList | id IdList : TypeDenoter ; VarList | , id IdList | TypeDenoter id | , Parameter ParameterList | char | integer | real | boolean SimpleType | id | CompositeType array [ num integer .. num integer ] of SimpleType | record id IdList : SimpleType ; FieldList end id IdList : SimpleType ; FieldList | Statement ; StatementList | AssignStm | IfStm | WhileStm | FunctionStm | ReturnStm | WriteStm | ReadStm LeftValue = Expression id | id [ Expression ] | id . id if Expression then StatementList ElseStm end else StatementList | while Expression do StatementList end id ( Arg ArgList ) return Expression write Expression read LeftValue Num | - Num | id | - id | num integer | num real , Arg ArgList | LeftValue | ( Expression ) | true | false | Num | FunctionStm | Expression * Expression | Expression / Expression | Expression - Expression | Expression + Expression | - Expression | Expression or Expression | Expression and Expression | not Expression | Expression < Expression | Expression > Expression | Expression == Expression

TypeList VarList IdList Parameter ParameterList SimpleType TypeDenoter CompositeType FieldList StatementList Statement AssignStm LeftValue IfStm ElseStm WhileStm FunctionStm ReturnStm WriteStm ReadStm Arg Num ArgList Expression

Cuadro 3.1: Ejemplo de especicaci on sint actica

76

AL ANALISIS TEMA 3. INTRODUCCION SINTACTICO

3.3.

Derivaciones. Arboles de anal. sint actico

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.

3.3. DERIVACIONES. ARBOLES DE ANAL. SINTACTICO

77

3.3.1.

Arboles de an alisis sint actico

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 rbol de anlisis sintctico Entrada: (id +id )* id E E ( E id E + E id * ) E id

rbol abstracto de anlisis sintctico

* + id id id

78

AL ANALISIS TEMA 3. INTRODUCCION SINTACTICO

3.4.

Gram aticas limpias y bien formadas

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.

3.4. GRAMATICAS LIMPIAS Y BIEN FORMADAS

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

AL ANALISIS TEMA 3. INTRODUCCION SINTACTICO

3.5.

Gram aticas ambiguas

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

Entrada: num + num * num E E E num + * E num E num E

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.

3.5. GRAMATICAS AMBIGUAS

81

Ejemplo 1: gram atica ambigua


E num | E + E | E - E | E * E | E / E

Si la transformamos, esta gram atica ya no es ambigua.


exp exp + term | exp - term | term term term * factor | term / factor | factor factor ( exp ) | num

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

AL ANALISIS TEMA 3. INTRODUCCION SINTACTICO

3.6.

Clasicaci on m etodos de an alisis sint actico

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?

METODOS 3.6. CLASIFICACION DE ANALISIS SINTACTICO

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

AL ANALISIS TEMA 3. INTRODUCCION SINTACTICO


descendentes ascendentes CYK
Desplaza/Reduce 1 en anchura 1 en profundida

no direccionales no deterministas

Unger
Predice/Concuerda 1 en anchura 1 en profundida

direccionales

deterministas

Predice/Concuerda Gram. LL(1)

Desplaza/Reduce Gram. LR(k) LR(0), SLR(1), LALR(1)

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

Justicar usando un ejemplo.

También podría gustarte