• No se han encontrado resultados

Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1

N/A
N/A
Protected

Academic year: 2021

Share "Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1"

Copied!
39
0
0

Texto completo

(1)

Facultad de Ingeniería de Sistemas

Facultad de Ingeniería de Sistemas

Lenguajes y Compiladores

Análisis Sintáctico

Parte I

Teoría Lenguajes 1

Parte I

(2)

Introducción

Introducción

El analizador sintáctico recibe una secuencia de

tokens y decide si la secuencia está correcta o no.

Los analizadores más usados están basados en un

análisis que puede ser descendente o ascendente. Para realizar este análisis se deben construir los árboles sintácticos (derivación).

árboles sintácticos (derivación).

Dificultad: Búsqueda de la regla a aplicar, esto se

efectúa analizando la cadena de entrada de izquierda a derecha.

Los analizadores sintácticos más eficientes se basan

(3)

Introducción

Introducción

Los árboles sintácticos en la práctica son realmente

difíciles de construir porque ocuparían mucho espacio. Alternativamente se usan pilas.

En la Pila se guarda información sobre los nodos del

árbol sintáctico relevantes en cada fase del proceso.

Teoría Lenguajes

3

árbol sintáctico relevantes en cada fase del proceso.

Para el caso descendente: en la pila se guardan los

(4)

Análisis descendente

Análisis descendente

Se basa en gramáticas LL que evitan los bloqueos

mutuos.

Para evitar los bloqueos mutuos será necesario

cumplir con la siguiente regla:

Para producciones de la forma

A →→→→ αααα  αααα αααα . . . αααα A →→→ αααα→ 1  αααα2 αααα3 . . . ααααn

Siempre se debe poder escoger la alternativa correcta para la generación del árbol sintáctico.

Intuitivamente, para escoger la alternativa correcta necesitamos que todos los símbolos iniciales de los αi sean diferentes (Conjunto First/Primero).

(5)

Análisis Descendente

Análisis Descendente

Para aplicar los métodos de análisis descendente las

gramáticas deben cumplir dos condiciones:

No deben tener recursividad por la izquierda

Se debe conocer el conjunto First de cada no terminal

y deben cumplir las siguientes condiciones:

Teoría Lenguajes

5

y deben cumplir las siguientes condiciones:

» El conjunto First para un no terminal debe tener un terminal diferente para cada alternativa.

» El conjunto First de dos no terminales deben tener una intersección igual a ΦΦΦΦ.

(6)

Análisis Descendente Predictivo

Análisis Descendente Predictivo

Una forma eficiente de un analizador sintáctico

descendente sin retroceso es el denominado Analizador sintáctico predictivo.

Preliminar:

Dado un símbolo de entrada

a

y el no terminal A con

Dado un símbolo de entrada

a

y el no terminal A con

la siguiente producción:

A →→→ αααα→ 1  αααα2 αααα3 . . . ααααn

es necesario conocer la única alternativa que comienza con el símbolo a..

(7)

Análisis Descendente Predictivo

Análisis Descendente Predictivo

Ejemplo:

comando → if expresión then comando else comando

begin ListaComando end

repeat ListaComados until expresión

Cada alternativa tiene un inicio diferente que permite escoger la opción adecuada, es decir si tenemos el

Teoría Lenguajes

7

escoger la opción adecuada, es decir si tenemos el símbolo de entrada repeat debemos usar la tercera alternativa.

Existen los métodos:

Análisis descendente recursivo (análisis predictivo) Análisis predictivo no recursivo

(8)

Análisis descendente recursivo (ARD

)

Análisis descendente recursivo (ARD

)

Método descendente en el que se ejecuta un conjunto de

métodos recursivos para procesar la entrada.

A cada no terminal de la gramática se asocia un método. La secuencia de métodos llamados durante el

procesamiento de la entrada define implícitamente un procesamiento de la entrada define implícitamente un árbol de análisis sintáctico.

Adicionalmente se tiene:

» Un método de tratamiento de error

» Un método de lectura de un símbolo de entrada (léxico)

(9)

Análisis

descendente recursivo (ADR)

Análisis

descendente recursivo (ADR)

Para una gramática:

G = (T, N, P, S)

N = {S, N1, N2, N3}

