Facultad de Ingeniería de Sistemas
Facultad de Ingeniería de Sistemas
Lenguajes y Compiladores
Análisis Sintáctico
Parte I
Teoría Lenguajes 1Parte I
Introducción
Introducción
El analizador sintáctico recibe una secuencia de
tokens y decide si la secuencia está correcta o no.
Los analizadores más usados están basados en un
análisis que puede ser descendente o ascendente. Para realizar este análisis se deben construir los árboles sintácticos (derivación).
árboles sintácticos (derivación).
Dificultad: Búsqueda de la regla a aplicar, esto se
efectúa analizando la cadena de entrada de izquierda a derecha.
Los analizadores sintácticos más eficientes se basan
Introducción
Introducción
Los árboles sintácticos en la práctica son realmente
difíciles de construir porque ocuparían mucho espacio. Alternativamente se usan pilas.
En la Pila se guarda información sobre los nodos del
árbol sintáctico relevantes en cada fase del proceso.
Teoría Lenguajes
3
árbol sintáctico relevantes en cada fase del proceso.
Para el caso descendente: en la pila se guardan los
Análisis descendente
Análisis descendente
Se basa en gramáticas LL que evitan los bloqueos
mutuos.
Para evitar los bloqueos mutuos será necesario
cumplir con la siguiente regla:
Para producciones de la forma
A →→→→ αααα αααα αααα . . . αααα A →→→ αααα→ 1 αααα2 αααα3 . . . ααααn
Siempre se debe poder escoger la alternativa correcta para la generación del árbol sintáctico.
Intuitivamente, para escoger la alternativa correcta necesitamos que todos los símbolos iniciales de los αi sean diferentes (Conjunto First/Primero).
Análisis Descendente
Análisis Descendente
Para aplicar los métodos de análisis descendente las
gramáticas deben cumplir dos condiciones:
No deben tener recursividad por la izquierda
Se debe conocer el conjunto First de cada no terminal
y deben cumplir las siguientes condiciones:
Teoría Lenguajes
5
y deben cumplir las siguientes condiciones:
» El conjunto First para un no terminal debe tener un terminal diferente para cada alternativa.
» El conjunto First de dos no terminales deben tener una intersección igual a ΦΦΦΦ.
Análisis Descendente Predictivo
Análisis Descendente Predictivo
Una forma eficiente de un analizador sintáctico
descendente sin retroceso es el denominado Analizador sintáctico predictivo.
Preliminar:
Dado un símbolo de entrada
a
y el no terminal A conDado un símbolo de entrada
a
y el no terminal A conla siguiente producción:
A →→→ αααα→ 1 αααα2 αααα3 . . . ααααn
es necesario conocer la única alternativa que comienza con el símbolo a..
Análisis Descendente Predictivo
Análisis Descendente Predictivo
Ejemplo:
comando → if expresión then comando else comando
begin ListaComando end
repeat ListaComados until expresión
Cada alternativa tiene un inicio diferente que permite escoger la opción adecuada, es decir si tenemos el
Teoría Lenguajes
7
escoger la opción adecuada, es decir si tenemos el símbolo de entrada repeat debemos usar la tercera alternativa.
Existen los métodos:
Análisis descendente recursivo (análisis predictivo) Análisis predictivo no recursivo
Análisis descendente recursivo (ARD
)
Análisis descendente recursivo (ARD
)
Método descendente en el que se ejecuta un conjunto de
métodos recursivos para procesar la entrada.
A cada no terminal de la gramática se asocia un método. La secuencia de métodos llamados durante el
procesamiento de la entrada define implícitamente un procesamiento de la entrada define implícitamente un árbol de análisis sintáctico.
Adicionalmente se tiene:
» Un método de tratamiento de error
» Un método de lectura de un símbolo de entrada (léxico)
Análisis
descendente recursivo (ADR)
Análisis
descendente recursivo (ADR)
Para una gramática:
G = (T, N, P, S)
N = {S, N1, N2, N3}
En la siguiente diapositiva se muestra el esquema de
un analizador sintáctico descendente recursivo.
Teoría Lenguajes
9
un analizador sintáctico descendente recursivo.
En este esquema los métodos se muestran sin
parámetros pero considerando que en su mayoría son recursivos, normalmente requieren parámetros.
Esquema para ADR
Esquema para ADR
Programa Analizador sintácticoMétodo Error Método Léxico Método S Método N1 Método N2 Método N2 Método N3 Inicio Léxico S Fin
Tareas de un ADR
Tareas de un ADR
Cada método de un analizador descendente recursivo realiza dos
tareas:
Decide la producción a usar analizando el símbolo de
entrada. Si el símbolo de entrada pertenece a First(N) entonces se usa la producción con lado derecho N.
Si hay un conflicto entre dos lados derechos entonces en esta gramática no se puede usar
Teoría Lenguajes
11
entonces en esta gramática no se puede usar el método descendente recursivo.
Usa una producción imitando el lado derecho:
»Un no terminal resulta en la llamada al método asociado
»Un terminal coincidente al símbolo de entrada hace que se lea el siguiente componente léxico.
Ejemplo de ADR
Ejemplo de ADR
Ejemplo de un analizador descendente recursivo.
Dada la siguiente gramática:
tipo → simple
↑↑↑↑ id
array [ simple ] of tipo array [ simple ] of tipo
simple → integer
char
num punto num
Ejemplo de ADR
Ejemplo de ADR
Metodo Empareja(t) si Entrada = t
entonces Lexico (Entrada) sino Error fmetodo Teoría Lenguajes 13 fmetodo Método Error
Escribir (‘Error de sintáxis’) fmetodo
Ejemplo de ADR
Ejemplo de ADR
Método Tipocaso Entrada vale
‘integer’, ‘char’, ‘num’: simple
‘↑↑↑↑’: Empareja(‘↑↑↑↑’) Empareja(‘ id’)
‘array’: Empareja(‘array’) Empareja(‘[‘) ‘array’: Empareja(‘array’) Empareja(‘[‘)
simple
Empareja(‘]’) Empareja(‘of’)
tipo
otro: Error fmetodo
Ejemplo de ADR
Ejemplo de ADR
Método Simplecaso Entrada vale
‘integer’: Empareja( ‘integer’) ‘char’: Empareja(‘char’) ‘num’: Empareja(‘num’) Teoría Lenguajes 15 ‘num’: Empareja(‘num’) Empareja(‘punto‘) Empareja(‘num’) otro: Error fmetodo
Especificación de un ADR
Especificación de un ADR
Para especificar un ADR se deben tener en cuenta
algunas reglas.
Para tipo de producción se deberá crear un método
con una estructura diferente.
Es necesario verificar si la producción tiene:
Es necesario verificar si la producción tiene:
Varias alternativas Repetición
Opcionalidad
A seguir se presentan las estructuras de los métodos
Especificación de un ADR
Especificación de un ADR
Para producciones del tipo: A →→→→ αααα1 αααα2 αααα3 . . . ααααn
si Entrada en Primero(αααα1) entonces Métodoαααα1
sino si Entrada en Primero(αααα2) entonces Métodoαααα2 ....
sino si Entrada en Primero(ααααn) entonces Métodoααααn
Teoría Lenguajes
17 sino si Entrada en Primero(ααααn) entonces Métodoααααn
sino Error fsi
... fsi fsi
Especificación de un ADR
Especificación de un ADR
Para Producciones: A → α1 α2 α3 . . . αn Métodoαααα1 Métodoαααα2 Métodoαααα2 Métodoαααα3 ... MétodoααααnEspecificación de un ADR
Especificación de un ADR
Para Producciones: A → α1 A ε
mientras Entrada en Primero(αααα1)
hacer Métodoαααα1 Teoría Lenguajes 19 Métodoαααα1 fmientras Para Producciones: A → α1 Métodoαααα1
Especificación de un ADR
Especificación de un ADR
Para Producciones: A → α1 ε si Entrada en Primero(αααα1) entonces Métodoαααα1 fsi Para Producciones: A → t t ∈ T*Si Entrada = ‘t’ entonces Léxico sino Error
Uso de Diagramas de transición
Uso de Diagramas de transición
Se puede realizar un analizador sintáctico predictivo
usando diagramas de transiciones.
El comportamiento para estos diagramas de
transiciones es similar al diagrama usado en el léxico, cuando el símbolo usado para la transición es un
Teoría Lenguajes
21
cuando el símbolo usado para la transición es un símbolo terminal.
Tienen un comportamiento especial cuando la
Ejemplo de Diagrama de transición
Ejemplo de Diagrama de transición
Ejemplo:
tipo → simple ↑↑↑↑ id array [ simple] of tipo
simple 1 0 2 id 4 5 6 7 8 array [ simple ] of tipo 3 9
Diagrama de transición
Diagrama de transición
Características de un diagrama de transición para
analizadores sintácticos:
Existe un diagrama para cada no terminal
Las transiciones están determinadas por un token y no
por un símbolo del alfabeto
Teoría Lenguajes
23
por un símbolo del alfabeto
La transición usando un token cambia el estado del
autómata
La transición usando un no terminal A es una llamada
Creación de Diagramas de transición
Creación de Diagramas de transición
Eliminar la recursión por la izquierda
Para cada no terminal A:
Se crea un estado inicial y un estado final
Para cada producción A → X1 X2 X3 .... Xn se crea un
camino del estado inicial al estado final con las aristas camino del estado inicial al estado final con las aristas etiquetadas con X1, X2 , X3 , .... , Xn 0 1 3 4 n-1 X1 X2 X2 Xn n
...
Funcionamiento del Diagrama de transiciones
Funcionamiento del Diagrama de transiciones
Si e es terminal, entonces se cambia al estado t y se
En el diagrama t e s Teoría Lenguajes 25
Si e es terminal, entonces se cambia al estado t y se
continua con el siguiente símbolo de la entrada
Si e es un no terminal, el analizador se traslada al
estado inicial del diagrama asociado al no terminal e y no mueve la entrada. Cuando llega al estado final de e regresa al estado t.
Ejemplo de Diagrama de transiciones
Ejemplo de Diagrama de transiciones
Para la gramática E → T E’ E’ → + TE’ε T → FT’ T’ → *FT’ ε T’ → *FT’ ε F → ( E ) id
Ejemplo de Diagrama de transiciones
Ejemplo de Diagrama de transiciones
0 1 T E' 2
E
3 4 + T E' 5 6 Teoría Lenguajes 27 + T E' ε 7 8 F T' 9T
Ejemplo de Diagrama de transiciones
Ejemplo de Diagrama de transiciones
10 11 * F
T'
12 13 T' ε 14 15 ( EF
16 17 ) idAnálisis Predictivo no recursivo (APNR)
Análisis Predictivo no recursivo (APNR)
Es posible construir un analizador sintáctico
predictivo no recursivo (APNR) manteniendo una pila para no usar la recursividad.
Estos analizadores buscan la producción a usar
dentro de una tabla de análisis sintáctico.
Teoría Lenguajes
29
dentro de una tabla de análisis sintáctico.
También se conocen como analizadores sintácticos
dirigidos por tablas.
Un método descendente dirigido por tablas es el
Análisis Predictivo no recursivo (APNR
)
Análisis Predictivo no recursivo (APNR
)
a + b $
Salida
Entrada
Pila
Parser predictivo Tabla M para Parser $ Z Y XSalida
Pila
Análisis Predictivo no recursivo (APNR
)
Análisis Predictivo no recursivo (APNR
)
$ es usado:
Como último carácter de entrada Como Fondo de la pila
Inicialmente en la pila está el símbolo inicial sobre el
$
Teoría Lenguajes
31
$
M es una matriz cuyo valor indica la producción a
usar, es decir
M[A, a] = Producción a usar con A no terminal y a terminal
Acciones del APNR
Acciones del APNR
Dependiendo del elemento de la entrada (a) y el
elemento que se encuentre en el tope de la pila (X), el analizador realizará una acción diferente:
Si X = a = $
entonces Fin de análisis sintáctico entonces Fin de análisis sintáctico
Si X = a ≠ $
entonces desempilar X y pedir otro token
Si X ∈ N y M[X, a] = X → Y1 Y2 …Ym , Yi ∈ (N ∪ T)
entonces Desempila X Empila Ym … Y2 Y1
Ejemplo de un APNR
Ejemplo de un APNR
Repetir si X en T entonces si X = a entonces Desempilar Léxico sino Error Teoría Lenguajes 33 sino Error sino si M[X, a] = X →→→→ Y1 Y2 …Ym , Yi entonces Desempila XEmpila Ym... EmpilaY2 EmpilaY1
sino Error hasta (X = $) y (a = $)
Gramáticas LL(1)
Gramáticas LL(1)
Son gramáticas con condiciones especiales que
permiten realizar un análisis sintáctico descendente no recursivo conocido con el nombre de parser LL(1).
L se examina la cadena de entrada de izquierda a
derecha derecha
L usa la derivación mas a la izquierda 1 sólo necesita un símbolo de la entrada
Parser LL(1)
Parser LL(1)
Para la siguiente gramática:
1. E → T E’ 2. T → F T' 3. F → ( E ) 4. F → a Teoría Lenguajes 35 4. F → a 5. E' → + T E’ 6. E' → ε 7. T' → * F T’ 8. T' → ε
Parser LL(1)
Parser LL(1)
Se tiene la matriz M (los números representan el
número asociado a la producción)
( a + * ) $ E 1 1 E 1 1 T 2 2 F 3 4 E' 5 6 6 T' 8 7 8 8
Parser LL(1)
Parser LL(1)
Pila Entrada Regla usada
E a+a*a M[E,a] = 1
TE' a+a*a M[T,a] = 2
FT'E' a+a*a M[F,a] = 4
Para procesar
a + a * a
la pila sería
Teoría Lenguajes
37
FT'E' a+a*a M[F,a] = 4
aT'E' a+a*a
T'E' +a*a M[T',+] = 8
E' + a*a M[E',+] = 5
+TE' +a *a
Parser LL(1)
Parser LL(1)
FT'E' a*a M[F,a] = 4
aT'E' a*a
T'E' *a M[T',*] = 7
Pila Entrada Regla usada
T'E' *a M[T',*] = 7 *FT'E' *a FT'E' a M[F,a] = 4 aT'E' a T'E' ε M[T',$] = 8 E' ε M[E',$] = 6 ε ε
Parser LL(1)
Parser LL(1)
Para construir la matriz M es necesario realizar el
cálculo de los :
Conjuntos First Conjuntos Follow
Este tipo de matrices sólo es posible definirla, sin
Teoría Lenguajes
39
Este tipo de matrices sólo es posible definirla, sin