Anda di halaman 1dari 13

INDICE DEL ANALISIS SINTACTICO.

1. INTRODUCCIN

2. ANLISIS SINTCTICO

3. METODO TOP-DAWN

4. RECURSIVO DESCENDENTE

5. BOTTOM-UP

6. DE PROCEDENCIA SIMPLE

7. MATRICES DE TRANSICIN

8. GRAMTICAS LIBRES DE CONTEXTO

9. RBOLES DE DERIVACIN

10. FORMA NORMAL DE CHOMSKY

11. CONCLUSIN

12. BIBLIOGRAFIA
INTRODUCCIN.

Todo lenguaje de programacin obedece a unas reglas que describen la estructura
sintctica de los programas bien formados que acepta. En pascal, por ejemplo, un
programa se compone de bloques; un bloque, de sentencias; una sentencia, de
expresiones; una expresin, de componentes lxicos; y as sucesivamente hasta llegar a
los caracteres bsicos. Se puede describir la sintaxis de las construcciones de los
lenguajes de programacin por medio de gramticas de contexto libre o utilizando
notacin BNF (Backus-Naur Form). Las gramticas formales ofrecen ventajas
ignificativas a los diseadores de lenguajes y a los desarrolladores de compiladores.

Una gramtica da una especificacin sintctica precisa y fcil de entender de un
lenguaje de programacin.
A partir de algunas clases de gramticas se puede construir automticamente un
analizador sintctico eficiente que determine si un programa fuente est sintcticamente
bien formado. Otra ventaja es que el proceso de construccin del analizador que de otro
modo podran pasar sin detectar en la fase inicial de diseo de un lenguaje y de su
compilador.
Una gramtica diseada adecuadamente imparte una estructura a un lenguaje de
programacin til para la traduccin de programas fuente a cdigo objeto correcto y
para la deteccin de errores. Existen herramientas para convertir descripciones de
traducciones basadas en gramticas en programas operativos.
Los lenguajes evolucionan con el tiempo, adquiriendo nuevas construcciones y
realizando tareas adicionales. Estas nuevas construcciones se pueden aadir con ms
facilidad a un lenguaje cuando existe una aplicacin basada en una descripcin
gramatical del lenguaje.
La mayor parte del presente trabajo est dedicada a los componentes del anlisis
sintctico, as como los conceptos bsicos y otros temas de gran inters.

Qu es el Analizador Sintctico?

Es la fase del analizador que se encarga de chequear el texto de entrada en base a una
gramtica dada. Y en caso de que el programa de entrada sea vlido, suministra el rbol
sintctico que lo reconoce.
En teora, se supone que la salida del analizador sintctico es alguna representacin del
rbol sintctico que reconoce la secuencia de tokens suministrada por el analizador
lxico.
En la prctica, el analizador sintctico tambin hace:

Acceder a la tabla de smbolos (para hacer parte del trabajo del analizador
semntico).

Chequeo de tipos (del analizador semntico).
Generar cdigo intermedio.
Generar errores cuando se producen.
En definitiva, realiza casi todas las operaciones de la compilacin. Este mtodo de
trabajo
da lugar a los mtodos de compilacin dirigidos por sintaxis.
El anlisis sintctico convierte el texto de entrada en otras estructuras (comnmente
rboles), que son ms tiles para el posterior anlisis y capturan la jerarqua implcita de
la entrada. Un analizador lxico crea tokens de una secuencia de caracteres de entrada y
son estos tokens los que son procesados por el analizador sintctico para construir la
estructura de datos, por ejemplo un rbol de anlisis o rboles abstractos de sintaxis.
El anlisis sintctico tambin es un estado inicial del anlisis de frases de lenguaje
natural. Es usado para generar diagramas de lenguajes que usan flexin gramatical,
como los idiomas romances o el latn. Los lenguajes habitualmente reconocidos por los
analizadores sintcticos son los lenguajes libres de contexto. Cabe notar que existe una
justificacin formal que establece que los lenguajes libres de contexto son aquellos
reconocibles por un autmata de pila, de modo que todo analizador sintctico que
reconozca un lenguaje libre de contexto es equivalente en capacidad computacional a un
autmata de pila.
Los analizadores sintcticos fueron extensivamente estudiados durante los aos 70 del
siglo XX, detectndose numerosos patrones de funcionamiento en ellos, cosa que
permiti la creacin de programas generadores de analizadores sintticos a partir de una
especificacin de la sintaxis del lenguaje en forma Backus-Naur por ejemplo, tales y
como yacc, GNU bison y javacc.

