Sunteți pe pagina 1din 38

ANLISIS SINTCTICO

Ing. de Computacin y Sistemas Autmatas y Compiladores Ing. Carlos Gaytn Toledo

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.

27/11/2012

Descripcin Funcional

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.
27/11/2012 4

Especificacin sintctica de los Lenguajes de Programacin


Ejemplo: Lst Sent | Lst ; Sent Sent id := Exp | if Exp then Sent | if Exp then Sent else Sent | begin Lst end Exp Exp = Exp | Exp <> Exp | Exp and Exp | Exp or Exp |(E) | id

Especificacin sintctica de los Lenguajes de Programacin


Ejemplo: Prg Dcl Sent Dcl Dcl ; Dcl | id : Tipo Tipo char | integer | string(num) Sent Sent ; Sent | id = Exp Exp Fac + Fac | id ( num : num ) Fac id | / id / Ejemplo: Prg Dcl ; Sent Dcl id : Tipo | Dcl ; Dcl Tipo pila ( num ) de TS | TS TS entero | real Sent apilar ( id , Exp ) | id = Exp | Sent ; Sent Exp desapilar ( id ) | cima ( id ) | id

Especificacin sintctica de los Lenguajes de Programacin


Notacin BNF (Backus-Naur-Form)
John Backus y Peter Naur inventaron un sistema de reglas para definir el lenguaje de programacin ALGOL 60. Esta notacin se utiliza para representar la gramtica libre de contexto de la gran mayora de los lenguajes de programacin. Una especificacin BNF es un conjunto de reglas de produccin, escritas como: Smbolos no terminales entre <> Sustitucin de por ::= Ejemplo: <sentenciafor>::=for<condicion><sentencia>
27/11/2012 7

Especificacin sintctica de los Lenguajes de Programacin


Notacin BNF (Backus-Naur-Form)
Ejemplo: gramtica de expresiones aritmticas <expresion> ::= <expresion> + <termino> | <expresion> - <termino> | <termino> <termino> ::= <termino> * <factor> | <termino> / <factor> | <factor> <factor> ::= a | b | c | ( <expresion> )
27/11/2012 8

Especificacin sintctica de los Lenguajes de Programacin


Notacin EBNF (Extended BNF)
Simplifica la notacin BNF mediante: Parntesis: ( ) para agrupar smbolos Llaves: { } para representar repeticiones { }* 0 ms veces { }+ 1 ms veces Corchetes: [ ] , representan una parte optativa (0 1 vez) Barra vertical: | separa alternativas en una produccin Los smbolos terminales se suelen representar entre comillas sencillas
27/11/2012 9

Especificacin sintctica de los Lenguajes de Programacin


Notacin EBNF (Extended BNF)
Ejemplo: La gramtica de expresiones aritmticas puede escribirse en EBNF: <expresion> ::= <termino> { ( + | - ) <termino> }* <termino> ::= <factor> { ( * | / ) <factor> }* <factor> ::= a | b | c | ( <expresion> )
No aparece la recursividad en la definicin de <expresion> y de <termino>

27/11/2012

10

Especificacin sintctica de los Lenguajes de Programacin


Diagramas Sintcticos
Representan en forma grfica las producciones EBNF Tcnica que fue introducida para describir la sintaxis de Pascal (Jensen y Wirth, 1985) En los diagramas sintcticos, los smbolos no terminales se representan mediante rectngulos Los smbolos terminales se representan por crculos Una palabra reconocida es un camino entre la entrada (izquierda) y la salida (derecha)
27/11/2012 11

Especificacin Sintctica de los Lenguajes de Programacin

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.

27/11/2012

13

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.
27/11/2012 14

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).
27/11/2012 15

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)
27/11/2012 16

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)
27/11/2012 17

Derivaciones y rbol de Anlisis Sintctico

Derivacin ms a la izquierda
27/11/2012 18

Derivaciones y rbol de Anlisis Sintctico

Derivacin mas a la derecha


27/11/2012 19

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.
27/11/2012 20

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.

27/11/2012

21

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
27/11/2012 24

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.

27/11/2012

25

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

27/11/2012

26

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.
27/11/2012 27

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


27/11/2012 28

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
27/11/2012 29

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

27/11/2012

34

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
27/11/2012 35

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;

27/11/2012

36

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 ;.
27/11/2012 37

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
27/11/2012 38

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