analisis sintactico

38
ANÁLISIS SINTÁCTICO Ing. de Computación y Sistemas Autómatas y Compiladores Ing. Carlos Gaytán Toledo

Upload: carlos-diego

Post on 05-Aug-2015

43 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ANALISIS SINTACTICO

ANÁLISIS SINTÁCTICO

Ing. de Computación y SistemasAutómatas y CompiladoresIng. Carlos Gaytán Toledo

Page 2: ANALISIS SINTACTICO

13/04/23 2

Descripción FuncionalEl analizador sintáctico o parser verifica que la secuencia de tokens que recibe del scanner, estén debidamente combinados de tal manera que pueda ser generada con la gramática libre de contexto que representa las reglas sintácticas del lenguaje.

Page 3: ANALISIS SINTACTICO

Descripción Funcional

Page 4: ANALISIS SINTACTICO

13/04/23 4

Especificación sintáctica de los Lenguajes de Programación

• La sintaxis de los lenguajes de programación se especifica mediante Gramáticas Libres de Contexto, que además son la base para los esquemas de traducción de la etapa de síntesis.

• Para cualquier gramática libre de contexto se puede construir un analizador sintáctico.

• Las producciones de la gramática libre de contexto obedecen al formato: P = { A→α / AN y α(NΣ)* } Donde:N = Símbolos no terminales o variables sintácticasΣ = Símbolos terminales o tokens

• El lenguaje definido por una gramática es el conjunto de cadenas de tokens derivadas a partir del símbolo inicial de la gramática.

Page 5: ANALISIS SINTACTICO

Especificación sintáctica de los Lenguajes de Programación

Ejemplo:Lst → Sent

| Lst ; SentSent → 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

Page 6: ANALISIS SINTACTICO

Especificación sintáctica de los Lenguajes de Programación

Ejemplo:Prg Dcl SentDcl Dcl ; Dcl | id : TipoTipo char | integer

| string(num) Sent Sent ; Sent | id = ExpExp Fac + Fac

| id ( num : num )Fac id

| / id /

Ejemplo:Prg Dcl ; SentDcl id : Tipo | Dcl ; Dcl Tipo pila ( num ) de TS | TSTS entero | realSent apilar ( id , Exp ) | id =

Exp | Sent ; Sent

Exp desapilar ( id ) | cima ( id ) | id

Page 7: ANALISIS SINTACTICO

13/04/23 7

Especificación sintáctica de los Lenguajes de Programación

Notación BNF (Backus-Naur-Form)• John Backus y Peter Naur inventaron un sistema de reglas

para definir el lenguaje de programación ALGOL 60. • Esta notación se utiliza para representar la gramática libre

de contexto de la gran mayoría de los lenguajes de programación.

• Una especificación BNF es un conjunto de reglas de producción, escritas como: – Símbolos no terminales entre <>– Sustitución de → por ::=– Ejemplo: <sentenciafor>::=for<condicion><sentencia>

Page 8: ANALISIS SINTACTICO

13/04/23 8

Especificación sintáctica de los Lenguajes de Programación

Notación BNF (Backus-Naur-Form)

• Ejemplo: gramática de expresiones aritméticas <expresion> ::= <expresion> + <termino>

| <expresion> - <termino> | <termino>

<termino> ::= <termino> * <factor> | <termino> / <factor> | <factor>

<factor> ::= a | b | c | ( <expresion> )

Page 9: ANALISIS SINTACTICO

13/04/23 9

Especificación sintáctica de los Lenguajes de Programación

Notación EBNF (“Extended BNF”)• Simplifica la notación BNF mediante:

– Paréntesis: ( ) para agrupar símbolos– Llaves: { } para representar repeticiones

• { }* 0 ó más veces• { }+ 1 ó más veces

– Corchetes: [ ] , representan una parte optativa (0 ó 1 vez)

– Barra vertical: | separa alternativas en una producción– Los símbolos terminales se suelen representar entre

comillas sencillas

Page 10: ANALISIS SINTACTICO

13/04/23 10

Especificación sintáctica de los Lenguajes de Programación

Notación EBNF (“Extended BNF”)• Ejemplo: La gramática de expresiones aritméticas puede

escribirse en EBNF:<expresion> ::= <termino> { ( ‘+’ | ’-’ ) <termino> }* <termino> ::= <factor> { ( ‘*’ | ’/’ ) <factor> }* <factor> ::= ‘a’ | ‘b’ | ‘c’ | ‘(‘ <expresion> ’)’

No aparece la recursividad en la definición de <expresion> y de <termino>

Page 11: ANALISIS SINTACTICO

13/04/23 11

Especificación sintáctica de los Lenguajes de Programación

Diagramas Sintácticos

• Representan en forma gráfica las producciones EBNF• Técnica que fue introducida para describir la sintaxis de

Pascal (Jensen y Wirth, 1985)• En los diagramas sintácticos, los símbolos no terminales

se representan mediante rectángulos• Los símbolos terminales se representan por círculos • Una palabra reconocida es un camino entre la entrada