TIPOS DE ANALIZADORES SNTACTICOS.

Existen dos tipos bsicos de analizadores para las gramticas libres de contexto: los <>
o descendente y los <> o ascendentes. Los ascendentes intentan construir el rbol desde
las hojas hasta la raz, mientras que los descendentes comienzan por la raz y bajan hasta
las hojas.


ANALIZADORES SINTACTICOS DESCENDENTES (Top-down).


Se puede considerar un analizador descendente como una tcnica que intenta encontrar
una derivacin <> de la cadena de entrada. Tambin podemos considerarlo como una
tcnica que intenta construir un rbol sintctico de la cadena de entrada, comenzando
por la raz y creando los nodos a partir de ella hasta llegar a las hojas.
Consideremos el siguiente fragmento de gramtica, que describe la estructura de un
lenguaje dado:


::: = module ;
::: = d | d ;
::: = p | p ;

Dada la cadena de entrada siguiente,

Module d ; d ; p ; end


Para construir el rbol sintctico descendente correspondiente, creamos inicialmente un
rbol que consiste en un nico nodo etiquetado con el smbolo inicial: PROG. Entonces
usamos la primera para expandir el rbol y obtenemos:

PROG
____________________________________________________________


Module DECLS ; PROCS end


Para una secuencia de palabras, construye un rbol de anlisis sintctico desde la raz a
las hojas.

RECURSIVO DESCENDETE.

Una gramtica permite la implementacin de formas de analizadores sintcticos. La ms
importante es la recursiva descendente, que vemos a continuacin, y en la cual cada no
terminal es una llamada a su correspondiente procedimiento analizador.

Un analizador recursivo descendente tiene las caractersticas que se desprenden de su
nombre: un analizador sintctico de tipo descendente (top-down) e implementado con
un lenguaje recursivo. El mecanismo de anlisis es el siguiente:
1.- Existir un procedimiento o funcin por cada smbolo no terminal.
2.- Dada una produccin, y una vez que estamos en el procedimiento que trata el
smbolo no terminal de la parte izquierda, para analizar la parte derecha se har lo
siguiente:

Si hay alternativas, llamar al analizador lxico (si no est ya avanzado), con el fin de
obtener un nuevo token del texto fuente. Una vez ledo, se compara el token con los
smbolos directores de dichas alternativas. Si el token pertenece a uno de esos conjuntos
de smbolos directores, sigue el anlisis por el procedimiento que trate la alternativa
correspondiente. Si no pertenece, se tratara de un error sintctico.
Si no hay alternativas, o bien ya dentro de una alternativa, el anlisis ser el siguiente: si
el primer smbolo es un no terminal, llamar al procedimiento correspondiente. Si es un
terminal, llamar al analizador lxico (si no est avanzado), comparar y seguir el anlisis
si el token ledo coincide con dicho smbolo terminal.


Analizadores sintcticos ascendentes
(Bottom-up).


Para una secuencia de palabras, construye un rbol de anlisis sintctico desde las
hojas a la raz.

Se denominan ascendentes porque pretenden construir un rbol sintctico parra una
determinada cadena de entrada empezando por las hojas y constituyendo el rbol hasta
llegar a la raz. Tambin se puede considerar este proceso como la <> de una cadena de
smbolos al smbolo inicial de la gramtica, es decir, una derivacin en sentido inverso.

En cada paso del proceso, una cadena que coincida con la parte derecha de la
produccin se remplaza por el smbolo no terminal de la parte izquierda de dicha
produccin. Veamos un ejemplo con la siguiente gramtica donde aplicaremos IDENT
y CONST y el smbolo inicial EXP (abreviaturas de IDENTIFICADOR, CONSTANTE
Y EXPRESIN). La cadena de entrada es:


3 + a -5
Y la queremos reducir al smbolo de la gramtica, que era EXP. Segn la definicin de
la gramtica, el smbolo inicial EXP tena nueve producciones alternativas. Para reducir
la cadena dada al smbolo EXP, lo que hacemos es identificar subcadenas que coincidan
con la parte derecha de alguna produccin de EXP. En nuestro caso, 3, a y 5. Tomamos
el de ms a la izquierda, 3, y lo sustituimos por su parte derecha en la produccin, que
era CONST, con lo que la cadena de entrada se nos queda en CONST + a -5. Hacemos
lo mismo con a y 5 y la cadena resultante es CONST + IDENT + CONST. Con esta
cadena volvemos a realizar el mismo proceso, buscar subcadenas que coincidan con la
parte derecha de alguna produccin del smbolo inicial EXP. Tanto CONST como
IDENT son derivaciones inmediatas de EXP, luego podemos reducir la cadena actual a
EXP + EXP EXP. A su vez, (siguiendo siempre el criterio de tomar las subcadenas de
ms a la izquierda), tenemos que EXP + EXP se puede reducir a EXP, con lo que nos
queda EXP EXP. Y esta cadena tambin es una produccin de EXP, con lo cual se
reduce a EXP. Luego la cadena 3 + a -5 es derivable de EXP y por tanto pertenece al
lenguaje generado por la gramtica.
Cada reemplazamiento de la parte derecha de una produccin se denomina <>. As, con
una serie de ocho reducciones hemos podido reducir 3 + a 5 al smbolo inicial EXP.
En realidad, estas reducciones equivalen a una <> al revs:
3 + a 5CONST + a 5CONST +IDENT- 5 CONST+ IDENT CONST..
. EXP +IDENT CONST EXP + EXP CONST EXP + EXP EXP.
. EXP EXP EXP

En los analizadores ascendentes existen problemas cuando la gramtica es ambigua, lo
que significa que se pueden encontrar dos derivaciones ms a la derecha para una
misma cadena.
DE PROCEDENCIA SIMPLE.

Este tipo de anlisis incluye, en el proceso de construccin del rbol de Derivacin, una
serie de reducciones a travs de las cuales reemplaza un substring que representa la
parte derecha de una produccin (handle) por su respectiva parte izquierda. Es decir que
va ascendiendo en el rbol desde los descendientes hacia el respectivo nodo padre. Bajo
esta tcnica separte de la cadena w a reconocer y se trata de alcanzar el smbolo
distinguido S. Al igual que la tcnica Top-Down, w slo es aceptada si se logra
construir el rbol de derivacin para w.
En este caso, la cadena w representa las hojas de un posible rbol de Derivacin para
w. El proceso de reduccin puede ser visto como la conexin hacia arriba de el o los
descendientes con su respectivo nodo padre.
El resultado de la aplicacin de esta tcnica es la secuencia de reducciones realizadas,
que es equivalente a la inversa de una secuencia de derivaciones de ms a la derecha
para w partiendo de S, tambin llamado right parser.
Anlisis Sintctico y determinismo.
Cualquiera sea el enfoque que se considere, debemos tener en cuenta que durante el
proceso de construccin del rbol de Derivacin, ya sea usando una tcnica Top-Down
o Bottom-Up, se deben tomar decisiones que eventualmente podran involucrar ms de
una alternativa. Por ejemplo, un nodo del rbol (usando un algoritmo Top-Down) podra
ser expandido de diferentes maneras, pudiendo llevar a un no determinismo. Desde el
punto de vista terico, esto no tiene implicaciones muy severas. Sin embargo, desde el
punto de vista prctico es inadmisible, ya que tornara a la implementacin en un
proceso completamente ineficiente en cuanto al tiempo insumido para el reconocimiento
de una cadena.
Si bien ambas tcnicas de parsing son igualmente importantes, veremos una
implementacin prctica de la tcnica Bottom-up, dado que una implemetacin prctica
de la tcnica Top-dwn es dada en la materia Compiladores. Desde el punto de vista
terico, veremos implementaciones de ambas tcnicas usando APDs a fin de entender
gradualmente el concepto de anlisis sintctico.




