análisis sintáctico - ulpgc.es · 4 1. introducción construcción del analizador sintáctico...

79
1 Análisis sintáctico

Upload: ngotuong

Post on 20-Oct-2018

230 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

1

Análisis sintáctico

Page 2: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

2

Análisis sintáctico

1. Introducción2. Análisis descendente (top-down)

2.1 Análisis con backtracking2.2 Análisis predictivo

2.2.1 Método recursivo2.2.2 Método iterativo

3. Análisis ascendente3.1 LR parsing (bottom-up)

3.1.1 SLR3.1.2 LR canónico3.1.3 LALR

3.2 YACC (parser generator)

Page 3: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

3

1. Introducción

Objetivo del análisis sintáctico:

Conocer si la sentencia que se analiza pertenece, o no, al lenguaje (no se tiene en cuenta el aspecto semántico).

Relación entre análisis léxico y sintáctico

ProgramaFuente

AnalizadorLéxico

AnalizadorSintáctico

(1)

(2)

(1) ¿ next token ?

(2) token

Page 4: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

4

1. Introducción

Construcción del analizador sintáctico (parser)

Lenguaje

By hand

Tool

Gramática PARSER

Page 5: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

5

1. Gramáticas y tipos de análisis

Nos centraremos en las gramáticas libres de contexto:

(context-free grammars) (tipo 2 según Chomsky)

Métodos de análisis sintáctico:

A) Reconocedores universalesB) Reconocedores “top-down”C) Reconocedores “bottom-up”

Page 6: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

6

1. Métodos de reconocimiento

A) Universales

Ventaja: son válidos para cualquier gramática libre de contexto.

Desventaja: su excesiva generalidad no permite que los reconocedores estén muy optimizados (son muy lentos)

Page 7: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

7

1. Métodos de reconocimiento

B) Métodos top-down

Ventaja: reconocedores muy rápidos

Desventaja: válidos para gramáticas LL(k)

C) Métodos bottom-up

Desventaja: los reconocedores son rápidos (pero no tanto como los reconocedores top-down)

Ventaja: válidos para gramáticas SLR(k), LRc(k), LALR(k), que son un superconjunto de las gramáticas LL(k)

Page 8: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

8

2. Análisis descendente (top-down)

Fundamento básico:

Generación de la sentencia mediante laleft-most derivation

EXPR EXPR ‘+’ TERM | TERMTERM TERM ‘*’ FACT | FACTFACT id | cte | ‘(‘ EXPR ‘)’

Page 9: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

9

2. Análisis descendente (top-down)

EXPR

a + b * ( c + 2 )

Page 10: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

10

2.1 Análisis con backtracking

EXPR

TERM

EXPR

TERMEXPR

TERM+

+

a + b * c + 2

FACT

FACT

( )id id

NO HAY MATCH-ING

Page 11: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

11

2.1 Análisis con backtracking

Ventajas

Política sencilla de prueba y error.

Desventajas

Para gramáticas de un tamaño normal no resulta aplicable debido al excesivo tiempo de computación.

La aplicación del método no garantiza que la gramática no sea ambigua.

Page 12: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

12

2.2 Análisis predictivo

EXPR

¿ podemos decidir en función de un símbolo de lookahead ?

a + b * ( c + 2 )

símbolo de lookahead

Page 13: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

13

Concepto de PRIMEROS

Notación PRIMEROS (símbolo/cadena) = P(símbolo/cadena)

P(a) = { a } a Є Vt

P(N) = P(α1) U P(α2) U P(αn) N Є VnN α1 | α2 | … | αn

Si ε Є P(αi) entonces hay que añadir los SIGUIENTES(N) al conjunto de P(N)

Page 14: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

14

Condiciones necesaria y suficiente para predecir

N Є VnN α1 | α2 | … | αn

1. P(αi) ∩ P(αj) = Ø Para todo i ≠ j

2. Si ε Є P(αi) debe cumplirse que:

S(N) ∩ P(αj) = Ø Para todo j ≠ iS(N) = SIGUIENTES(N)

