Sunteți pe pagina 1din 42

Analizador Sintctico

Introduccin
El analizador sintctico tiene como objetivo encontrar las estructuras presentes en su entrada. Estas estructuras se pueden representar mediante el rbol de anlisis sintctico, que explica cmo se puede derivar la cadena de entrada en la gramtica que especifica el lenguaje. Aunque en la prctica es habitual que el rbol de anlisis no llegue a construirse, se trata de una abstraccin que nos permite entender mejor todo el proceso.

Anlisis Sintctico
Definicin: El Analizador Sintctico o parser recibe los tokens y comprueba su ordenacin correcta. Genera un rbol sintctico.
Programa Fuente Siguiente Token()

Analizador Lexicogrfico

TOKENS

Analizador Sintctico

rbol Sintctico

Tabla de Simbolos

Tiene como objetivo analizar la secuencia de tokens y comprobar que son correctas sintcticamente. A partir de una secuencia de tokens el analizador sintctico nos devuelve si la secuencia es correcta o no sintcticamente, tambin nos devuelve el orden en el que hay que aplicar las producciones de la gramtica para obtener la secuencia de entrada (rbol sintctico).
3

Anlisis Sintctico
Funcin:
Comprobar el orden en el que llegan los tokens. Construir una representacin del programa fuente. Si es sintcticamente incorrecto generara error Criterios de diseo del Analizador Sintctico: Eficiencia: El tiempo de anlisis debe ser proporcional al tamao del programa analizado Predictivo: Al detectar algn error debe determinar que quiso decir. Sin Retroceso: Al ejecutar una tarea no vuelve para atrs.

Descripcin Funcional
El analizador sintctico o parser verifica que la secuencia de tokens que recibe del scanner, estn debidamente combinados de tal manera que pueda ser generada con la gramtica libre de contexto que representa las reglas sintcticas del lenguaje.

07/10/2013

Descripcin Funcional

Tabla de Smbolos y Gestin de Errores


Tabla de Smbolo: Es el medio de almacenamiento de toda la informacin
referente a las variables y objetos en general del programa que se est compilando.

Gestin de Errores: Estn incluidas en cada uno de los procesos de


compilacin (anlisis lexicogrfico, sintctico y semntico), y se encargan de informar de los errores que encuentran en texto fuente, despus de detectar un error cada fase debe tratar de alguna forma ese error para poder continuar la compilacin.

Tipos de Analizadores Sintcticos


Analizador Descendente:
Se construye el rbol de anlisis sintctico partiendo del smbolo inicial y aplicando las producciones mediante derivaciones por la izquierda, el smbolo a expandir es el que este ms a la izquierda.

Se construye el rbol de anlisis sintctico partiendo de la frase a reconocer y aplicando las producciones mediante reducciones hasta llegar a smbolo inicial de la gramtica.

Analizador Ascendente:

Ejemplo: G=({+,*, ID, (, )}, {E, T, P}, E, P) P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) } Frase ID + ( ID * ID )

Ejemplo: G=({+,*, ID, (, )}, {E, T, P}, E, P) P={ E:=E+T | T; T:=T*P | P; P:= ID | ( E ) } Frase ID + ( ID * ID )
8

Tipos de Analizadores Sintcticos


L L (1) Es Predictivo

Descendentes

Se aplican las producciones por izquierda El orden de lectura de la entrada es de izquierda a derecha S L R (1)

Tipos de Analizadores

Es Predictivo Se aplican las producciones por derecha El orden de lectura de la entrada es de izquierda a derecha Simple L R (1) Es Predictivo

Ascendentes

Se aplican las producciones por derecha El orden de lectura de la entrada es de izquierda a derecha LA L R (1) Es Predictivo Se aplican las producciones por derecha El orden de lectura de la entrada es de izquierda a derecha Look a Head: Al construir el analizador va a tratar de mirar por adelantado el texto para 9 comprenderlo y hacer mas sencillo y mejores estados

Especificacin sintctica de los Lenguajes de Programacin