MATRICES DE TRANSICIN.
Se puede utilizar una matriz bidimensional para representar un rbol de anlisis
sintctico.
Para obtener los parmetros de la matriz de transmisin a partir de la matriz de
impedancia, recordemos la matriz de impedancia para dos puertos y cambiemos el signo
para I2 de acuerdo a la grafica (6a):


(71)

Que corresponde a:

(72)
(73)

Reemplazando los voltajes V1 y V2 en las ecuaciones (68) para los parmetros A, B, C,
D se obtiene:

(74)

(75)

(76)

(77)

Si la red es reciproca, a partir de estas ltimas ecuaciones se llega a que AD BC =1.


En la siguiente tabla se tienen algunos parmetros ABCD para algunos circuitos de dos
puertos

GRAMATICAS LIBRES DE CONTEXTO.

Gramticas libres de contexto (GLC), o de tipo 2: las reglas son de la forma X a, donde
X es una variable y a es una cadena que puede contener variables y constantes.
Estas gramticas producen los lenguajes libres de contexto (abreviado LLC).

Podemos ver que la gramtica del espaol dada arriba es una GLC, pero no podra ser
una gramtica regular, pues hay varias reglas que no corresponden al formato de las
reglas de las gramticas regulares. Se ve por lo tanto que el formato de las reglas es
menos rgido en las GLC que en las gramticas regulares, y as toda gramtica regular
es GLC pero no viceversa
Por ejemplo, el lenguaje {ab} que no es regular, ya que tiene la gramtica libre de
contexto con las siguientes reglas:
1.- S aSb
2.- S ab
Como vimos en el caso de las gramticas regulares, aplicar una regla X a de una
gramtica consiste en remplazar X por a en una palabra. Por ejemplo, la regla S aSb se
puede aplicar a una palabra aaSbb para obtener la palabra aaaSbbb, en donde es fcil var
que reemplazamos S por aSb.
Al proceso de aplicar una regla se le conoce como paso de derivacin, y se denota
usando una flecha gruesa , como en aaSbb aaaSbbb (aplicando una regla S aSb).

Una secuencia de pasos de derivacin a partir de una variable especial de la gramatica
llamada smbolo inicial se llama simplemente derivacin. Por ejemplo, una derivacin
de la palabra aaabbb utilizando la gramatica de {ab} sera (suponiendo que S es el
smbolo inicial):

S aSb aaSbb aaabbb
Como un ejemplo adicional, la gramtica con las reglas siguientes permite generar
expresiones aritmticas con sumas y multiplicaciones de enteros:


1.- E E + T
2.- E T
3.- T T * F
4.- T F
5.- F CF
6.- F C
7.- C 0|1|2|3|4|5|6|7|8|9


El smbolo inicial aqu es E, las constantes son +, * y las cifras 0.9; E, T, F, C son
variables.
Con esta gramtica podemos generar, por ejemplo, la expresin 25 + 3 * 12 de la
manera siguiente:

EXPRESIN
JUSTIFICACIN
E
Smbolo inicial, inicia derivacin
E+T
Aplicacin 1. regla
T+T
2. Regla, sobre la E
F+T
4. Regla, sobre la T izquierda
CF+T
5. Regla, sobre F
2F+T
7. Regla
2C+T
6. regla
25+T
7. regla
25+T*F
3. regla
25+F*F
4. regla
25+C*F
6. Regla, sobre la F izquierda
25+3*F
7. regla
25+3*CF
5. regla
25+3*1F
7. regla
25+3*1C
6. regla
25+3*12
7. regla

Ms adelante veremos una herramienta, los arboles de derivacin, que permiten
encontrar ms fcilmente y visualizar mejor la derivacin de las palabras a partir del
smbolo inicial, aunque su formalizacin es menos directa que la simple derivacin paso
a paso que hemos mostrado.


ARBOLES DE DERIVACIN.

S

S S

( S ) ( )

S S

( ) ( )


Figura 4.1: parntesis bien balanceados.