Page 15: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

15

Ejemplo

EXPR EXPR ‘+’ TERM | TERMTERM TERM ‘*’ FACT | FACTFACT id | cte | ‘(‘ EXPR ‘)’

P(EXPR)= P(EXPR) U P(TERM) = { id , cte , ( }P(TERM)= P(TERM) U P(FACT) = { id , cte , ( }P(FACT)= { id , cte , ( }

No podemos realizar análisis sintáctico mediante el método de descenso (top-down) predictivo.

Page 16: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

16

Recursividad por la izquierda

Toda gramática recursiva por la izquierda no es válida para reconocimiento por descenso predictivo.

N N α | β Primer símbolo (β) ≠ N

P(N)= P(N) U P(β) P(Nα) ∩ P(β) ≠ Ø

Por tanto, no podemos discernir entre las dos opciones de la regla N la hora de realizar un descenso predictivo.

Page 17: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

17

Eliminación de la recursividad por la izquierda

L L α1 | L α2 | … | L αn | β1 | β2 | … | βp

Podemos generar las mismas cadenas de la siguiente forma:

L C RC β1 | β2 | … | βpR α1 R | α2 R | … | αn R | ε

Page 18: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

18

Ejemplo

G: EXPR EXPR ‘+’ TERM | TERMTERM TERM ‘*’ FACT | FACTFACT id | cte | ‘(‘ EXPR ‘)’

G’: EXPR TERM REXPRREXPR ‘+’ TERM REXPR | εTERM FACT RTERMRTERM ‘*’ FACT RTERM | εFACT id | cte | ‘(‘ EXPR ‘)’

Page 19: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

19

Calculamos PRIMEROS para G’

P(EXPR) = P(TERM) = { id , cte , ( }

P(REXPR) = { + , ε }Añadimos los S(REXPR) = { $ , ) }

P(TERM) = P(FACT) = { id , cte , ( }

P(RTERM) = { * , ε }Añadimos los S(RTERM) = { + , $ , ) }

P(FACT) = { id , cte , ( }

Por tanto, podemos realizar un reconocedor descendente predictivo para la gramática G’.

Page 20: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

20

Factorización

EXPR TERM ‘+’ EXPR | TERMTERM FACTOR ‘*’ TERM | FACTORFACTOR id | cte | ‘(‘ EXPR ‘)’

En este caso tenemos una gramática para expresiones que es recursiva por la derecha.

Sin embargo, no podemos utilizar un reconocedor descendente predictivo porque existen reglas cuyas opciones tienen el mismo encabezado.

SOLUCIÓN Factorizar dichas reglas

Page 21: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

21

Factorización

EXPR TERM REXPRREXPR ‘+’ EXPR | εTERM FACTOR RTERMRTERM ‘*’ TERM | εFACTOR id | cte | ‘(‘ EXPR ‘)’

Si realizamos el cálculo de los PRIMEROS para esta gramática modificada tenemos lo siguiente:

Page 22: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

22

Cálculo de PRIMEROS

P(EXPR) = P(TERM) = { id , cte , ( }

P(REXPR) = { + , ε }Añadimos los S(REXPR) = { ) , $ }

P(TERM) = P(FACTOR) = { id , cte , ( }

P(RTERM) = { * , ε }Añadimos los S(RTERM) = { + , ) , $ }

P(FACTOR) = { id , cte , ( }

Luego, si podemos utilizar un reconocedor descendente predictivo

Page 23: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

23

Implementación

Reconocedores descendentes predictivos

2.2.1 Implementación recursiva2.2.1 Implementación iterativa

Page 24: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

24

2.2.1 Implementación recursiva

PROCEDIMIENTO DE CONSTRUCCIÓN

1. Para cada regla (símbolo no terminal) debe construirse un procedimiento sin parámetros cuyo nombre será el del propio símbolo no terminal.

2. En función de los PRIMEROS, cada procedimiento implementa las diversas alternativas de su regla

3. Cada alternativa de una regla se implementa de la siguiente forma:

Page 25: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

25

2.2.1 Implementación recursiva

3.1 Un símbolo no terminal se implementa mediante una llamada al procedimiento de dicho símbolo.

3.2 Un símbolo terminal se implementa comprobando que el símbolo de lookahead actual se corresponde con el símbolo terminal. Caso de ser cierto, el analizador léxico debe localizar el siguiente símbolo de lookahead. En caso contrario, detenemos el proceso de análisis porque existe un error sintáctico.

Page 26: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

26

Ejemplo

Utilizaremos como ejemplo la gramática de expresiones que hemos factorizado anteriormente.

EXPR TERM REXPRREXPR ‘+’ EXPR | εTERM FACTOR RTERMRTERM ‘*’ TERM | εFACTOR id | cte | ‘(‘ EXPR ‘)’

Construyamos los procedimientos para los dos primeros símbolos no terminales: EXPR y REXPR

Page 27: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

27

Procedimiento EXPR (versión 1)

EXPR ( ){ TERM ( );

REXPR ( );}

Esta primera versión no utiliza los PRIMEROS puesto que no existen diversas alternativas en la regla.

Sin embargo, se puede realizar una detección precoz de errores si añadimos al control de la única alternativa de esta regla el conocimiento de los PRIMEROS:

Page 28: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

28

Procedimiento EXPR (versión 2)

EXPR ( ){

if ( lookahead = { id , cte , ( } ){ TERM ( );

REXPR ( );}else

error ( );}

Page 29: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

29

Procedimiento REXPR

REXPR ( ){

if (lookahead = { + } ) / alternativa 1{ lookahead = yylex ( ); / matching del símbolo ‘+’

EXPR ( );return ( );

}if (lookahead = { ) , $ } ) / alternativa 2

return ( );

error ( ); / ninguna alternativa es válida}

Page 30: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

30

2.2.2 Implementación iterativa

Se trata de construir un programa que desarrolle el proceso de análisis sintáctico descendente predictivobasándose en una tabla de reconocimiento.

El programa lleva a cabo el reconocimiento de la misma forma que lo hemos desarrollado manualmente.

La tabla para la gramática utilizada en la implementación recursiva es la siguiente:

Page 31: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

31

2.2.2 Implementación iterativa

( EXPR )idcteFACTOR

εε* TERMεRTERM

FACTOR RTERM

FACTOR RTERM

FACTOR RTERM

TERM

εε+ EXPRREXPR

TERM REXPR

TERM REXPR

TERM REXPR

EXPR

$)(*+idcte

Page 32: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

32

Gramáticas LL(k)

Toda gramática a la que se puede aplicar un reconocedor descendente predictivo pertenece a un conjunto de gramáticas denominado LL(k), siendo K el número de símbolos de lookaheadque se utilizan.

El conjunto LL(k) es un subconjunto del total de gramáticas libres de contexto. Por tanto, existen muchas gramáticas libres de contexto que no pueden ser analizadas mediante reconocedores descendentes predictivos.

Page 33: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

33

3. ANÁLISIS ASCENDENTE

3.1 LR parsing (bottom-up)3.1.1 SLR3.1.2 LR canónico3.1.3 LALR

3.2 YACC (parser generator)

Page 34: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

34

3.1 LR parsing

FUNDAMENTOS

1. Bottom-Up (frente a top-down)

2. Utiliza la derivación más a la derecha(right-most derivation) (frente a left-most derivation)

Siglas LR:L Left to right scanningR Right-most derivation

Page 35: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

35

Ejemplo

S a A B eA A b c | bB d

Usemos derivaciones right-most:

S aABe aAde aAbcde abbcde

Page 36: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

36

¿ Por qué no se elige derivación a izquierdas ?

S A B CA M NB O PC Q RM m ¿Qué sucede al realizar el análisis bottom-up ?N nO oP pQ qR r

S ABC MNBC mNBC mnBC mnOPC mnoPC mnopC

mnopQR mnopqR mnopqr

Page 37: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

37

Implementación basada en una PILA

S a A B eA A b c | bB d

S aABe aAde aAbcde abbcde

PILA + acciones SHIFT + acciones REDUCE

Page 38: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

38

PILA + SHIFT + REDUCE

PILA CADENA ACCIONESabbcde$ shift

a bbcde$ shiftab bcde$ reduce A baA bcde$ shiftaAb cde$ shiftaAbc de$ reduce A AbcaA de$ shiftaAd e$ reduce B daAB e$ shiftaABe $ reduce S aABeS $ ACEPTADA

Page 39: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

39

Modelo general de reconocedor LR

...t1 t2 t3 t i tn $

C A D E N A

S 0

V m

S m

V m - 1

S m -1

...V 1

PI L A

S i E sta d o s d e l reco n o ced o rV i S ím b o lo d e l v o ca b u la r io (term in a l o n o term in a l)

R eco n o ced o r L R

a cc io n es g o toTA B L A(g en era d a a p a rtir d e lag ra m á t ica )

...

SA L ID A(có d ig o ej ecu ta do a lred uc ir la s reg la s )

Page 40: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

40

Ejemplo

Dada la siguiente gramática para expresiones:

1) E E ‘+’ T2) E T3) T T ‘*’ F4) T F5) F ‘(‘ E ‘)’6) F id