La sintaxis de los lenguajes de programacin se especifica mediante Gramticas Libres de Contexto, que adems son la base para los esquemas de traduccin de la etapa de sntesis. Para cualquier gramtica libre de contexto se puede construir un analizador sintctico. Las producciones de la gramtica libre de contexto obedecen al formato: P = { A / AN y (N)* } Donde: N = Smbolos no terminales o variables sintcticas = Smbolos terminales o tokens El lenguaje definido por una gramtica es el conjunto de cadenas de tokens derivadas a partir del smbolo inicial de la gramtica.
07/10/2013 10

Recordatorio de Trminos
Gramtica: Conjunto de reglas que determinan un un lenguaje. Sintxis.: Verifica que la secuencia de tokens sea vlida para un lenguaje. Tipos de gramtica. 1. Irrestricta. x y en donde x tiene por lo menos un elemento no terminal. 2. Contexto sensitivo o sensitiva al contexto. x y x <= y (en cuanto al nmero de elementos de y) y > 0 (no permite producciones con el elemento vacio) 3. Libre de contexto. x y x = 1 y es un elemento no terminal. y >= 0 Tipos de gramtica libre de contexto. Lineal izquierdo; Lineal derecho; Recursiva izquierdo ; Recursiva derecho y Recursiva central

Recordatorio de Trminos
Lineal izquierdo.: Es la derivacin en donde tan solo el no terminal de ms a la izquierda de cualquier forma de frase se sustituye a cada paso.
<S> <Y> x <Y> <Z> y <Z> <W> z <Z> <W> w
<S> <Y> <Z> <W> w z y x

Lineal derecha.: Es la derivacin en donde tan solo el no terminal de ms a la derecha de cualquier forma de frase se sustituye a cada paso.
<S> x <Y> <Y> y <Z> <Z> z <W> <Z> <W> w

wzyx

<S> x y z <Y> <Z> <W> w

xyzw

Recordatorio de Trminos
Recursiva izquierda: Es la derivacin en donde tan solo el no terminal de ms a la izquierda se sustituye a cada paso recursivamente es decir a si misma. <S> <S> <S> a | <S> d <S> a <S> <S> b a <S> <S> c <S> b <S> <S>
c

cbaa Recursivo derecho.: Es la derivacin en donde tan solo el no terminal de ms a la derecha se sustituye a cada paso recursivamente es decir a si misma. <X> <S> <X> <S> a <S> | d <S> <S> <S> b <S> a <S> <X> c
a

<S>

<S> c

aabc

Recordatorio de Trminos
Recursiva central.: Es la derivacin en donde tan solo el no terminal del centro se sustituye a cada paso recursivamente es decir a si misma. <X> <S> <X> <S> a b <S> <S> a <S> b c d <S> <S> c <S> d e <S> e acedb Ejemplos: Libre de contexto. <S> if <X> then <Y> <X> a <op> b <op> > | < <Y> x <opA> y <opA> =

x y

|x|=1 | Y | >= 0 Puede tener vacio

Recordatorio de Smbolos
Contexto sensitivo. <S> <X> <Y> xy <X> a <Z> y no permite vacio a<Z> b <W> <Y> d <W> c Irrestricta. <X> <A> <B> <A> a <B> b Sin restricciones.

Recordatorio de Trminos
Derivacin.: Consiste en sustituir los elementos no terminales por sus producciones. Ejemplo: <S> IF <X> then <Y> Se sustituye de izquierda a derecha <S> IF a <OP> b then <Y> <S> IF a<b then <Y> <S> IF a<b then x <OPA> y <S> IF a<b then x=y El resultado es solo con terminales Componentes de la gramtica. G={P, S, V, V} o bien G={P, S, T, N} En donde: P=producciones. S=produccin inicial; V=los elementos terminales V=los elementos no terminales

Derivaciones y Arbol de Anlisis Sintctico


El rbol sintctico o de derivacin es la representacin grfica de la derivacin de la cadena de tokens con la gramtica. Un rbol de anlisis sintctico se caracteriza por: El nodo raz est etiquetado con el smbolo inicial de la gramtica Cada hoja corresponde a un smbolo terminal o Cada nodo interior corresponde a un smbolo no terminal.

07/10/2013

17

Derivaciones y Arbol de Anlisis Sintctico


