Beruflich Dokumente
Kultur Dokumente
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
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
ANALISIS SINTACTICO
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
ANALISIS SINTACTICO
ANALISIS SINTACTICO
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
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
ANALISIS SINTACTICO
ANALISIS SINTACTICO
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
ANALISIS SINTACTICO
ANALISIS SINTACTICO
ANALISIS SINTACTICO
ANALISIS SINTACTICO
<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
ANALISIS SINTACTICO
ANALISIS SINTACTICO
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
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
ANALISIS SINTACTICO
ANALISIS SINTACTICO
ANALISIS SINTACTICO
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
ANALISIS SINTACTICO
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
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
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
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
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
2 exp
nmero
nmero
ANALISIS SINTACTICO
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