La tabla de reconocimiento LR es la siguiente:

Page 41: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

41

Tabla de reconocimiento

R3R3R3R310

R5R5R5R511

R1R1S7R19

S11S68

10S4S57

39S4S56

R6R6R6R65

328S4S54

R4R4R4R43

R2R2S7R22

O.K.S61

321S4S50

FTE$)(*+id

GOTOACCIONESEstado

Page 42: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

42

Construcción de las tablas

Las tablas que utiliza un reconocedor LR se generan a partir del correspondiente autómata LR.

Veamos el autómata para la siguiente gramática:

S a A B eA A b c | bB d

Page 43: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

43

Autómata SLR (Simple LR)

S’ --> ^ S

S --> ^ aABe

S’ --> S ^

S --> a^ABe

A --> ^Abc A --> ^b

S --> aA^Be A --> A^bc

B --> ^d

S0

S1

S2

S3

SS1

a S2

A S3

b S4

B

b

d

S5

S6

S7

A --> b^

S --> aAB^e

A --> Ab^c

B --> d^

S --> aABe^

A --> Abc^

S4

S5

S6

S7

S8

S9

S8

S9

e

c

Page 44: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

44

Autómata: reconocedor de prefijos válidos

S a A B eA A b c | bB d

S ] aABe ] aAd ] e aAbc ] de ab ] bcde