Si un nodo n tiene etiqueta A y son hijos del nodo n, ordenados de izquierda a derecha, los nodos con etiquetas X1,X2...Xk, entonces existe la produccin A X1X2...Xk En cada paso en una derivacin: Hay que elegir cual no terminal derivar para seleccionar la una produccin que lo tengan como antecedente. Las etiquetas de las hojas de izquierda a derecha forman la sentencia o frontera del rbol de derivacin.
07/10/2013 18

Derivaciones y Arbol de Anlisis Sintctico


Analizar la cadena de tokens id+id*id con la gramtica: E E A E | ( E ) | - E | id A+|-|*|/

Como se logro generar dicha cadena se dice que si cumple con las reglas sintcticas del lenguaje (gramtica).

07/10/2013

19

Derivaciones y Arbol de Anlisis Sintctico


Dada la gramtica: EXP EXP + EXP | EXP * EXP | EXP - EXP | EXP / EXP | EXP ^ EXP | - EXP | ( EXP ) | identificador | constante Analizar la expresin -(a*9)
07/10/2013 20

Derivaciones y rbol de Anlisis Sintctico


Existen dos tipos de derivaciones: Derivacin ms a la izquierda: siempre se deriva el no terminal ms a la izquierda en el rbol hasta leer un smbolo terminal. Derivacin ms a la derecha: siempre se deriva el no terminal ms a la derecha en el rbol hasta leer un smbolo terminal. Ejemplo: Sea la gramtica: SS+T|T 1,2 TT*F|F 3,4 F ( S ) | a | b 5,6,7 Construir los rboles sintcticos ms a la izquierda y ms a la derecha que reconocen la cadena: a*(a+b)
07/10/2013 21

Derivaciones y rbol de Anlisis Sintctico

Derivacin ms a la izquierda
07/10/2013 22

Derivaciones y rbol de Anlisis Sintctico

Derivacin mas a la derecha


07/10/2013 23

Gramticas Ambiguas
Una gramtica es ambigua si genera ms de un rbol sintctico para alguna cadena. Equivalente, existe ms de una derivacin por la derecha o por la izquierda de alguna cadena La ambigedad es mala Deja el significado de algunos programas indefinidos. No existe una metodologa para eliminarla la ambigedad y tampoco hay otra frmula para saber que una gramtica es ambigua. Las gramticas ambiguas se redisean para encontrar una gramtica no ambigua equivalente.
07/10/2013 24

Gramticas Ambiguas
Ejemplo: La gramtica G = ({E}, {id, num, +, *, (, )}, E, { EE+E | E*E | (E) | id | num}) es ambigua. La cadena num+num*num tiene dos rboles de derivacin.

07/10/2013

25

Gramticas Ambiguas
Caractersticas de las gramticas ambiguas

Gramticas con ciclos simples o menos simples SA|a AS Alguna regla con una forma EEE Un conjunto de reglas de forma parecida a: SA|B AB

Gramticas Ambiguas
Producciones recursivas en las que los no terminales no recursivos de la produccin puedan derivar a la cadena vaca: S HRS | s Hh| Rr| No terminales que puedan derivar a la cadena vaca y a la misma cadena de terminales, y que aparezcan juntas en el consecuente de una regla o en alguna forma sentencial: S HR Hh| Rr|h|

Gramticas Ambiguas
Ejemplo: Sea G = ({S, A}, {a}, S, P) donde: P = {SAA, AaSa, Aa} estudiar si es ambigua En algunos casos, la ambigedad de una gramtica se puede eliminar utilizando: Recursividad Asociatividad Precedencia Parentizacin
07/10/2013 28

Diseo de Gramticas para LP


Recursividad
Una produccin es recursiva a izquierda si es de la forma AA; es recursiva a la derecha si es de la forma AA.

07/10/2013

29

Diseo de Gramticas para LP


Recursividad
Ejemplo: Entero Digito | Entero Digito Digito 0 | 1 | | 9 Identificador Letra | Identificador Letra | Identificador Digito Letra a | b | | z

07/10/2013

30

Diseo de Gramticas para LP