En la siguiente diapositiva se muestra el esquema de

un analizador sintáctico descendente recursivo.

Teoría Lenguajes

9

un analizador sintáctico descendente recursivo.

En este esquema los métodos se muestran sin

parámetros pero considerando que en su mayoría son recursivos, normalmente requieren parámetros.

(10)

Esquema para ADR

Esquema para ADR

Programa Analizador sintáctico

Método Error Método Léxico Método S Método N1 Método N2 Método N2 Método N3 Inicio Léxico S Fin

(11)

Tareas de un ADR

Tareas de un ADR

Cada método de un analizador descendente recursivo realiza dos

tareas:

Decide la producción a usar analizando el símbolo de

entrada. Si el símbolo de entrada pertenece a First(N) entonces se usa la producción con lado derecho N.

Si hay un conflicto entre dos lados derechos entonces en esta gramática no se puede usar

Teoría Lenguajes

11

entonces en esta gramática no se puede usar el método descendente recursivo.

Usa una producción imitando el lado derecho:

»Un no terminal resulta en la llamada al método asociado

»Un terminal coincidente al símbolo de entrada hace que se lea el siguiente componente léxico.

(12)

Ejemplo de ADR

Ejemplo de ADR

Ejemplo de un analizador descendente recursivo.

Dada la siguiente gramática:

tiposimple

↑↑↑↑ id

array [ simple ] of tipo array [ simple ] of tipo

simpleinteger

char

num punto num

(13)

Ejemplo de ADR

Ejemplo de ADR

Metodo Empareja(t) si Entrada = t

entonces Lexico (Entrada) sino Error fmetodo Teoría Lenguajes 13 fmetodo Método Error

Escribir (‘Error de sintáxis’) fmetodo

(14)

Ejemplo de ADR

Ejemplo de ADR

Método Tipo

caso Entrada vale

‘integer’, ‘char’, ‘num’: simple

‘↑↑↑↑’: Empareja(‘↑↑↑↑’) Empareja(‘ id’)