Prefijos = { S , a , aA , aAB , aABe , aAd , aAb, aAbc , ab }

Page 45: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

45

Construcción de la tabla de reconocimiento

Necesitamos conocer:

1. El autómata correspondiente

2. Los SIGUIENTES de cada símbolo no-terminal

En el ejemplo que nos ocupa, los SIGUIENTES son:

SIGUIENTES (S) = { $ }SIGUIENTES (A) = { d , b }SIGUIENTES (B) = { e }

Page 46: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

46

Tabla de reconocimiento

R2R2S9

R1S8

R4S7

S9S6

S8S5

R3R3S4

5S7S6S3

3S4S2

O.K.S11S2S0

BAS$edcba

GotoAccionesEstado

Page 47: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

47

Ejercicio

1) E E ‘+’ T2) E T3) T T ‘*’ F4) T F5) F ‘(‘ E ‘)’6) F id

a) Obtener el autómata SLR y la tabla de reconocimientob) Reconocer la cadena: id + id * ( id + id )

Page 48: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

48

Ejercicio: estados del autómata SLR

S0:E’ ^ E S4:F ( ^ E ) S7:T T * ^ FE ^ E + T E ^ E + T F ^ (E)E ^ T E ^ T F ^ idT ^ T * F T ^ T * FT ^ F T ^ F S8:F ( E ^ )F ^ (E) F ^ (E) E E ^ + T F ^ id F ^ id