(izquierda) y la salida (derecha)

Page 12: ANALISIS SINTACTICO

Especificación Sintáctica de los Lenguajes de Programación

Page 13: ANALISIS SINTACTICO

Derivaciones y Arbol de Análisis Sintáctico

• El Árbol sintáctico o de derivación es la representación gráfica de la derivación de la cadena de tokens con la gramática.

• Un árbol de análisis sintáctico se caracteriza por:– El nodo raíz está etiquetado con el símbolo inicial de la

gramática– Cada hoja corresponde a un símbolo terminal o – Cada nodo interior corresponde a un símbolo no terminal.

13/04/23 13

Page 14: ANALISIS SINTACTICO

Derivaciones y Arbol de Análisis Sintáctico

– 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 producción A →X1X2...Xk

• En cada paso en una derivación:– Hay que elegir cual no terminal derivar para

seleccionar la una producción que lo tengan como antecedente.

• Las etiquetas de las hojas de izquierda a derecha forman la sentencia o frontera del árbol de derivación.

13/04/23 14

Page 15: ANALISIS SINTACTICO

Derivaciones y Arbol de Análisis Sintáctico

• Analizar la cadena de tokens id+id*id con la gramática:E E A E | ( E ) | - E | idA + | - | * | /

• Como se logro generar dicha cadena se dice que si cumple con las reglas sintácticas del lenguaje (gramática).

13/04/23 15

Page 16: ANALISIS SINTACTICO

Derivaciones y Arbol de Análisis Sintáctico

• Dada la gramática:EXP EXP + EXP

| EXP * EXP | EXP - EXP | EXP / EXP | EXP ^ EXP | - EXP | ( EXP ) | identificador | constante

Analizar la expresión -(a*9)

13/04/23 16

Page 17: ANALISIS SINTACTICO

• Existen dos tipos de derivaciones:– Derivación más a la izquierda: siempre se deriva el no

terminal más a la izquierda en el árbol hasta leer un símbolo terminal.

– Derivación más a la derecha: siempre se deriva el no terminal más a la derecha en el árbol hasta leer un símbolo terminal.

• Ejemplo: Sea la gramática:S S + T | T 1,2T T * F | F 3,4F ( S ) | a | b 5,6,7Construir los árboles sintácticos más a la izquierda y más a la derecha que reconocen la cadena: a*(a+b)

13/04/23 17

Derivaciones y Árbol de Análisis Sintáctico

Page 18: ANALISIS SINTACTICO

Derivaciones y Árbol de Análisis Sintáctico

13/04/23 18

Derivación más a la izquierda

Page 19: ANALISIS SINTACTICO

Derivaciones y Árbol de Análisis Sintáctico

13/04/23 19

Derivación mas a la derecha

Page 20: ANALISIS SINTACTICO

Gramáticas Ambiguas• Una gramática es ambigua si genera más de un árbol

sintáctico para alguna cadena.– Equivalente, existe más de una derivación por la

derecha o por la izquierda de alguna cadena • La ambigüedad es mala

– Deja el significado de algunos programas indefinidos.• No existe una metodología para eliminarla la

ambigüedad y tampoco hay otra fórmula para saber que una gramática es ambigua.

• Las gramáticas ambiguas se rediseñan para encontrar una gramática no ambigua equivalente.

13/04/23 20

Page 21: ANALISIS SINTACTICO

Gramáticas Ambiguas

Ejemplo: La gramática G = ({E}, {id, num, +, *, (, )}, E, { E→E+E | E*E | (E) | id | num}) es ambigua. La cadena num+num*num tiene dos árboles de derivación.

13/04/23 21

Page 22: ANALISIS SINTACTICO

Gramáticas Ambiguas

Características de las gramáticas ambiguas

• Gramáticas con ciclos simples o menos simplesS A | aA S

• Alguna regla con una formaE E … E

• Un conjunto de reglas de forma parecida a:S A | BA B

Page 23: ANALISIS SINTACTICO

Gramáticas Ambiguas• Producciones recursivas en las que los no terminales no

recursivos de la producción puedan derivar a la cadena vacía:S HRS | sH h | R r |

• No terminales que puedan derivar a la cadena vacía y a la misma cadena de terminales, y que aparezcan juntas en el consecuente de una regla o en alguna forma sentencial:

S HRH h | R r | h |

Page 24: ANALISIS SINTACTICO

Gramáticas Ambiguas• Ejemplo: Sea G = ({S, A}, {a}, S, P) donde:

P = {SAA, AaSa, Aa} estudiar si es ambigua

• En algunos casos, la ambigüedad de una gramática se puede eliminar utilizando:– Recursividad– Asociatividad– Precedencia– Parentización

13/04/23 24

Page 25: ANALISIS SINTACTICO

13/04/23 25

Diseño de Gramáticas para LPRecursividad

Una producción es recursiva a izquierda si es de la forma AA; es recursiva a la derecha si es de la forma AA.

Page 26: ANALISIS SINTACTICO

13/04/23 26

Diseño de Gramáticas para LPRecursividad