Las GLC tienen la propiedad de que las derivaciones pueden ser representadas en forma
arborescente. Por ejemplo, considrese la gramtica siguiente para producir el lenguaje
de los parntesis bien balanceados, que tiene palabras como (()), ()(), (()())(), pero no a
(() ni )( :
1.- S SS
2.- S (S)
3.- S ()
Usando esta gramtica, la palabra (()())() puede ser derivada de la manera que se ilustra
en la figura 4.1. En dicha figura se puede apreciar la estructura que se encuentra
implcita en la palabra (()())(). A estas estructuras se les llama rboles de derivacin, o
tambin rboles de compilacin por usarse extensivamente en los compiladores- y son
de vital importancia para la teora de los compiladores de los lenguajes de
programacin.

Se puede considerar que un rbol de derivacin es ms abstracto que una derivacin
lineal es decir, una sucesin S w- en el sentido de que para un solo rbol de
derivacin puede haber varias derivaciones lineales, segn el orden en que se decida
expandir los no terminales. Por ejemplo, para el rbol de la figura de arriba, hay al
menos las derivaciones siguientes (anotamos como subndice de el nmero de regla
aplicado):

1.- S 1 SS 2 (S) S 3 (S) () 1 (SS) () 3 (S ()) () 3 (() ()) ().
2.- S 1 SS 3 S() 2 (S) () 1 (SS) () 3 (() S) () 3 (() ()) ().
Formalmente, un rbol de derivacin es un grafo dirigido arborescente definido de la
manera siguiente:
Definicin.- Sea G = (V, , R, S) una GLC. Entonces un rbol de derivacin cumple las
siguientes propiedades:
1.- Cada nodo tiene una etiqueta.
2.- La raz tiene etiqueta S.

3.- La etiqueta de los nodos que no son hojas debe estar en V, y las de las hojas en U
{}.

4.- Si un nodo n tiene etiqueta A, y los nodos n1,., nm son sus hijos (de izquierda a
derecha), con etiquetas respectivamente A1,.., Am, entonces AA1,, Am R.

Definicin.- la cadena de caracteres que resulta de concatenar terminales encontradas en
las etiquetas de los nodos hoja, en un recorrido en orden del rbol de derivacin, se
llama el producto del rbol.
Es decir, al efectuar un recorrido en orden del rbol de derivacin recuperamos la
cadena a partir de la cual se construy dicho rbol. As, el problema de compilar una
cadena de caracteres consiste en construir el rbol de derivacin a partir del producto de
ste.

FORMA NORMAL DE CHOMSKY.

En ocasiones es necesario expresar una GLC siguiendo un formato ms preciso de las
reglas que la simple forma Aa. Estos estndares reciben el nombre de formas
normales.
Vamos a estudiar una de las formas normales ms conocidas, la forma normal de
Chomsky (FNCH).
La FNCH consiste en que las reglas pueden tener dos formas:
1.- A , a
2.- ABC, con B, C V

Esta forma normal, aparentemente tan arbitraria, tiene por objeto facilitar el anlisis
sintctico de una palabra de entrada, siguiendo la estrategia siguiente: Se trata de
construir el rbol de derivacin de w de arriba hacia abajo (llamado top-down en
ingls), y por consiguiente se supone inicialmente que el smbolo de entrada w en dos
pedazos, w = , para luego tomar alguna regla SAB , y tratar de verificar si se puede
derivar a partir de A y b a partir de B, es decir: S w si:


1.- w , hay una regla Sw

2.-w = , hay una regla SAB, con A. , y B..

Por ejemplo, considrese la siguiente gramtica para el lenguaje de los parntesis bien
balanceados, en forma normal de Chomsky (damos sus reglas):

1.- SXY
2.-X(
3.-YSZ
4.-Z)
5.-SSS
6.-SXZ
Supongamos que tenemos una palabra como (()) (), y queremos verificar si se puede
derivar a partir de esta gramtica. Hay que partir dicha palabra en dos pedazos, y
escoger alguna

S

S S

X Y X Z

S Z ( )

X Z )

( )

Figura 4.3: rbol de la palabra (()) ()