S9:E E + T ^S1:E’ E ^ S5:F id ^ T T ^ * F

E E ^ + TS6:E E + ^ T S10: T T * F ^

S2:E T ^ T ^ T * FT T ^ * F T ^ F S11: F (E) ^

F ^ (E)S3:T F ^ F ^ id

Page 49: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

49

Ejercicio: transiciones del autómata SLR

S10S3S3S3F

S9S2S2T

S8S1E

S11)

S4S4S4S4(

S7S7*

S6S6+

S5S5S5S5id

S11S10S9S8S7S6S5S4S3S2S1S0

Page 50: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

50

Ejercicio: tabla de reconocimiento SLR

R3R3R3R310

R5R5R5R511

R1R1S7R19

S11S68

10S4S57

39S4S56

R6R6R6R65

328S4S54

R4R4R4R43

R2R2S7R22

O.K.S61

321S4S50

FTE$)(*+id

GOTOACCIONESEstado

Page 51: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

51

Ejercicio: reconocer la cadena id + id * ( id + id )

Se deja como ejercicio

Page 52: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

52

3. ANÁLISIS ASCENDENTE

3.1 LR parsing (bottom-up)3.1.1 SLR3.1.2 LR canónico3.1.3 LALR

3.2 YACC (parser generator)

Page 53: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

53

3.1.1 Límites de los reconocedores SLR

Supongamos la siguiente gramática:

1) S L = R2) S R3) L * R4) L id5) R L

¿ Es reconocible mediante reconocimiento SLR ?

Page 54: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

54

Estados del autómata SLR

S0: S’ ^ S S5: L id ^S ^ L = RS ^ R S6: S L = ^ RL ^ * R R ^ LL ^ id L ^ * RR ^ L L ^ id

S1: S’ S ^ S7: L * R ^

S2: S L ^ = R S8: R L ^R L ^

S9: S L = R ^ S3: S R ^

S4: L * ^ RR ^ LL ^ * RL ^ id

Page 55: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

55

Transiciones del autómata SLR

S9S7S3R

S8S8S2L

S1S

S4S4S4*

S6=

S5S5S5id

S9S8S7S6S5S4S3S2S1S0

Page 56: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

56

Tabla de reconocimiento SLR

R1S9

R5R5S8

R3R3S7

98S4S5S6

R4R4S5

78S4S5S4

R2S3

R5S6 / R5S2

O.K.S1

321S4S5S0

RLS$*=id

GOTOACCIONESESTADO

Page 57: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

57

Conclusiones

Existe una casilla de la tabla de reconocimiento (S2,=) que tiene 2 acciones:

S6 : shift 6

R5 : reduce 5

Por tanto, existe un conflicto SHIFT-REDUCE y la gramática no se puede reconocer mediante un reconocedor SLR.

Page 58: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

58

Tipos de conflictos y ambigüedad

Los conflictos que pueden darse en los reconocedores ascendentesson los siguientes:

1. SHITF-REDUCE2. REDUCE-REDUCE

Toda gramática ambigua genera uno o varios conflictos en los reconocedores ascendentes.

La aparición de conflictos no significa necesariamente que la gramática sea ambigua (de hecho, la gramática del ejemplo anterior no es ambigua y había un conflicto) .

Page 59: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

59

Gramática no ambigua que genera conflictos

1) S L = R2) S R3) L * R4) L id5) R L

¿ Porqué esta gramática no ambigua genera conflictos ?

El reconocedor SLR no contiene la suficiente información sobre la gramática. Se hace necesario utilizar reconocedores LR más precisos.

Page 60: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

60

3.1.2 Reconocedores LR canónicos

S0:S’ ^ S { $ } S4: L * ^ R { = }S ^ L = R { $ } R ^ L { = }S ^ R { $ } L ^ * R { = }L ^ * R { = } L ^ id { = }L ^ id { = }R ^ L { $ } S5: L id ^ { = }