• Ejemplo:Entero Digito | Entero DigitoDigito 0 | 1 | … | 9 Identificador Letra

| Identificador Letra | Identificador Digito

Letra a | b | … | z

Page 27: ANALISIS SINTACTICO

13/04/23 27

Diseño de Gramáticas para LPAsociatividad

• La asociatividad de un operador por la izquierda, requiere que la producción en la que interviene dicho operador debe ser recursiva por la izquierda

• La asociatividad por la derecha requiere que la producción debe tener recursión por la derecha.

Precedencia• Se utiliza un símbolo no terminal por cada operador de

distinta precedencia.• Cuanto más “cerca” esté la producción a la producción

del símbolo inicial, menor será la precedencia del operador involucrado.

Page 28: ANALISIS SINTACTICO

13/04/23 28

Diseño de Gramáticas para LP• Ejemplo: Sea la

gramática: E E + T | E - T | TT T * F | T / F | FF P ^ F | PP - P | BB ( E ) | id | cte

• Analizar la sentencia a*c+d^4

Page 29: ANALISIS SINTACTICO

13/04/23 29

Diseño de Gramáticas para LPParentizacion

• Los paréntesis son operadores especiales de máxima precedencia.

• Se añade un símbolo no terminal que produzca expresiones entre paréntesis y los operandos (números, variables, etc.) a la mayor distancia posible del símbolo inicial.

• Ejemplo:E E + T | E – T | TT T * F | T / F | FF ( E ) | num

Page 30: ANALISIS SINTACTICO

Métodos de Análisis Sintáctico

• Según la forma como se construye el Árbol de derivación:– Métodos Descendentes: construyen el árbol de derivación

de la raíz hacia las hojas utilizando la derivación mas a la izquierda, es decir, a partir del símbolo inicial de la gramática se busca generar la cadena de token.

Page 31: ANALISIS SINTACTICO

Métodos de Análisis Sintáctico– Métodos Ascendentes: construyen el árbol de derivación

de las hojas hacia la raíz utilizando la inversa de la derivación mas a la derecha, es decir, a partir de la cadena de token se busca generar el símbolo inicial de la gramática.

Page 32: ANALISIS SINTACTICO

Métodos de Análisis Sintáctico

• Según la forma en que procesan la cadena de entrada:– Métodos direccionales: procesan la cadena de

entrada símbolos de izquierda a derecha.

– Métodos no-direccionales: acceden a cualquier lugar de la cadena de entrada para construir el árbol. Necesitan tener toda la cadena de componentes léxicos en memoria. Mas costosos, no se suelen implementar.

Page 33: ANALISIS SINTACTICO

Métodos de Análisis Sintáctico

• Según el numero de alternativas posibles en una derivación:– Métodos deterministas: dado un símbolo de la

cadena de entrada se puede decidir en cada paso cual es la alternativa/derivación adecuada a aplicar, solo hay una posible. No se produce retroceso y el coste el lineal.

– Métodos no-deterministas: en cada paso de la construcción del árbol se deben probar diferentes alternativas/derivaciones para ver cual es la adecuada, con el correspondiente aumento del costo

Page 34: ANALISIS SINTACTICO

Métodos de Análisis Sintáctico

13/04/23 34

Page 35: ANALISIS SINTACTICO

13/04/23 35

Manejo de Errores Sintácticos• Un error sintáctico se produce cuando la secuencia de

tokens recibidos del scanner no es generada por la gramática del lenguaje.

• Ante un error sintáctico, el Compilador deberá:– Indicar la posición del error (archivo, línea y carácter).– Proporcionar un mensaje de error al programador. – Reanudar el proceso de análisis.

• Mecanismos de recuperación de errores:– Ignorar el problema (Modo Pánico)– Recuperación a nivel de frase – Producciones de error

Page 36: ANALISIS SINTACTICO

13/04/23 36

Manejo de Errores SintácticosModo Pánico

• Consiste en solicitar tokens de la entrada hasta leer un token de sincronización previamente definido, asociado al símbolo del árbol que no se puede tratar.

• Normalmente dichos tokens están ligados al fin de sentencia, de bloque o de programa. A partir de este punto se sigue analizando normalmente.

• Ejemplo: Sea el código: aux = a[i] a[i]= a[j]; a[j]= aux;

Page 37: ANALISIS SINTACTICO

13/04/23 37

Manejo de Errores SintácticosRecuperación a nivel de frase

• Consiste en realizar algún tipo de corrección local en la secuencia de tokens que permita continuar el análisis.

• 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, podría haber sido lo suficientemente inteligente como para insertar el token ‘;’.

Page 38: ANALISIS SINTACTICO

13/04/23 38

Manejo de Errores SintácticosProducciones de Errores

• Consiste en agregar producciones adicionales en las que se incorporen los errores más comunes, de manera que ante un error de ese tipo se consiga generar el árbol sintáctico asociado.

• En el caso anterior, se podría haber puesto algo como:sent_errónea sent_sin_acabar sent_acabadasent_acabada sent ;sent_sin_acabar sent