‘array’: Empareja(‘array’) Empareja(‘[‘) ‘array’: Empareja(‘array’) Empareja(‘[‘)

simple

Empareja(‘]’) Empareja(‘of’)

tipo

otro: Error fmetodo

(15)

Ejemplo de ADR

Ejemplo de ADR

Método Simple

caso Entrada vale

‘integer’: Empareja( ‘integer’) ‘char’: Empareja(‘char’) ‘num’: Empareja(‘num’) Teoría Lenguajes 15 ‘num’: Empareja(‘num’) Empareja(‘punto‘) Empareja(‘num’) otro: Error fmetodo

(16)

Especificación de un ADR

Especificación de un ADR

Para especificar un ADR se deben tener en cuenta

algunas reglas.

Para tipo de producción se deberá crear un método

con una estructura diferente.

Es necesario verificar si la producción tiene:

Es necesario verificar si la producción tiene:

Varias alternativas Repetición

Opcionalidad

A seguir se presentan las estructuras de los métodos

(17)

Especificación de un ADR

Especificación de un ADR

Para producciones del tipo: A →→→→ αααα1  αααα2 αααα3 . . . ααααn

si Entrada en Primero(αααα1) entonces Métodoαααα1

sino si Entrada en Primero(αααα2) entonces Métodoαααα2 ....

sino si Entrada en Primero(ααααn) entonces Métodoααααn

Teoría Lenguajes

17 sino si Entrada en Primero(ααααn) entonces Métodoααααn

sino Error fsi

... fsi fsi

(18)

Especificación de un ADR

Especificación de un ADR

Para Producciones: A → α1 α2 α3 . . . αn Métodoαααα1 Métodoαααα2 Métodoαααα2 Métodoαααα3 ... Métodoααααn

(19)

Especificación de un ADR

Especificación de un ADR

Para Producciones: A → α1 A  ε

mientras Entrada en Primero(αααα1)

hacer Métodoαααα1 Teoría Lenguajes 19 Métodoαααα1 fmientras Para Producciones: A → α1 Métodoαααα1

(20)

Especificación de un ADR

Especificación de un ADR

Para Producciones: A → α1  ε si Entrada en Primero(αααα1) entonces Métodoαααα1 fsi Para Producciones: A → t t ∈ T*

Si Entrada = ‘t’ entonces Léxico sino Error

(21)

Uso de Diagramas de transición

Uso de Diagramas de transición

Se puede realizar un analizador sintáctico predictivo

usando diagramas de transiciones.

El comportamiento para estos diagramas de

transiciones es similar al diagrama usado en el léxico, cuando el símbolo usado para la transición es un

Teoría Lenguajes

21

cuando el símbolo usado para la transición es un símbolo terminal.

Tienen un comportamiento especial cuando la

(22)

Ejemplo de Diagrama de transición

Ejemplo de Diagrama de transición

Ejemplo:

tiposimple ↑↑↑↑ idarray [ simple] of tipo

simple 1 0 2 id 4 5 6 7 8 array [ simple ] of tipo 3 9

(23)

Diagrama de transición

Diagrama de transición

Características de un diagrama de transición para

analizadores sintácticos:

Existe un diagrama para cada no terminal

Las transiciones están determinadas por un token y no

por un símbolo del alfabeto

Teoría Lenguajes

23

por un símbolo del alfabeto

La transición usando un token cambia el estado del

autómata

La transición usando un no terminal A es una llamada

(24)

Creación de Diagramas de transición

Creación de Diagramas de transición

Eliminar la recursión por la izquierda

Para cada no terminal A:

Se crea un estado inicial y un estado final

Para cada producción A → X1 X2 X3 .... Xn se crea un

camino del estado inicial al estado final con las aristas camino del estado inicial al estado final con las aristas etiquetadas con X1, X2 , X3 , .... , Xn 0 1 3 4 n-1 X1 X2 X2 Xn n

...

(25)

Funcionamiento del Diagrama de transiciones

Funcionamiento del Diagrama de transiciones

Si e es terminal, entonces se cambia al estado t y se

En el diagrama t e s Teoría Lenguajes 25

Si e es terminal, entonces se cambia al estado t y se

continua con el siguiente símbolo de la entrada

Si e es un no terminal, el analizador se traslada al

estado inicial del diagrama asociado al no terminal e y no mueve la entrada. Cuando llega al estado final de e regresa al estado t.

(26)

Ejemplo de Diagrama de transiciones

Ejemplo de Diagrama de transiciones

Para la gramática E → T E’ E’ → + TE’ε T → FT’ T’ → *FT’ ε T’ → *FT’ ε F → ( E )  id

(27)

Ejemplo de Diagrama de transiciones

Ejemplo de Diagrama de transiciones

0 1 T E' 2

E

3 4 + T E' 5 6 Teoría Lenguajes 27 + T E' ε 7 8 F T' 9

T

(28)

Ejemplo de Diagrama de transiciones

Ejemplo de Diagrama de transiciones

10 11 * F

T'

12 13 T' ε 14 15 ( E

F

16 17 ) id

(29)

Análisis Predictivo no recursivo (APNR)

Análisis Predictivo no recursivo (APNR)

Es posible construir un analizador sintáctico

predictivo no recursivo (APNR) manteniendo una pila para no usar la recursividad.

Estos analizadores buscan la producción a usar

dentro de una tabla de análisis sintáctico.

Teoría Lenguajes

29

dentro de una tabla de análisis sintáctico.

También se conocen como analizadores sintácticos

dirigidos por tablas.

Un método descendente dirigido por tablas es el

(30)

Análisis Predictivo no recursivo (APNR

)

Análisis Predictivo no recursivo (APNR

)

a + b $

Salida

Entrada

Pila

Parser predictivo Tabla M para Parser $ Z Y X

Salida

Pila

(31)

Análisis Predictivo no recursivo (APNR

)

Análisis Predictivo no recursivo (APNR

)

$ es usado:

Como último carácter de entrada Como Fondo de la pila

Inicialmente en la pila está el símbolo inicial sobre el

$

Teoría Lenguajes

31

$

M es una matriz cuyo valor indica la producción a

usar, es decir

M[A, a] = Producción a usar con A no terminal y a terminal

(32)

Acciones del APNR

Acciones del APNR

Dependiendo del elemento de la entrada (a) y el

elemento que se encuentre en el tope de la pila (X), el analizador realizará una acción diferente:

Si X = a = $