La asociatividad de un operador por la izquierda, requiere que la produccin en la que interviene dicho operador debe ser recursiva por la izquierda La asociatividad por la derecha requiere que la produccin debe tener recursin por la derecha.
Se utiliza un smbolo no terminal por cada operador de distinta precedencia. Cuanto ms cerca est la produccin a la produccin del smbolo inicial, menor ser la precedencia del operador involucrado.
07/10/2013 31

Asociatividad

Precedencia

Diseo de Gramticas para LP


Ejemplo: Sea la gramtica: EE+T|E-T|T TT*F|T/F|F FP^F|P P-P|B B ( E ) | id | cte

Analizar la sentencia a*c+d^4


07/10/2013 32

Diseo de Gramticas para LP


Parentizacion
Los parntesis son operadores especiales de mxima precedencia. Se aade un smbolo no terminal que produzca expresiones entre parntesis y los operandos (nmeros, variables, etc.) a la mayor distancia posible del smbolo inicial. Ejemplo: EE+T|ET|T TT*F|T/F|F F ( E ) | num
07/10/2013 33

Mtodos de Anlisis Sintctico


Segn la forma como se construye el rbol de derivacin: Mtodos Descendentes: construyen el rbol de derivacin de la raz hacia las hojas utilizando la derivacin mas a la izquierda, es decir, a partir del smbolo inicial de la gramtica se busca generar la cadena de token.

Mtodos de Anlisis Sintctico


Mtodos Ascendentes: construyen el rbol de derivacin de las hojas hacia la raz utilizando la inversa de la derivacin mas a la derecha, es decir, a partir de la cadena de token se busca generar el smbolo inicial de la gramtica.

Mtodos de Anlisis Sintctico


Segn la forma en que procesan la cadena de entrada: Mtodos direccionales: procesan la cadena de entrada smbolos de izquierda a derecha.

Mtodos no-direccionales: acceden a cualquier lugar de la cadena de entrada para construir el rbol. Necesitan tener toda la cadena de componentes lxicos en memoria. Mas costosos, no se suelen implementar.

Mtodos de Anlisis Sintctico


Segn el numero de alternativas posibles en una derivacin: Mtodos deterministas: dado un smbolo de la cadena de entrada se puede decidir en cada paso cual es la alternativa/derivacin adecuada a aplicar, solo hay una posible. No se produce retroceso y el coste el lineal. Mtodos no-deterministas: en cada paso de la construccin del rbol se deben probar diferentes alternativas/derivaciones para ver cual es la adecuada, con el correspondiente aumento del costo

Mtodos de Anlisis Sintctico

07/10/2013

38

Manejo de Errores Sintcticos


Un error sintctico se produce cuando la secuencia de tokens recibidos del scanner no es generada por la gramtica del lenguaje. Ante un error sintctico, el Compilador deber: Indicar la posicin del error (archivo, lnea y carcter). Proporcionar un mensaje de error al programador. Reanudar el proceso de anlisis. Mecanismos de recuperacin de errores: Ignorar el problema (Modo Pnico) Recuperacin a nivel de frase Producciones de error
07/10/2013 39

Manejo de Errores Sintcticos


Modo Pnico
Consiste en solicitar tokens de la entrada hasta leer un token de sincronizacin previamente definido, asociado al smbolo del rbol que no se puede tratar. Normalmente dichos tokens estn ligados al fin de sentencia, de bloque o de programa. A partir de este punto se sigue analizando normalmente. Ejemplo: Sea el cdigo: aux = a[i] a[i]= a[j]; a[j]= aux;

07/10/2013

40

Manejo de Errores Sintcticos


Recuperacin a nivel de frase Consiste en realizar algn tipo de correccin local en la secuencia de tokens que permita continuar el anlisis. Su principal desventaja es la dificultad para corregir errores producidos realmente en un punto anterior a donde se detect el error. En el caso anterior, por ejemplo, podra haber sido lo suficientemente inteligente como para insertar el token ;.
07/10/2013 41

Manejo de Errores Sintcticos


Producciones de Errores
Consiste en agregar producciones adicionales en las que se incorporen los errores ms comunes, de manera que ante un error de ese tipo se consiga generar el rbol sintctico asociado.
En el caso anterior, se podra haber puesto algo como: sent_errnea sent_sin_acabar sent_acabada sent_acabada sent ; sent_sin_acabar sent
07/10/2013 42

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