S1:S’ S ^ { $ } S6: S L = ^ R { $ }R ^ L { $ }

S2:S L ^ = R { $ } L ^ * R { $ }R L ^ { $ } L ^ id { $ }

S3:S R ^ { $ } S7: L * R ^ { = }

Page 61: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

61

3.1.2 Reconocedores LR canónicos

S8: R L ^ { = }

S9: S L = R ^ { $ }

S10: R L ^ { $ }

S11: L * ^ R { $ }R ^ L { $ }L ^ * R { $ }L ^ id { $ }

S12: L id ^ { $ }

S13: L * R ^ { $ }

Page 62: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

62

Tabla de transiciones

S13S9S7S3R

S10S10S8S2L

S1S

S11S11S4S4*

S6=

S12S12S5S5id

S13S12S11S10S9S8S7S6S5S4S3S2S1S0

Page 63: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

63

Tabla de reconocimiento LR canónico

13973R

101082L

1SGOTO

R3R4R5R1R2R5O.K.$

S11S11S4S4*

R5R3R4S6=

S12S12S5S5idACCIONES

S13S12S11S10S9S8S7S6S5S4S3S2S1S0Estados

Page 64: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

64

Conclusiones

No aparece ningún conflicto.

Por tanto, no era un problema de ambigüedad de la gramática, sino que el reconocedor SLR no era tan preciso como el reconocedor LR canónico.

En particular, la reducción de una regla N …. se realiza ante todos los SIGUIENTES(N) en SLR.

Por el contrario, la reducción de una regla N …. se realiza ante un subconjunto de los SIGUIENTES(N) en el reconocedor LR canónico.

Page 65: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

65

Ejercicio

Dada la siguiente gramática:

1. S CC2. C cC3. C d

Se pide:

1. Autómata de reconocimiento LR canónico

2. Tabla de reconocimiento correspondiente

Page 66: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

66

Estados del autómata LR canónico

S0:S’ ^ S { $ } S4: C d ^ { c , d }S ^ CC { $ }C ^ cC { c , d } S5: S CC ^ { $ }C ^ d { c , d }

S6: C c ^ C { $ }S1:S’ S ^ { $ } C ^ cC { $ }

C ^ d { $ }S2:S C ^ C { $ }

C ^ cC { $ } S7: C d ^ { $ }C ^ d { $ }

S8: C cC ^ { c , d }S3:C c ^ C { c , d }

C ^ cC { c , d } S9: C cC ^ { $ }C ^ d { c , d }

Page 67: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

67

Transiciones del autómata LR canónico

S9S8S5S2C

S1S

S7S4S7S4d

S6S3S6S3c

S9S8S7S6S5S4S3S2S1S0

Page 68: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

68

Tabla de reconocimiento

R2S9

R2R2S8

R3S7

9S7S6S6

R1S5

R3R3S4

8S4S3S3

5S7S6S2

O.K.S1

21S4S3S0

CS$dc

GOTOACCIONESEstados

Page 69: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

69

SLR y LR canónico: ventajas / desventajas

Ventaja fundamental LR canónico

Reconoce un conjunto mayor de gramáticas que SLR.

Desventaja fundamental

El número de estados del reconocedor aumenta de forma considerable respecto de SLR

Page 70: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

70

3.1.3 Reconocedores LALR

Se trata de un punto intermedio entre SLR y LR canónico.

La idea es reducir el número de estados de un reconocedor LR canónico mediante la fusión de estados que son idénticos (salvo en la lista de SIGUIENTES asociada a cada regla).

Al fusionar los estados tenemos que modificar las transiciones correspondientes. Además, la lista de SIGUIENTES de un estado fusionado es la UNION de las listas de los estados que se han fusionado.

Page 71: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

71

Ejemplo

Dada la siguiente gramática:

1. S CC2. C cC3. C d

Se pide:

1. Autómata de reconocimiento LALR

2. Tabla de reconocimiento correspondiente

Page 72: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

72

Estados del autómata LR canónico