Regla que produzca dos variables. Escogemos la quinta regla, SSS, y partimos la
palabra en los pedazos (()) y (). Para que SS pueda generar (()) () ahora se necesitar
que la primera S pueda generar (()), y la segunda pueda generar (). Estos son
subproblemas muy similares al problema inicial. Tomemos el primero, es decir, a partir
de S generar (()). Escogemos la regla SXY, y partimos la palabra en (y ()). Ahora X
tiene la responsabilidad de generar (y Y la de generar ()). Por la segunda regla, X genera
directamente (. Ahora tomamos el problema de generar ()) a partir de Y. escogemos la
regla SSZ, y la separacin en los pedazos () y ). Entonces Z produce directamente ), y
queda por resolver cmo S produce (). Para ello, escogemos la regla SXZ, y finalmente
X produce ( y z se encarga de ), con lo que terminamos el anlisis. E rbol de
compilacin se presenta en la figura 4.3.

CONCLUSIN.

El trabajo descrito representa una aportacin significativa y original al anlisis
sintctico de los lenguajes de adjuncin de rboles y por extensin al procesamiento del
lenguaje
natural, a la inteligencia artificial, y a la teora de autmatas y lenguajes formales.
En este trabajo se ha mostrado que es posible establecer un camino evolutivo continuo
en el que se sitan los algoritmos de anlisis sintctico que incorporan las estrategias de
anlisis ms importantes, tanto para el caso de las gramticas de adjuncin de rboles
como para el caso de las gramticas lineales de ndices. Los diferentes algoritmos se han
definido con esquemas de anlisis sintctico, de tal modo que los algoritmos ms
complejos se derivan a partir de los menos complejos aplicando una secuencia de
transformaciones simples.
En el caso de las gramticas lineales de ndices el resultado es doblemente interesante,
pues
si bien se ha esgrimido a su favor su adecuacin como formalismo intermedio para el
anlisis de gramticas de adjuncin de rboles, lo cierto es que numerosas estrategias de
anlisis para estas ltimas no se hallaban incorporadas a ningn algoritmo de anlisis
sintctico para gramticas lineales de ndices. En consecuencia, era necesario sacrificar
la estrategia de anlisis si se optaba por este enfoque, lo que limitaba enormemente su
aplicacin practica. Con el trabajo desarrollado hemos salvado ese obstculo definiendo
algoritmos de anlisis sintctico para gramticas lineales de ndices que incorporan la
versin equivalente de las estrategias de anlisis ms populares para gramticas de
adjuncin de rboles.
En el caso de las gramticas independientes del contexto es posible optar por un diseo
modular en el cual se separa la definicin y la ejecucin de una determinada estrategia
de anlisis.
En particular, es posible definir un algoritmo de anlisis sintctico como un conjunto de
transiciones de un autmata a pila, probablemente no determinista, el cual puede ser
interpretado eficientemente mediante las tcnicas de tabulacin disponibles. Este
enfoque presenta ventajas evidentes, entre la cuales cabe citar la simplificacin de las
pruebas de correccin de los algoritmos, los cuales son mas fciles de comprender y, al
ser ejecutados en un entorno homogneo, son fcilmente comparables. En este trabajo
hemos adaptado este enfoque a los lenguajes de adjuncin de rboles de derivacin,
proporcionando modelos de autmata con los que describir los algoritmos de anlisis y
tcnicas de tabulacin con las que pueden ser ejecutados eficientemente.
Finalmente hemos analizado que dentro de los analizadores sintcticos que vimos,
pudimos notar la diferencia entre los que son descendentes y los ascendentes, y sus
principales caractersticas, viendo tambin la forma normal de Chomsky que es de gran
importancia en el anlisis sintctico.

BIBLIOGRAFIA.

1.-ALFRED V. AHO, RAVI SETHI, JEFFREY D ULLMAN, PEDRO FLORES
SUREZ, PERE BOTELLA I LPEZ.
*Compiladores: Principios, Tcnicas y Herramientas: Pearson Education, 1988.

2.- RAMON F. BRENA.
*Autmatas y Lenguajes: Tecnolgico de Monterrey, 2003.

3.- SERGIO GLVEZ ROJAS, MIGUEL NGEL MORA MATA.
*Java a Tope: Traductores Y Compiladores Con Lex/yacc, Jflex/cup Y Javacc:
Universidad de Mlaga, 2005.

4.- GONZALO SNCHEZ DUEAS, SANCHEZ G. VALVERDE, JUAN ANTONIO
VALVERDE ANDREU.
* Compiladores e intrpretes: Ediciones Das de Santos, S.A., 1989.