Está en la página 1de 5

ANALIZADOR SINTCTICO

El anlisis sintctico es una aplicacin que resulta del estudio de la Teora de Autmatas y
Lenguajes Formales. El anlisis sintctico es la base del Demostrador de Teoremas, ya que le
permite analizar los componentes lxicos y sintcticos que forman una frmula para despus
poderla evaluar, o no en caso de error, correctamente.
Es una de las partes de un compilador que transforma su entrada en un rbol de derivacin.
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 de sintaxis abstracta.
El objetivo del analizador sintctico es determinar si el cdigo fuente es correcto desde el
punto de vista de la sintaxis del lenguaje, es decir, comprueba si el programa fuente (PF) es
correcto sintcticamente.
Analizar sintcticamente una secuencia de tokens consiste en encontrar para dicha secuencia
un rbol sintctico o rbol de derivacin que, partiendo del axioma inicial de la gramtica y
a travs de las reglas (tambin llamadas producciones), nos lleve a obtener en las hojas la
secuencia de tokens analizada. Si se consigue este resultado, se dice que la secuencia de
tokens pertenece al lenguaje generado por la gramtica y pudiendo generar el cdigo
correspondiente a la sentencia. En caso contrario, se genera el error adecuado a la situacin
y no se genera el cdigo de esa sentencia. Es posible seguir analizando el resto del programa
fuente para buscar ms errores pero no ya no se generar ningn cdigo.
La complejidad de generar el rbol de una sentencia de n tokens es O(n3). Es muy costoso
porque la gramtica puede ser cualquiera de tipo 2. Por ello, se elige un subconjunto de este
tipo de gramticas de manera que podamos encontrar procedimientos que agilizan la
generacin del rbol , obteniendo as una complejidad menor que la anterior.
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.

Un claro ejemplo: Es el proceso que permite determinar si una cadena puede ser generada
por una gramtica. En nuestro caso es el proceso que permite determinar si una frmula est
bien generada o no. Este proceso es fundamental en el Demostrador de Teoremas ya que una
cadena que no sea una frmula no servir para realizar los razonamientos o pruebas. Por
tanto es importante definir precisamente un analizador para esta tarea.
Desde el punto de vista formal un analizador es un Autmata equivalente a una gramtica.

Objetivos del analizador sintctico (AS)

El AS es la parte principal de un compilador. Las funciones de AS son:

Principales:

Comprobar si el programa es sintcticamente correcto.

Generar las estructuras de datos (rboles sintcticos u otras


estructuras) que representan el programa y sirven para el analizador semntico y el
generador de cdigo.

En el caso de compilacin dirigida por sintaxis -- llamar al


analizador semntico y al generador de cdigo.
Otras:

Reaccionar frente a los errores e intentar acotar la propagacin


de los errores (intentar evitar que un error produzca muchos mensajes de error).

Hacer los siguientes pasos del compilador ms independientes de


la sintaxis del lenguaje.
Un analizador sintctico, tal y como se ha enfocado en esta librera es una clase que recibe
lo siguiente:
1.
Una clase donde se almacenarn los atributos de cada smbolo.
2.
Una gramtica libre de contexto donde el smbolo de inicio solo
produce una variable.
3.
Una funcin de sntesis para cada produccin, encargada de
sintetizar los atributos necesarios.
4.
Para cada produccin una opcional regla para deshacer
ambigedades.
5.
Una instancia de una clase de lxico que derive de la clase abstracta
de lxico bsico.
6.
Una opcional funcin de error para manejarlos y recuperarse en la
medida de lo posible.

El analizador ira leyendo del lxico y aplicando las reducciones necesarias (llamando a las
funciones de sntesis proporcionadas). El resultado habitual es un rbol sintctico construido
de manera ascendente. Cada nodo de ese rbol es del tipo genrico que se le pasa como
parmetro al parser mencionado en la lista anterior.
FUNCIN DEL ANLISIS SINTCTICO.
Analizar sintcticamente una tira o cadena de tokens no es ms que encontrar para ella el
rbol sintctico o de derivacin que tiene como raz el axioma de la gramtica, y como
nodos terminales la sucesin ordenada de smbolos que componen la cadena analizada. En
caso de no existir este rbol sintctico, la cadena no pertenecer al lenguaje, y el analizador
sintctico ha de emitir el correspondiente mensaje de error.
Existen dos formas de analizar sintcticamente una cadena:

Anlisis descendente: Partiendo del axioma inicial de la gramtica


se va descendiendo utilizando las derivaciones izquierdas, hasta llegar a construir la
cadena analizada.

Anlisis ascendente: Se va construyendo el rbol desde sus nodos


terminales. Es decir, se construye desde los smbolos de la cadena hasta llegar al
axioma de la gramtica. En este caso, se emplean normalmente las derivaciones ms a
la derecha hasta la localizacin de la raz.

Los principales mtodos de anlisis sintctico son:


o
Anlisis descendente:

Anlisis descendente con retroceso.


Anlisis de gramticas LL .
Anlisis ascendente:
Anlisis ascendente con retroceso.
Anlisis de gramticas de precedencia simple.
Anlisis de gramticas de precedencia generalizada.
Anlisis de gramticas por el mtodo mixto.
Anlisis de gramticas de precedencia de operador.
Anlisis de gramticas LR.

Los anlisis con retroceso se basan en la prueba sistemtica de todas las alternativas
posibles, dando marcha atrs tan pronto como se detecte que el camino seguido es errneo.
Pueden usarse para cualquier gramtica de contexto libre, aunque tienen tres grandes
inconvenientes: Primero , emplean mucho ms tiempo para el anlisis que los dems
analizadores, dependiendo ste incluso de la ordenacin de las reglas gramticales; Segundo ,

no dan un buen diagnstico de los errores que encuentran; Tercero , complican la generacin
de cdigo cuando sta se realiza al par que el anlisis sintctico.
Los mtodos ms eficientes de anlisis (tanto ascendente como descendente) no funcionan
para todas las gramticas de contexto libre, sino slo para las gramticas que cumplen unas
determinadas condiciones.
Afortunadamente, en la mayora de los casos, pueden encontrase para los lenguajes de
programacin gramticas de tipo LL o LR que los generen.
Para representar el rbol sintctico que conduce hasta una cadena se asigna a cada regla de
la gramtica un nmero. Se define el parse como la secuencia ordenada de nmeros (de
reglas) aplicadas para construir dicho rbol.
Hay dos tipos de parse , que son:

El parse-izquierdo: Son los nmeros de las reglas de derivacion


izquierda utilizadas para generar la cadena a partir del axioma, por tanto
correspondiente a un anlisis descendente .

El parse-derecho: Son los nmeros de las reglas de derivacin


derecha utilizadas para generar la cadena a partir del axioma, en orden inverso. El
tomar el orden inverso viene condicionado por ser el anlisis ascendente el que
normalmente utiliza las reglas de derivacin derecha, con lo que el orden en el que
aparecen al realizar el anlisis es invertido.

CASTING

En programacin, un casting (o cast ) sirve para cambiar el tipo de dato del valor resultante
de una expresin.
Conversin entre tipos primitivos (casting)
El casting es un procedimiento para transformar una variable primitiva de un tipo a otro.
Tambin se utiliza para transformar un objeto de una clase a otra clase siempre y cuando
haya una relacin de herencia entre ambas. En este caso nos centraremos en el primer ripo
de casting.
Dentro de este casting de variables primitivas se distinguen dos clases:
Casting implcito
En este caso no se necesita escribir cdigo para que la conversin se lleve a cabo. Ocurre
cuando se realiza lo que se llama una conversin ancha ( widening casting ), es decir, cuando
se coloca un valor pequeo en un contenedor grande.
Casting explcito
En el casting explcito s es necesario escribir cdigo. Ocurre cuando se realiza una
conversin estrecha ( narrowing casting ), es decir, cuando se coloca un valor grande en un
contenedor pequeo. Son susceptibles de prdida de datos.
Para finalizar con el casting entre primitivas, conviene tener en cuenta lo siguiente:
No es posible realizar casting entre una variable primitiva

booleana y cualquier otra

variable primitiva.
S es posible realizar casting entre una variable primitiva char y una variable
primitiva que almacene enteros