Sunteți pe pagina 1din 70

ANALISIS SINTACTICO

El anlisis gramatical es la tarea de determinar la


sintaxis, o estructura, de un programa. Por esta
razn tambin se le conoce como anlisis
sintctico. La sintaxis de un lenguaje de
programacin por lo regular se determina
mediante las reglas gramaticales de una
gramtica libre de contexto, de manera similar
como se determina mediante expresiones
regulares la estructura lxica de los tokens
reconocida por el analizador lxico.

ANALISIS SINTACTICO
En realidad, una gramtica libre de contexto utiliza
convenciones para nombrar y operaciones muy
similares a las correspondientes en las
expresiones regulares. Con la nica diferencia de
que las reglas de una gramtica libre de contexto
son recursivas. Por ejemplo, la estructura de una
sentencia if debe permitir en general que otras
sentencias if estn anidadas en ella, lo que no se
permite en las expresiones regulares.

ANALISIS SINTACTICO
Este cambio aparentemente elemental para el
poder de la representacin tiene enormes
consecuencias.
La
clase
de
estructuras
reconocible por las gramticas libres de contexto
se incrementa de manera importante en relacin
con las de las expresiones regulares. Los
algoritmos empleados para reconocer estas
estructuras tambin difieren mucho de los
algoritmos de anlisis lxico, ya que deben utilizar
llamadas recursivas o una pila de anlisis
sintctico explcitamente administrada.

ANALISIS SINTACTICO

Las estructuras de datos utilizadas para


representar la estructura sintctica de un
lenguaje ahora tambin deben ser
recursivas en lugar de lineales (como lo son
para lexemas y tokens). La estructura
bsica empleada es por lo regular alguna
clase de rbol, que se conoce como rbol
de anlisis gramatical o rbol sintctico.

ANALISIS SINTACTICO
EL PROCESO DEL ANLISIS SINTCTICO
La tarea del analizador sintctico es determinar la
estructura sintctica de un programa a partir de los tokens
producidos por el analizador lxico y, ya sea de manera
explcita o implcita, construir un rbol de anlisis
gramatical o rbol sintctico que represente esta
estructura. De este modo, se puede ver el analizador
sintctico como una funcin que toma como su entrada la
secuencia de tokens producidos por el analizador lxico y
que produce como su salida el rbol sintctico.
analizador sintctico

secuencia de tokens rbol sintctico

ANALISIS SINTACTICO

La estructura del rbol sintctico depende


en gran medida de la estructura sintctica
particular del lenguaje. Este rbol por lo
regular se define como una estructura de
datos dinmica, en la cual cada nodo se
compone de un registro cuyos campos
incluyen los atributos necesarios para el
resto del proceso de compilacin (es decir,
no slo por aquellos que calcula el
analizador sintctico).

ANALISIS SINTACTICO
Un problema ms difcil de resolver para el
analizador sintctico que para el analizador lxico
es el tratamiento de los errores. En el analizador
lxico, si hay un carcter que no puede ser parte
de un token legal, entonces es suficientemente
simple generar un token de error y consumir el
carcter problemtico. (En cierto sentido, al
generar un token de error, el analizador lxico
transfiere la dificultad hacia el analizador
sintctico.)

ANALISIS SINTACTICO

Por otra parte, el analizador sintctico no


slo debe mostrar un mensaje de error, sino
que debe recuperarse del error y continuar
el anlisis sintctico (para encontrar tantos
errores como sea posible). En ocasiones, un
analizador
sintctico
puede
efectuar
reparacin de errores, en la cual infiere
una posible versin de cdigo corregida a
partir de la versin incorrecta que se le haya
presentado.

ANALISIS SINTACTICO

Un aspecto particularmente importante de la


recuperacin de errores es la exhibicin de
mensajes de errores significativos y la
reanudacin del anlisis sintctico tan
prximo al error real como sea posible. Esto
no es fcil, puesto que el analizador
sintctico puede no descubrir un error sino
hasta mucho despus de que el error real
haya ocurrido.

ANALISIS SINTACTICO

GRAMTICAS LIBRES DE CONTEXTO


Una gramtica libre de contexto es una
especificacin para la estructura sintctica
de un lenguaje de programacin. Una
especificacin as es muy similar a la
especificacin de la estructura lxica de un
lenguaje utilizando expresiones regulares,
excepto que una gramtica libre de contexto
involucra reglas de recursividad.