entonces Fin de análisis sintáctico entonces Fin de análisis sintáctico

Si X = a ≠ $

entonces desempilar X y pedir otro token

Si X ∈ N y M[X, a] = X → Y1 Y2 …Ym , Yi ∈ (N ∪ T)

entonces Desempila X Empila Ym … Y2 Y1

(33)

Ejemplo de un APNR

Ejemplo de un APNR

Repetir si X en T entonces si X = a entonces Desempilar Léxico sino Error Teoría Lenguajes 33 sino Error sino si M[X, a] = X →→→→ Y1 Y2 …Ym , Yi entonces Desempila X

Empila Ym... EmpilaY2 EmpilaY1

sino Error hasta (X = $) y (a = $)

(34)

Gramáticas LL(1)

Gramáticas LL(1)

Son gramáticas con condiciones especiales que

permiten realizar un análisis sintáctico descendente no recursivo conocido con el nombre de parser LL(1).

L se examina la cadena de entrada de izquierda a

derecha derecha

L usa la derivación mas a la izquierda 1 sólo necesita un símbolo de la entrada

(35)

Parser LL(1)

Parser LL(1)

Para la siguiente gramática:

1. E → T E’ 2. T → F T' 3. F → ( E ) 4. F → a Teoría Lenguajes 35 4. F → a 5. E' → + T E’ 6. E' → ε 7. T' → * F T’ 8. T' → ε

(36)

Parser LL(1)

Parser LL(1)

Se tiene la matriz M (los números representan el

número asociado a la producción)

( a + * ) $ E 1 1 E 1 1 T 2 2 F 3 4 E' 5 6 6 T' 8 7 8 8

(37)

Parser LL(1)

Parser LL(1)

Pila Entrada Regla usada

E a+a*a M[E,a] = 1

TE' a+a*a M[T,a] = 2

FT'E' a+a*a M[F,a] = 4

Para procesar

a + a * a

la pila sería

Teoría Lenguajes

37

FT'E' a+a*a M[F,a] = 4

aT'E' a+a*a

T'E' +a*a M[T',+] = 8

E' + a*a M[E',+] = 5

+TE' +a *a

(38)

Parser LL(1)

Parser LL(1)

FT'E' a*a M[F,a] = 4

aT'E' a*a

T'E' *a M[T',*] = 7

Pila Entrada Regla usada

T'E' *a M[T',*] = 7 *FT'E' *a FT'E' a M[F,a] = 4 aT'E' a T'E' ε M[T',$] = 8 E' ε M[E',$] = 6 ε ε

(39)

Parser LL(1)

Parser LL(1)

Para construir la matriz M es necesario realizar el

cálculo de los :

Conjuntos First Conjuntos Follow

Este tipo de matrices sólo es posible definirla, sin

Teoría Lenguajes

39

Este tipo de matrices sólo es posible definirla, sin

Referencias

Documento similar

En el Modelo Relacional se puede usar el c´ alculo de predicados de primer orden (CPPO) porque una BDR siempre puede verse como una interpretaci´ on (I) de un lenguaje de primer

En el ejercicio #1 se puede observar que este método es muy inestable para esta ecuación, ya que el error entre el valor exacto y el valor obtenido por el método es de

Muy probablemente esto que decimos sobre la lectura y su sistema de representación simbólica podría decirse de otros sistemas de signos como los musicales, matemáticos,

Esta asignatura se sitúa, por tanto, en el nivel básico dentro del plan de formación de los grados en Ingeniería Informática y en Tecnologías de la Información y desarrolla

Anexo 1: Cuestionarios de diagnóstico aplicados en los centros escolares de Educación primaria: CEIP Pedro Antonio de Alarcón (Madrid-España) y la I.E.. 3.- Desde tu experiencia ¿Qué

; el error medio en la localización respecto al rango de los nodos, % ; el error máximo y medio promediado en las 40 iteraciones, Max-Error y Media-Error; la desviación típica

17. Sup´ongase que se dispone de un conjunto de k M´aquinas de Turing, de forma que cada una de ellas tiene su propio cabezal de lectura/escritura, su propio conjunto de estados y

Tadeo Jones traslada el engaño propio de la creación digital (que no es más que dígitos en formas y modos de representación reconocibles por el espectador con el fin de darle