Documente Academic
Documente Profesional
Documente Cultură
ANLISIS SINTCTICO
El anlisis sintctico es la fase del compilador que
se encarga de chequear el cdigo fuente en base a
una gramtica dada. Y en caso de que el programa
de entrada sea vlido, suministra el rbol sintctico
que lo reconoce. El rbol sintctico contiene la
secuencia de tokens reconocidos, suministrada por
el analizador lxico.
El anlisis sintctico para lenguajes se basa en
gramticas formales, ya que de otra forma se hace
muy difcil la comprensin del compilador, y se
pueden corregir, quizs ms fcilmente, errores de
muy difcil localizacin, como es la ambigedad en
el reconocimiento de ciertas sentencias.
Se puede describir la sintaxis de las construcciones
de los lenguajes de programacin por medio de
gramticas de contexto libre o notacin BNF
(Backus-Naur Form).
En el modelo de compilador, el analizador
sintctico obtiene una cadena de tokens del
analizador lxico, como se muestra en la Figura
6.1, y verifica que la cadena de nombres de los
tokens pueda generarse mediante la gramtica
para el lenguaje fuente.
Program Analizad
a fuente or lxico
toke
n
Analizad
or
Obtener sintctic
siguient
o
e token
Tabla de
smbolos
rbol de Rest
anlisis
o
sintctic etap
o
a
inicia
l
Representaci
n
intermedia
6. Anlisis Sintctico
T={a,b}, N={S}
con composiciones
SaSb, Sab
y smbolo inicial S, es libre del contexto.
4. Si A 1, A 2, , A k, puede escribirse
A 1| 2 | | k.
5. A menos que se diga otra cosa, el lado izquierdo
de la primera produccin es el smbolo inicial.
6. Anlisis Sintctico
12...n
derivacin de n. Por convencin, cualquier
elemento de (NT)* es derivable de s mismo.
El lenguaje generado por G consiste en todos los
arreglos definidos sobre T que se derivan de S, y se
denota L(G).
Para la gramtica del Ejemplo 6.1, las nicas
derivaciones de S son
SaSb
an-1Sbn-1
an-1abbn-1= anbn
As que, L(G) es un lenguaje libre del contexto que
consiste en los arreglos definidos sobre {a,b} de la
forma
anbn, n=1,2,...
Mediante la aplicacin repetida de las producciones
de la gramtica del Ejemplo 6.3 pueden obtenerse
expresiones ms y ms complicadas. Por ejemplo
exp expr * expr
(expr) * expr
(expr) * id
(expr + expr) * id expr
(expr + id) * id
(id + id) *expr
id
expr
*
Los rboles de derivacin o de anlisis
expr
) una estructura
id
gramatical( superponen
sobre las
palabras de un lenguaje, que es de utilidad en las
aplicaciones tales como la compilacin de los
+
expr
expr
Lenguajes y Autmatas I
id
id
6. Anlisis Sintctico
6. Anlisis Sintctico
A i
1 i s,
A i B
B i
1 i r.
B i B
A2 A3A1|b
A3 A2A3A2|a
Como el lado derecho de la produccin A 3 A2A3A2
comienza con una variable de nmero menor, se
sustituye la primera ocurrencia de A 2 con A3A1 y b.
Por tanto A3 A2A3A2 se sustituye con A3
A3A1A3A2 y A3A2. El nuevo conjunto es
A1 A2A3
A2 A3A1|b
A3 A3A1A3A2|bA3A2|a
Se transforman ahora las producciones
A3 A3A1A3A2|bA3A2|a.
Se introduce el smbolo B3 y la produccin A3
A3A1A3A2 se sustituye por A3 bA3A2B3, A3 aB3, B3
A1A3A2 y B3 A1A3A2B3. El conjunto resultante es
A1 A2A3
A2 A3A1|b
A3 bA3A2B3|aB3|bA3A2|a
B3 A1A3A2|A1A3A2B3
Segundo paso: Ahora todas las producciones con
A3 en la izquierda tienen lado derecho que
comienzan con terminales. Estas se utilizan para
sustituir a A3 en la produccin A2 A3A1 y entonces
las producciones con A2 en el lado izquierdo se
utilizan para sustituir a A2 en la produccin A1
A2A3. El resultado es el siguiente.
A3 bA3A2B3
A3 bA3A2
A3 aB3
A3 a
A2 bA3A2B3A1
A2 bA3A2A1
A2 aB3A1
A2 aA1
A2 b
5
6. Anlisis Sintctico
A1
A1
A1
B3
bA3A2B3A1A3
aB3A1A3
bA3
A1A3A2
A1 bA3A2A1A3
A1 aA1A3
B3 A1A3A2B3
B3 bA3A3A2B3
B3 bA3A2A1A3A3A2B3
B3 aA1A3A3A2B3
B3 bA3A3A2
B3 bA3A2A1A3A3A2
B3 aA1A3A3A2
6. Anlisis Sintctico
E
:
E
:
T
:
T
:
1
0
F
:
3
T
+
2
5
1
+4
F
*
(
4
1
1
1
2
1
T5
9
1
3
1
6
1 T
7+
5
3
4
i
d
:
Figura 6.36Diagramas de sintaxis.
6
Ejemplo 6.6. Sea la gramtica:
E TE
T
+
E +TE|
T
T
+
T FT
0
3
4
E
6
0
3
T *FT|
:
F (E) | id
6
* gramtica se
Los diagramas de sintaxis para esta
1
5
1
6
1
7
i
d
Figura 6.4 Diagramas de sintaxis
6.5 Ambigedad.
Si en cada paso de una derivacin se aplica una
produccin a la variable que se encuentra ms a la
izquierda, entonces la derivacin es de extrema
izquierda. De manera similar, se dice que una
derivacin, en la que la variable que est ms a la
derecha se sustituye en cada paso, es de extrema
derecha. Si w est en L(G) para la CFG G, entonces
w tiene al menos un rbol de anlisis gramatical, y
correspondiendo a un rbol de anlisis gramatical
7
6. Anlisis Sintctico
S
a
A
b
Figura
6.5.
rbol
de
derivacin.
Una gramtica libre de contexto G de la que alguna
palabra tenga dos rboles de anlisis gramatical se
dice que es gramtica ambigua. Es decir, una
gramtica es ambigua si alguna palabra tiene ms
de una derivacin extrema izquierda o ms de una
derivacin extrema derecha.
Lenguajes y Autmatas I
pro E1
p
if
exp
r
if
the
n
E1
pro
p
if
exp
r
the
n
pro
p
exp the
r
n
els pro
eE2
p
S3
S2
Figura
para la
E16.6 rbol de anlisis sintctico
proposicin condicional
if
exp
the
pro
r
n
p
E2
S1
6. Anlisis Sintctico
E
E
E
E
*
E
E +
i
d
i
i
i
9
i
d
d
d
d
Figura 6.8 Dos rboles de anlisis sintctico para
id+id*id
6. Anlisis Sintctico
La gramtica no ambigua
EE+T|T
TT*F|F
F ( E ) | id
Genera el mismo lenguaje, pero da a + una menor
precedencia que a *, y convierte a ambos
operadores en asociativos por la izquierda.
Lenguajes y Autmatas I
6. Anlisis Sintctico
Lenguajes y Autmatas I
6. Anlisis Sintctico
T *FT|
F (E) | id
En la Figura 6.10 se muestra una tabla de anlisis
sintctico predictivo para esta gramtica. Los
espacios en blanco son entradas de error; los otros
espacios indican una produccin con la cual
expandir el no terminal de la cima en la pila.
NO
TERMI
N
E
id
ET
E
E
T
ET
E
ET
E
TFT
T
F
SMBOLO DE ENTRADA
+
*
(
)
TFT
T*F
T
Fid
F(E
)
Figura 6.10 Tabla de anlisis sintctico M.
6. Anlisis Sintctico
6. Anlisis Sintctico
sacar de pila;
meter Yk Yk-1, , Y1 en la pila, con Y 1 en la
cima;
}
establecer X con el smbolo de la cima de la pila;
}
Con la entrada id + id * id el analizador sintctico
predictivo realiza la secuencia de movimientos de
la Figura 6.12. Estos movimientos corresponden a
una derivacin por la izquierda. El apuntador de
entrada apunta al smbolo de la extrema izquierda
de la cadena en la columna ENTRADA. Si se
observa con atencin las acciones de este
analizador sintctico, se nota que est buscando
una derivacin por la izquierda para la entrada, es
decir, las producciones emitidas son las de una
derivacin por la izquierda. Los smbolos de
entrada que ya se han examinado, seguidos de los
smbolos gramaticales de la pila (de la cima al
fondo), son las formas de frase izquierdas de la
derivacin.
PILA
$E
$ET
$ETF
$ETid
$ET
$E
$ET+
$ET
$ETF
$ETid
Lenguajes y Autmatas I
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$
SALIDA
$ET
* id$
$ETF*
* id$ T *FT
$ETF
id$
$ETid
id$ F id
$ET
$
$E
$ T
$
$ E
Figura 6.12 Movimientos del analizador sintctico
predictivo para id + id * id
E TE
T FT
F id
T
E + TE
T FT
F id
14
6. Anlisis Sintctico
6. Anlisis Sintctico
Lenguajes y Autmatas I
Producciones de errores.
Al anticipar los errores comunes que pueden
encontrarse, puede que aumente la gramtica para
el lenguaje, con producciones que generen las
construcciones errneas. Un analizador sintctico
construido a partir de una gramtica aumentada
por estas producciones de errores detecta los
errores anticipados cuando se utiliza una
produccin de error durante el anlisis sintctico.
As, el analizador sintctico puede generar
diagnsticos de error apropiados sobre la
construccin errnea que se haya reconocido en la
entrada.
Correccin global.
Lo ideal sera que un compilador hiciera la menor
cantidad de cambios en el procesamiento de una
cadena de entrada incorrecta. Hay algoritmos para
elegir una secuencia mnima de cambios, para
obtener una correccin con el menor costo a nivel
global. Dada una cadena de entrada incorrecta x y
una gramtica G, estos algoritmos buscarn un
rbol de anlisis sintctico para una cadena y
relacionada, de tal forma que el nmero de
inserciones, eliminaciones y modificaciones de los
tokens requeridos para transformar a x en y sea lo
ms pequeo posible. Por desgracia, estos mtodos
son en general demasiado costosos para
implementarlos en trminos de tiempo y espacio,
por lo cual estas tcnicas slo son de inters
terico actualmente.
Hay que observar que un programa casi correcto
tal vez no sea lo que el programador tena en
mente. Sin embargo, la nocin de la correccin con
16
6. Anlisis Sintctico
Compilador de
Yacc
y.tab.c
y.tab.c
Compilador de C
a.out
entrada
a.out
salida
6. Anlisis Sintctico
%token DIGITO
%%
linea
: expr \n
{ printf(%d\n, $1);
}
;
expr : expr + term
{ $$ = $1 + $3; }
| term
;
term
: term * factor { $$ = $1 * $3; }
| factor
;
factor : ( expr )
{ $$ = $2; }
| DIGITO
;
%%
yylex() {
int c;
c = getchar();
if (isdigit(c)) {
yyval = c 0;
return DIGITO;
}
return c;
}
Figura 6.14 Especificacin Yacc de una calculadora
de escritorio simple.
Resumen
Analizadores sintcticos. Un analizador sintctico
recibe como entrada tokens del analizador lxico, y
trata los nombres de los tokens como smbolos
terminales de una gramtica libre de contexto.
Despus, el analizador construye un rbol de
anlisis sintctico para su secuencia de tokens de
Lenguajes y Autmatas I
6. Anlisis Sintctico
Ejercicios
Apndice. Construcciones de
independientes del contexto.
lenguajes
no
6. Anlisis Sintctico
6. Anlisis Sintctico
Lenguajes y Autmatas I
21