ANALISIS SINTACTICO
Comparacin respecto a la notacin de una
expresin regular
Consideremos cmo se compara la gramtica libre de
contexto con las reglas de la expresin regular:
nmero = dgito dgito* dgito
digito=0|1|2|3|4|5|6I7|8I9

En las reglas de la expresin regular bsica


tenemos tres operaciones: seleccin (dada por el
metasmbolo de la barra vertical), concatenacin
(dada sin un metasmbolo) y repeticin (dada por
el metasmbolo del asterisco).

ANALISIS SINTACTICO
Tambin empleamos el signo de igualdad para
representar la definicin de un nombre para una
expresin regular, y escribimos el nombre en
itlicas para distinguirlo de una secuencia de
caracteres reales .
Las reglas gramaticales utilizan notaciones
semejantes. Los nombres se escriben en cursivas
o itlicas (pero ahora con una fuente diferente, de
modo que podamos distinguirlas de los nombres
para las expresiones regulares).

ANALISIS SINTACTICO

La barra vertical todava aparece como el


metasmbolo
para
seleccin.
La
concatenacin tambin se utiliza como
operacin estndar. Sin embargo, no hay
ningn metasmbolo para la repeticin
(como el * de las expresiones regulares),
Una diferencia adicional en la notacin es
que ahora utilizamos el smbolo de la flecha
en lugar del de igualdad para expresar
las definiciones de los nombres.

ANALISIS SINTACTICO

Esto se debe a que ahora los nombres no


pueden simplemente ser reemplazados por
sus definiciones, porque est implicado un
proceso de definicin ms complejo, como
resultado de la naturaleza recursiva de las
Advierta
tambin
que
las
reglas
gramaticales utilizan expresiones regulares
como componentes.

ANALISIS SINTACTICO

Como las expresiones regulares, las reglas


gramaticales estn definidas sobre un
alfabeto, o conjunto de smbolos. En el caso
de expresiones regulares, estos smbolos
por lo regular son caracteres. En el caso de
reglas gramaticales, los smbolos son
generalmente tokens que representan
cadenas de caracteres.