S0:S’ ^ S { $ } S4: C d ^ { c , d }S ^ CC { $ }C ^ cC { c , d } S5: S CC ^ { $ }C ^ d { c , d }

S6: C c ^ C { $ }S1:S’ S ^ { $ } C ^ cC { $ }

C ^ d { $ }S2:S C ^ C { $ }

C ^ cC { $ } S7: C d ^ { $ }C ^ d { $ }

S8: C cC ^ { c , d }S3:C c ^ C { c , d }

C ^ cC { c , d } S9: C cC ^ { $ }C ^ d { c , d }

Page 73: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

73

Estados del autómata LALR

S0: S’ ^ S { $ } S47: C d ^ { c , d , $ }S ^ CC { $ }C ^ cC { c , d } S5: S CC ^ { $ }C ^ d { c , d }

S89: C cC ^ { c , d , $ }S1: S’ S ^ { $ }

S2: S C ^ C { $ }C ^ cC { $ }C ^ d { $ }

S36: C c ^ C { c , d , $ }C ^ cC { c , d , $ }C ^ d { c , d , $ }

Page 74: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

74

Tabla de reconocimiento LALR

R2R2R2S89

R1S5

R3R3R3S47

89S47S36S36

5S47S36S2

O.K.S1

21S47S36S0

CS$dc

GOTOACCIONESESTADOS

Page 75: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

75

Conflictos en la fusión LALR

1 Si no existen conflictos SHIFT-REDUCE en el autómata canónico, tampoco los habrá en el autómata LALR.

2 Aunque el autómata canónico no tenga conflictos REDUCE-REDUCE, podrían aparecer este tipo de conflictos en el autómata LALR.

Page 76: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

76

Demostración sobre conflictos shift-reduce (I)

No hay conflicto S/R

R1 α ^ { A } A ∩ a = ØR2 β ^ { B } A ∩ b = ØR3 φ ^ a { …} B ∩ a = ØR4 ρ ^ b { … } B ∩ b = Ø

R1 α ^ { C } C ∩ a = ØR2 β ^ { D } C ∩ b = ØR3 φ ^ a { …} D ∩ a = ØR4 ρ ^ b { … } D ∩ b = Ø

Page 77: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

77

Demostración sobre conflictos shift-reduce (II)

R1 α ^ { A U C }R2 β ^ { B U D }R3 φ ^ a { …}R4 ρ ^ b { … }

¿ hay conflicto S/R al fusionar los 2 estados ?

(A U C) ∩ a = (A ∩ a) U (C ∩ a) = Ø(A U C) ∩ b = (A ∩ b) U (C ∩ b) = Ø(B U D) ∩ a = (B ∩ a) U (D ∩ a) = Ø(B U D) ∩ b = (B ∩ b) U (D ∩ b) = Ø

Efectivamente, si no hay conflictos S/R antes de la fusión de estados, después de la fusión tampoco existen.

Page 78: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

78

Demostración sobre conflictos reduce-reduce (I)

No hay conflicto R/R

R1 α ^ { A } A ∩ B = ØR2 β ^ { B }R3 φ ^ a { …}R4 ρ ^ b { … }

R1 α ^ { C } C ∩ D = ØR2 β ^ { D }R3 φ ^ a { …}R4 ρ ^ b { … }

Page 79: Análisis sintáctico - ulpgc.es · 4 1. Introducción Construcción del analizador sintáctico (parser) Lenguaje By hand Tool Gramática PARSER

79

Demostración sobre conflictos reduce-reduce (II)

R1 α ^ { A U C }R2 β ^ { B U D }R3 φ ^ a { …}R4 ρ ^ b { … }

¿ hay conflicto R/R al fusionar los 2 estados ?

(A U C) ∩ (B U D) = { (A U C) ∩ B } U { (A U C) ∩ D } =

(A ∩ B) U (C ∩ B) U (A ∩ D) U (C ∩ D) Ø ? ? Ø

Podrían aparecer conflictos R/R después de fusionar los estados aunque antes de la fusión no existiese ningún conflicto R/R