Documente Academic
Documente Profesional
Documente Cultură
1
UNIDAD IV
Analisis Sintactico
4.1 Introduccion
Sintaxis significa estructura del orden de las palabras en una frase. La tarea del analisis sintactico es revisar si
los smbolos aparecen en el orden correcto ( es decir, revisar si el programa fuente fue disenado de acuerdo
con la sintaxis del lenguaje de programacin ) y combinar los smbolos del codigo fuente para formar unidades
gramaticales. En general las unidades gramaticales se representan en forma de arboles sintacticos.
El analisis sintactico es la fase que se encarga de verificar la secuencia de tokens que representa al texto de
entrada, en base a una gramtica dada. En caso de que el programa de entrada sea valido, suministra el rbol
sintctico que lo reconoce en base a una representacin computacional. Ese rbol es el punto de partida de la
fase posterior de la etapa de anlisis: el analizador semantico.
Pero esto es la teora; en la prctica, el analizador sintctico dirige el proceso de compilacin, de manera que el
resto de fases evolucionan a medida que el sintctico va reconociendo la secuencia de entrada por lo que, a
menudo, el rbol ni siquiera se genera realmente.
En la prctica, el analizador sintctico tambin:
Incorpora acciones semnticas en las que colocar el resto de fases del compilador (excepto el
analizador lxico): desde el anlisis semntico hasta la generacin de cdigo.
Informa de la naturaleza de los errores sintcticos que encuentra e intenta recuperarse de ellos para
continuar la compilacin.
Controla el flujo de tokens reconocidos por parte del analizador lxico.
4.2 Introduccion a las gramaticas libres de contexto y arboles de derivacion
Existen aspectos dentro de los lenguajes que no se pueden describir mediante gramticas regulares y
expresiones regulares, como son los aspectos de bloque BEGIN-END, las expresiones aritmticas (anidadas) y
las estructuras IF-THEN-ELSE, DO WHILE ETC. Para poder describir dichas estructuras se hace uso de las
gramticas libres de contexto o gramticas Tipo 2.
Las gramticas tipo 2 son un conjunto de variables llamadas no terminales o variables sintcticas.
A las reglas que relacionan los simbolos terminales a estas variables sintacticas se les llaman producciones.
Formalmente, una gramatica Tipo 2 o gramtica libre de contexto las producciones son de tipo
donde:
| | <= | |
Pag. 2
adems
Vn y | |=1
El lenguaje producido es un lenguaje libre de contexto.
Ejemplo:
G = <Vn, Vt, P, S>
Vn = { E }
Vt = { +, *, ( , ) , id }
P = { EE+E
EE*E
E(E)
E id
}
S = E
4.3 Tipos de Parser
Parser Descendente
Recursivo con retroceso ( backtrack )
- Recursivo
Predictivo
- No Recursivo
Parser Ascendente - L R
Desplazamiento -
Reduccion
- Por precedencia de operadores
1.6.1 Parser Descendente ( Top Down )
La construccin del arbol de anlisis sintctico para la entrada se comienza desde la raiz y se crean los
nodos del arbol hasta llegar a las hojas.
La construccion descendente de un arbol de anlisis sintctico se hace siempre empezando por la raiz
etiquetada con el smbolo inicial.
Pag. 3
1.6.2 Parser Ascendente ( Bottom - Up )
Construye el arbol sintactico para una cadena de entrada empezando por las hojas y avanzando hacia la
raiz.
Se puede considerar este proceso como de reducir una cadena W al smbolo inicial de la gramatica.
4.4 Parser de Descenso Recursivo con Retroceso
4.5 Parser Predictivo Recursivo
Este mtodo de anlisis descendente utiliza el smbolo de preanalisis para determinar sin ambigedad la
produccin correcta para cada smbolo No-Terminal.
Consta de un conjunto de procedimiento o rutinas recursivas para procesar la entrada.
A cada No-Terminal de la gramtica se le asocia un procedimiento.
La secuencia de llamadas a procedimientos define implcitamente un rbol de anlisis sintactico de la entrada.
La implementacin del procedimiento de una produccin se realiza como la siguiente:
1) Cada terminal del lado derecho se empareja con el smbolo de preanalisis
2) Cada no terminal de la derecha proporciona una llamada a su procedimento.
3) El procedimiento emparejar recibe un argumento t el cual si concuerda con el smbolo de preanalisis entonces
avanza hacia el siguiente componente lexico de entrada.
Ejemplo: Disear el algoritmo de parser predictivo recursivo de la gramatica cuya producciones son:
tipo-> simple | id | array [ simple ] of tipo
simple -> integer | char | num puntopunto num
calculamos :
PRIMEROS ( tipo ) = { PRIMEROS ( simple ), , array}
PRIMEROS ( simple ) = { integer, char, num }
Procedure tipo
begin
If preanalisis IN { integer, char, num } then
simple
Else
If preanalisis = then
begin
end
Else
emparejar ( );
emparejar ( id );
If preanalisis = array then
begin
emparejar ( array );
emparejar ( [ );
simple;
emparejar ( ] );
Pag. 4
end;
Procedure simple
begin
end
Else
emparejar ( of );
tipo;
error ;
If preanalisis = integer then
emparejar ( interger )
Else
If preanalisis = char then
emparejar ( char )
Else
If preanalisis = num then
begin
end;
end
Else
emparejar ( num );
emparejar ( puntopunto );
emparejar ( num );
error;
Procedure emparejar ( t : complex )
begin
If preanalisis = t then
Preanalisis := sigcomplex
end;
Else
error ;
4.6 Parser Predictivo No Recursivo
Pag. 5
a + b $
Programa para anlisis
Sintctico
predictivo
Pila
Buffer de entrada
X
Y
Z
$
Salida
Tabla de
anlisis
Fig. Modelo de un parser predictivo no recursivo
La tabla M es de la forma M[X, a] donde X= No Terminal, a= terminal
X = Smbolo en la cima de la pila
a = Smbolo en curso de la entrada (preanalisis)
Tres casos;
1. Si X = a = $; Fin, xito del analisis.
2. Si X = a != $; Sacar X de la pila y mover el apuntador de la entrada al siguiente smbolo.
3. Si X es no terminal consultar M[X, a]:
Si M [X,a] = {XUVM} entonces sustituir X de la pila por MVU (U hasta arriba de la pila).
Si M [X,a] = error el parser invoca al manejador de errores.
Inicialmente se tiene $S en la pila, con S ( smbolo inicial ) en el tope de la pila. Ademas una cadena a
analizar w a la que se le anexa $ al final.
Pag. 6
Algoritmo Parser Predictivo No Recursivo
Apuntar ae al primer smbolo de w$; ( ae = apuntador de entrada )
Repeat
Sea X el smbolo en el tope de la pila y a el smbolo apuntado por ae ;
Si X es terminal o $ entonces
Si X = a entonces
Saca X de la pila y avanzar ae
Sino
Error ()
Sino /* X es un no terminal */
Si M [ X, a ] = X y
1
y
2
.y
k
entonces
Extraer X de la pila
Meter y
k,
y
k-1,
y
k-2, .
y
1
en la pila con y
1
en la
cima. Emitir la produccin X y
1
,y
2
.y
k
Sino
Error ()
Hasta X = $ /*pila vaca*/
Ejemplo: considere la siguiente tabla gramatical M para analizar la entrada id + id * id
No terminal Smbolo de entrada
Id + * ( ) $
E E TE
E TE
E
E +TE
E vacio Evacio
T T FT
T FT
T
T vacio T *FT
Tvacio Tvacio
F F id
F (E)
PILA
$E
$ET
$ETF
$ETid
$ET
$E
$ET+
$ET
$ETF
$ETid
$ET
$ETF*
$ETF
$ETid
$ET
$E
$
ENTRADA
id + id * id $
id + id * id $
id + id * id $
id + id * id $
+ id * id $
+ id * id $
+ id * id $
id * id $
id * id $
id * id $
* id $
* id $
id $
id $
$
$
$
SALIDA
ETE
TFT
F id
T
E+TE
TFT
Fid
T*FT
Fid
T
E
Ejercicio: Con la misma tabla M anterior analizar sintacticamente la entrada id * ( id + id )
Pag. 7
4.7 Parser Corrimiento - Reduccion
Se pueden considerar este proceso como de reducir una cadena W al smbolo inicial de la gramtica.
En cada paso de reduccin se sustituye una subcadena determinada para que concuerde con el lado derecho
de la produccin por el smbolo del lado izquierdo de dicha produccin. Y si en cada paso se elige
correctamente la subcadena, se traza una derivacin por la derecha en sentido inverso.
Ejemplo: considere la gramatica
SaABe
AAbc
Ab
Bd
La frase abbcde se puede reducir a S.
Se examina abbcde buscando una subcadena que concuerde con el lado derecho de una produccin:
Elegimos la b que se sita mas a la izquierda y se sustituye en este caso por A del lado izquierdo de la
produccin Ab y se obtiene la cadena aAbcde y asi sucesivamente.
El rbol sintctico ascendente quedara:
b
a
b
d
e
A
c
A
B
4.8 Parser L - R
Es un parse ascendente
L significa que analiza la entrada empezando por la izquierda
R significa que las derivaciones son por la derecha
Pag. 8
a
1
a
i
a
n
$
S
m
X
m
S
m-1
X
m-1
Entrada
Programa de anlisis
Sintctico L-R
Salida
accin
IR-A
Tabla de anlisis Sintctico
Algoritmo Parser L-R
Entrada: cadena W, tabla de anlisis sintctico para la gramtica G.
Salida: si W esta en L(G), un anlisis ascendente de W sino error.
Mtodo: Inicialmente s
0
esta en la pila y W $ en la entrada
Apuntar ae al primer smbolo de la entrada;
Repetir por simpre
Begin
Sea s el estado en la cima de la pila y a el smbolo apuntado por ae;
IF accion [ s, a ] = desplazar s THEN
Begin
End
Meter a y despues s en la cima de la pila;
Avanzar ae;
Else IF accion [ s, a ] = reducir A THEN
Begin
End
Sacar 2* | | simbolos de la pila;
Sea s el estado que esta ahora en la cima;
Meter A y despus ir_a [ s, A ] en la cima ;
Desplegar la produccin A ;
Else IF accion [ s, a ] = aceptar THEN
Return
End
Else
Error()
Pag. 9
ESTADO ACCION Ir-a
id + * ( ) $ E T F
0
1
2
3
4
5
6
7
8
9
10
11
D5
D5
D5
D5
D6
R2
R4
R6
D6
R1
R3
R5
D7
R4
R6
D7
R3
R5
D4
D4
D4
D4
R2
R4
R6
D11
R1
R3
R5
Acepta
R2
R4
R6
R1
R3
R5
1
8
2
2
9
3
3
3
10
Ejemplo: considere la siguiente gramtica para expresiones numricas con + y *
EE + T
ET
TT * F
TF
F( E )
Fid
TABLA DE ANALISIS SINTACTICO
Simbologa: Di = Desplazar y meter en la pila el estado i .
Rj = Reducir por la produccin j.
Celda en blanco significa error.
Analizar la entrada id * id + id
Buffer De entrada:
Id * Id + Id $
Salida:
Fid
TF
Fid
TT*F
ET
Fid
TF
EE+T
Pag. 10
El arbol sintactico equivalente es :
E
E
+
T
T
F
T
*
F id
F
id
id
4.9 Manejo de errores sintacticos
Libro: Compiladores. Conceptos fundamentales
Capitulo: 6
Tema: 6.4 Manejo de errores en el analisis sintactico, pag. 124 - 125