ANALISIS SINTACTICO
Por ejemplo, representaremos el alfabeto de
tokens para el lenguaje de programacin X como
el conjunto
{if, then, else, end, repeat, until, read, write,
dentificador, nmero,+,-/*//,=,<,(,),;,:=}
Dado un alfabeto, una regla gramatical libre de
contexto en BNF se compone de una cadena de
smbolos. El primer smbolo es un nombre para
una estructura. El segundo smbolo es el
metasmbolo "".

ANALISIS SINTACTICO
Este smbolo est seguido por una cadena de
smbolos, cada uno de los cuales es un smbolo
del alfabeto, un nombre para una estructura o el
metasmbolo "I".
En trminos informales, una regla gramatical en
BNF se interpreta como sigue. La regla define la
estructura cuyo nombre est a la izquierda de la
flecha. Se define la estructura de manera que
incluya una de las selecciones en el lado derecho
separada por las barras verticales.

ANALISIS SINTACTICO

Las secuencias de smbolos y nombres de


estructura dentro de cada seleccin definen
el diseo de la estructura. Por ejemplo,
considere las reglas gramaticales :
exp exp op exp | (exp) | nmero
Op + | - | *

ANALISIS SINTACTICO

La primera regla define una estructura de


expresin (con nombre exp) compuesta por
una expresin seguida por un operador y
otra expresin, por una expresin dentro de
parntesis, o bien por un nmero. La
segunda define un operador (con nombre
op) compuesto de uno de los smbolos +, o *.

ANALISIS SINTACTICO

Los metasmbolos y convenciones que


usamos aqu son semejantes a los de uso
generalizado, pero es necesario advertir
que no hay un estndar universal para estas
convenciones. En realidad, las alternativas
comunes para el metasmbolo de la flecha
"" incluyen "=" (el signo de igualdad), ":"
(el signo de dos puntos) y "::=" (signo de
dos puntos doble y el de igualdad).

ANALISIS SINTACTICO

En archivos de texto normales tambin


es necesario hallar un reemplazo para
el uso de las itlicas. Esto se hace
frecuentemente
encerrando
los
nombres de estructura con " < .. . > y
escribiendo los nombres de token en
itlicas con letras maysculas.

ANALISIS SINTACTICO

De este modo, con diferentes convenciones,


las reglas gramaticales anteriores podran
aparecer como
<exp> ::= <exp> <op> <exp> I (<exp>) I NMERO

<op> ::= + | - | *

ANALISIS SINTACTICO
En ocasiones, aunque los parntesis son tiles
para reasignar la precedencia en las expresiones
regulares, conviene incluir parntesis en los
metasmbolos de la notacin BNF.
Por ejemplo, se puede volver a escribir las reglas
gramaticales anteriores como una sola regla
gramatical de la manera siguiente:
exp exp ("+ " | - | * ) exp | "(" exp ")" | nmero

ANALISIS SINTACTICO

En esta regla los parntesis son necesarios


para agrupar las opciones de los
operadores entre las expresiones en el lado
derecho, puesto que la concatenacin tiene
precedencia sobre la seleccin (como en las
expresiones regulares). De este modo, la
regla siguiente tendra un significado
diferente (e incorrecto):
exp > exp "+ " | - | * exp | " (" exp ")" | nmero

ANALISIS SINTACTICO

Advierta tambin que, cuando se incluyen


los parntesis como metasmbolo, es
necesario distinguir los tokens de parntesis
de los metasmbolos, lo que hicimos
ponindolos entre comillas, como hacamos
en el caso de expresiones regulares. (Para
mantener
la
consistencia
tambin
encerramos los smbolos de operador entre
comillas.)

ANALISIS SINTACTICO

Los parntesis no son absolutamente


necesarios como metasmbolos en BNF, ya
que siempre es posible separar las partes
entre parntesis en una nueva regla
gramatical. De hecho, la operacin de
seleccin que da el metasmbolo de la barra
vertical tampoco es necesaria en reglas
gramaticales, si permitimos que el mismo
nombre aparezca cualquier nmero de
veces a la izquierda de la flecha.

ANALISIS SINTACTICO
Por ejemplo, nuestra gramtica de expresin
simple podra escribirse como se aprecia a
continuacin:
exp exp op exp
exp (exp)
exp nmero
op +
op op *

ANALISIS SINTACTICO

Sin embargo, por lo regular describiremos


reglas gramaticales de manera que todas
las selecciones para cada estructura estn
enumeradas en una sola regla, y cada
nombre de estructura aparezca slo una
vez a la izquierda de la flecha.

ANALISIS SINTACTICO
En ocasiones, por simplicidad, daremos ejemplos
de reglas gramaticales en una notacin abreviada.
En estos casos utilizaremos letras en maysculas
para nombres de estructura y letras en minsculas
para smbolos de token individuales (que con
frecuencia son slo caracteres simples). De este
modo, nuestra gramtica de expresin simple
podra escribirse en esta forma abreviada de la
manera que sigue:
E E O E | (E) | n

ANALISIS SINTACTICO

En ocasiones tambin simplificaremos la


notacin
cuando
estemos
utilizando
solamente caracteres como tokens y los
estemos escribiendo sin utilizar una fuente
de cdigo:
E E O E | (E) | a
O+|-|*

ANALISIS SINTACTICO

Las reglas gramaticales libres de contexto


determinan el conjunto de cadenas
sintcticamente legales de smbolos de
token para las estructuras definidas por las
reglas. Por ejemplo, la expresin aritmtica
(34-3)*42
corresponde a la cadena legal de siete
tokens
( nmero - nmero ) * nmero

ANALISIS SINTACTICO

Donde los tokens de nmero tienen sus


estructuras determinadas por el analizador
lxico y la cadena misma es legalmente una
expresin porque cada parte corresponde a
selecciones determinadas por las reglas
gramaticales
exp exp op exp | (exp) | nmero
op + | - | *

ANALISIS SINTACTICO

Por otra parte, la cadena


(34-3*42
No es una expresin legal, porque se tiene
un parntesis izquierdo que no tiene su
correspondiente parntesis derecho y la
segunda seleccin en la regla gramatical
para una expresin exp requiere que los
parntesis se generen en pares.

ANALISIS SINTACTICO
Las reglas gramaticales determinan las cadenas
legales de smbolos de token por medio de
derivaciones. Una derivacin es una secuencia
de reemplazos de nombres de estructura por
selecciones en los lados derechos de las reglas
gramaticales. Una derivacin comienza con un
nombre de estructura simple y termina con una
cadena de smbolos de token. En cada etapa de
una derivacin se hace un reemplazo simple
utilizando una seleccin de una regla gramatical

ANALISIS SINTACTICO

(34-3)*42
(1) exp exp op exp
(2)
exp op nmero
(3)
exp * nmero
(4)
(exp) * nmero
(5)
(exp op exp) * nmero
(6)
(exp op nmero) * nmero
(7)
(exp nmero) * nmero
(8)
(nmero - nmero)*nmero

[expexp op exp]
[exp nmero]
[op *]
[exp (exp)]
[exp exp op exp]
[exp nmero]
[op -]
[exp nmero]

ANALISIS SINTACTICO

Advierta que los pasos de derivacin utilizan


una flecha diferente al metasmbolo de
flecha que se emplea en las reglas
gramaticales. Esto se debe a que existe una
diferencia entre un paso de derivacin y una
regla gramatical: las reglas gramaticales
definen, mientras que los pasos de
derivacin construyen mediante reemplazo

ANALISIS SINTACTICO

El conjunto de todas las cadenas de


smbolos
de
token
obtenido
por
derivaciones del smbolo exp es el lenguaje
definido por la gramtica de expresiones.
Este
lenguaje
contiene
todas
las
expresiones
sintcticamente
legales.
Podemos escribir esto de manera simblica
como:
L(G) = { s | exp *s }

ANALISIS SINTACTICO
donde G representa la gramtica de expresin, s
representa una cadena arbitraria de smbolos de
token (en ocasiones denominada sentencia), y los
smbolos * representan una derivacin
compuesta de una secuencia de reemplazos como
se describieron anteriormente. (El asterisco se
utiliza para indicar una secuencia de pasos, as
como para indicar repeticin en expresiones
regulares.) Las reglas gramaticales en ocasiones
se conocen como producciones porque
"producen" las cadenas en L(G) mediante
derivaciones.

ANALISIS SINTACTICO

Cada nombre de estructura en una


gramtica define su propio lenguaje de
cadenas sintcticamente legales de tokens.
Por ejemplo, el lenguaje definido por op en
nuestra gramtica de expresin simple
define el lenguaje {+, -, *} compuesto slo
de tres smbolos.

ANALISIS SINTACTICO
Por lo regular estamos ms interesados en el
lenguaje definido por la estructura ms general en
una gramtica. La gramtica para un lenguaje de
programacin a menudo define una estructura
denominada programa, y el lenguaje de esta
estructura es el conjunto de todos los programas
sintcticamente
legales
del
lenguaje
de
programacin (advierta que aqu utilizamos la
palabra "lenguaje" en dos sentidos diferentes).

ANALISIS SINTACTICO

Por ejemplo, un BNF para un lenguaje de


programacin X comenzar con reglas
gramaticales tales como:
programa encabezado-programa ; bloque-programa .
encabezado-programa . . .
bloque-programa . . .

ANALISIS SINTACTICO
Considere la gramtica G con la regla gramatical
simple
EE+a|a
Esta gramtica genera todas las cadenas compuestas
de a separadas por signos de "ms" (+):
L(G) = {a, a + a, a + a + a, a + a + a + a, ...}
Para ver esto (de manera informal), considere el efecto
de la regla E E + a: esto provoca que la cadena + a
se repita sobre la derecha en una derivacin:
E E + a E + a + a E + a + a + a .
Finalmente, debemos reemplazar la E a la izquierda
utilizando el caso base E a

ANALISIS SINTACTICO

Podemos demostrar esto ms formalmente


mediante induccin como sigue. En primer
lugar, mostramos que toda cadena a + a +
+ a est en L(G) por induccin en el
nmero de las a.
La derivacin E a muestra que a est en
L(G); suponga ahora que s = a + a
+ + a, con n 1 a, est en L(G).

ANALISIS SINTACTICO
De este modo, existe una derivacin E =>* s: ahora
la derivacin E => E + a * s + a muestra que la
cadena s + a, con n + a, est en L(G).
A la inversa, tambin mostramos que cualquier
cadena s de L(G) debe ser de la forma a +
a + + a.
Mostramos esto mediante induccin sobre la
longitud
de
una
derivacin.
Si
la
derivacin tiene longitud 1, entonces es de la forma
E => a, as que s es de la forma correcta.

ANALISIS SINTACTICO
Ahora, suponga la veracidad de la hiptesis para
todas las cadenas con derivaciones de
longitud n 1, y sea E =>* s una derivacin de
longitud n > 1. Esta derivacin debe comenzar con
el reemplazo de E por E + a, y de esta manera
ser de la forma E => E + a =>*
s' + a = s.
Entonces, s' tiene una derivacin de longitud n - 1,
y
de
este
modo
ser
de
la
forma: a + a + + a. Por lo tanto, s misma debe
tener esta misma forma.

ANALISIS SINTACTICO

Considere la siguiente gramtica muy


simplificada de sentencias:
sentencia sent-if | otro
sent-if if ( exp ) sentencia
| if (exp) sentencia else sentencia
exp 0 | 1
El lenguaje de esta gramtica se compone
de sentencias if anidadas de manera
semejante al lenguaje C

ANALISIS SINTACTICO
Simplificamos las expresiones de prueba lgica ya sea
a O o a 1, y agrupamos todas las otras sentencias
aparte de las sentencias if en el terminal otro. Ejemplos
de cadenas en este lenguaje son
otro
if (0) otro
if (1) otro
if
(0)
otro else otro
if
(1)
otro else otro
if
(0)
if (0) otro
if
(0)
if (1) otro else otro
if
(1)
otro else if (0) otro else otro

ANALISIS SINTACTICO
rboles de anlisis gramatical
Una derivacin proporciona un mtodo para
construir una cadena particular de terminales a
partir de un no terminal inicial. Pero las
derivaciones no slo representan la estructura de
las cadenas que construyen. En general, existen
muchas derivaciones para la misma cadena. Por
ejemplo, construyamos la cadena de tokens
( nmero - nmero ) * nmero

ANALISIS SINTACTICO
A partir de nuestra gramtica de expresin simple
utilizando la derivacin anterior y una segunda
derivacin para esta cadena se proporciona:
(1) exp
(2)
(3)
(4)
(5)
(6)
(7)
(8)

exp op exp
(exp) op exp
(exp op exp) op exp
(nmero op exp) op exp
(nmero - exp ) op exp
(nmero - nmero) op exp
(nmero - nmero) * exp
(nmero - nmero) *nmero

[expexp op exp]
[exp (exp)]
[exp exp op exp]
[exp nmero]
[op -]
[exp nmero]
[op *]
[exp nmero]

ANALISIS SINTACTICO
La nica diferencia entre las dos derivaciones es
el orden en el cual se suministran los reemplazos,
y sta es de hecho una diferencia superficial. Para
aclarar esto necesitamos una representacin para
la estructura de una cadena de terminales que
abstraiga las caractersticas esenciales de una
derivacin mientras se factorizan las diferencias
superficiales de orden. La representacin que
hace esto es una estructura de rbol, y se conoce
como rbol de anlisis gramatical

ANALISIS SINTACTICO

Un
rbol
de
anlisis
gramatical
correspondiente a una derivacin es un
rbol etiquetado en el cual los nodos
interiores estn etiquetados por no
terminales,
los
nodos
hoja
estn
etiquetados por terminales y los hijos de
cada nodo interno representan el reemplazo
del no terminal asociado en un paso de la
derivacin.

ANALISIS SINTACTICO
Para dar un ejemplo simple, la derivacin
exp => exp op exp
=> nmero op exp
=> nmero + exp
=> nmero+nmero
corresponde al rbol de anlisis gramatical

nmero

nmero

ANALISIS SINTACTICO
El primer paso en la derivacin corresponde a los
tres hijos del nodo raz. El segundo paso
corresponde al hijo nmero de la exp en el
extremo izquierdo debajo de la raz, y de manera
similar para los dos pasos restantes. Podemos
hacer esta correspondencia explcita al numerar
los nodos internos del rbol de anlisis gramatical
mediante el nmero de paso en el cual se
reemplaza su no terminal asociado en una
derivacin correspondiente. De este modo, si
numeramos la derivacin anterior como sigue:

ANALISIS SINTACTICO
(1)exp exp op exp
(2)
nmero op exp
(3)
nmero + exp
nmero + nmero

podemos numerar los nodos internos del rbol de


anlisis gramatical respectivamente
1 exp

2 exp

nmero

nmero

ANALISIS SINTACTICO

La expresin (34-3)*42 genera un rbol


sintctico.

ANALISIS SINTACTICO
Considere la gramtica para las sentencias if
simplificadas
sentencia sent-if | otro
sent-if if ( exp ) sentencia
| if (exp) sentencia else sentencia
exp 0 | 1
El rbol de anlisis gramatical para la cadena:
if (0) otro else otro
es como se presenta a continuacin:

ANALISIS SINTACTICO

ANALISIS SINTACTICO
Considere la gramtica de una secuencia de sentencias
separadas por signos de punto y coma del ejemplo :
secuencia-sent > sent ; secuencia-sent | sent
sent s
La cadena s;s;s tiene el siguiente rbol de anlisis
gramatical respecto a esta gramtica:

ANALISIS SINTACTICO
Un posible rbol sintctico para esta misma
cadena es:

ANALISIS SINTACTICO
Gramticas ambiguas
Los rboles de anlisis gramatical y los rboles
sintcticos expresan de manera nica la estructura
de la sintaxis, y efectan derivaciones por la
izquierda y por la derecha, pero no derivaciones
en general. Desgraciadamente, una gramtica
puede permitir que una cadena tenga ms de un
rbol de anlisis gramatical. Considere, por
ejemplo, la gramtica de la aritmtica entera
simple que hemos estado utilizando como ejemplo
estndar

ANALISIS SINTACTICO
exp > exp op exp | ( exp ) | nmero
op > + | - | *
y considere la cadena 34-3*42. Esta cadena tiene
dos rboles de anlisis gramatical diferentes

ANALISIS SINTACTICO
correspondientes a las dos derivaciones por la
izquierda

ANALISIS SINTACTICO

ANALISIS SINTACTICO

ANALISIS SINTACTICO
Precedencia y Asociatividad
Para manejar la precedencia de las operaciones
en la gramtica debemos agrupar los operadores
en grupos de igual precedencia, y para cada
precedencia debemos escribir una regla diferente.
Por ejemplo, la precedencia de la multiplicacin
sobre la suma y la resta se puede agregar a
nuestra gramtica de expresin simple como se ve
a continuacin:

ANALISIS SINTACTICO
exp exp opsuma exp | term
opsuma + term term opmult term | factor
opmult *
factor (exp) | nmero
En esta gramtica la multiplicacin se agrupa bajo la
regla term, mientras que la suma y la resta se agrupan
bajo la regla exp. Como el caso base para una exp es
un term, esto significa que la suma y la resta
aparecern "ms altas" (es decir, ms cercanas a la
raz) en los rboles de anlisis gramatical y sintctico,
de manera que reciben una precedencia ms baja.

ANALISIS SINTACTICO
Esta ltima gramtica para expresiones aritmticas
simples todava no especifica la asociatividad de los
operadores y an es ambigua. La causa es que la
recursin en ambos lados del operador permite que
cualquier lado iguale repeticiones del operador en una
derivacin (y, por lo tanto, en los rboles de anlisis
gramatical y sintctico). La solucin es reemplazar una de
las recursiones con el caso base, forzando las
coincidencias repetitivas en el lado en que est la
recursin restante. Por consiguiente, reemplazando la
regla:
exp exp opsuma exp |term
por
exp exp opsuma term | term

ANALISIS SINTACTICO
Ahora el rbol de anlisis gramatical para la expresin
34 3 42 es:

ANALISIS SINTACTICO
Considere la Gramtica :
sentencia sent-if | otro
sent-if if ( exp ) sentencia
| if (exp) sentencia else sentencia
exp 0 | 1
Esta gramtica es ambigua como resultado del else
opcional. Para ver esto considere la cadena
if (0) if (1) otro else otro
Esta cadena tiene los dos rboles de anlisis
gramatical:

ANALISIS SINTACTICO

S-ar putea să vă placă și