SlideShare ist ein Scribd-Unternehmen logo
1 von 67
Downloaden Sie, um offline zu lesen
Lección 4: Análisis Sintáctico LL(1)
1) Estrategias para el Análisis Sintáctico
2) Análisis Sintáctico descendente
3) Factorización a izda. de gramáticas
4) Eliminación de la recursividad a izda.
5) Construcción de Analizadores Sintácticos predictivos
6) Construcción de Analizadores Sintácticos predictivos no
recursivos
7) Construcción de una tabla para el análisis sintáctico predictivo
8) Sobre recuperación de errores en el análisis sintáctico predictivo

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

1
Estrategias para analizadores sintácticos
• El analizador sintáctico debe verificar si la entrada corresponde a
alguna derivación de S
• Primera aproximación: “a lo bestia”
– generar todas las derivaciones de S posibles
– comprobar si la entrada corresponde con alguna de ellas

• Inviable, incluso para gramáticas muy sencillas
• Son necesarias estrategias más “astutas”
• Las estrategias son de dos categorías:
– análisis DESCENDENTE (Top-Down)
» construye el árbol desde la raíz (S) hasta llegar a las hojas
– análisis ASCENDENTE (Bottom-Up)
» construye el árbol desde las hojas hacia la raíz (S)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

2
Estrategias para analizadores sintácticos
• A distintos tipos de analizadores se les da nombres en función a
varios elementos:
– lectura de tokens (izda. a dcha., viceversa)
– método de derivación (izda. o dcha.)
– número de tokens de pre-análisis (look-ahead)

• Las más comunes:
lectura de
tokens
“left to right”

LL(k)
LL(k)
derivación por
izda.

k tokens de lookahead

LR(k)
LR(k)
lectura de
tokens
“left to right”
Compiladores I. C.P.S. Universidad de Zaragoza

derivación por
dcha.

-J.Ezpeleta-

k tokens de lookahead

3
Estrategias para analizadores sintácticos
• Propiedades deseables en un analizador sintáctico
– eficiente
» en general, se buscarán polinomiales en el tamaño del programa a
reconocer
– determinar la acción reconociendo unos pocos tokens de entrada
» como máximo, un k preestablecido
» en la práctica, suele ser k=1
– no necesitar “marcha atrás” (backtracking)
» i.e., evitar decisiones
» las acciones semánticas son difíciles de deshacer
– no ocupar mucha memoria
» actualmente, esto no es tan importante

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

4
Análisis descendente
• Básicamente, es un intento de encontrar una derivación por la
izda.
• Desde el punto de vista del árbol de sintaxis, correspondería a un
recorrido en pre-orden
• Método:
– Objetivo: reconocer S
– Método:
» se divide el objetivo en subobjetivos
(de acuerdo a las producciones)
» se trata de cumplir cada subobjetivo
» se sigue con cada subobjetivo, hasta que se encuentren concordancias
de terminales (o se detecte un error)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

5
Análisis descendente
• Ejemplo:

S → cAd
A → ab|a

cad
S
S
S

S

c a d

c a d
c

A

d

A

c
a

S

c a d
a

c a d
d

c

c

d

b
S

c a d

b
S

A

c

d

A

S
d

a
Compiladores I. C.P.S. Universidad de Zaragoza

c a d

c

A

d

a
-J.Ezpeleta-

6
Análisis descendente
• Sobre implementación de analizadores descendentes
– la forma más natural es asociar un procedimiento con cada no terminal
– cada procedimiento:
» comprueba la corrección del token en estudio con el que el propio
procedimiento representa
• incorrecto: mensaje de error y/o estrategia de recuperación

» hacer avanzar al siguiente token
– afinando un poco más:
» no terminal: genera invocaciones
» terminal: concordancia entre terminales
• error sintáctico ó
• avanzar a token siguiente

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

7
S → cAd
A → a

Análisis descendente
• Un ejemplo muy sencillo

void S(){
terminal((int)’c’);
A();
terminal((int)’d’);
}
void main(){
elToken=yylex();
S();
}

int elToken;
int yylex(){
return(getchar());
}
void terminal(int t){
if(elToken==t)
elToken=yylex();
else
errorSintactico();
}
void A(){
terminal((int)’a’);
}

¿Qué pasa con

?
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

S
S
A
A

→
→
→
→

cAd
cAd
a|ab
a|ab

8
S → cAd
A → a|ab

Análisis descendente
• Una solución predictiva
int elToken;
int yylex(){
return(getchar());
}
void terminal(int t){
if(elToken==t)
elToken=yylex();
else
errorSintactico();
}
void A(){
terminal((int)’a’);
if(elToken==(int)’b’)
terminal((int)’b’);
}

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

void S(){
terminal((int)’c’);
A();
terminal((int)’d’);
}
void main(){
elToken=yylex();
S();
}

preanálisis

9
Análisis descendente. Un ejemplo
• Ejemplo: Se desea construir un analizador sintáctico para la
siguiente gramática
instruccion → identificador opas expr ‘;’
expr → termino expr’
expr’ → ‘+’ termino expr’ | ε
termino → identificador | ‘(’ expr ‘)’
• donde:
– “opas” es un terminal de la gramática que representa al operador de
asignación.
» Corresponde al lexema “:=“
– “identificador”
(letra seguido de letras o dígitos)
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

10
Análisis descendente. Un ejemplo
• Como paso previo, necesitamos construir el analizador léxico
• Esquema del proceso:
lexDescen.l

tokens.h
flex
sinDescen.c

lex.yy.c
gcc
sinDescen.o

lex.yy.o

-ll

gcc
elAnalizador
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

11
Análisis descendente. Un ejemplo
enum{ASIGNACION=257,IDENTIFICADOR};
%{
#include <stdio.h>
#include "tokens.h"
extern char yytext[]; /*ó extern char *yytext*/
%}
/*EXPRESIONES REGULARES*/
separador
[t n]+ /*tabs,blancos*/
letra
[a-zA-Z]
digito
[0-9]
identificador {letra}({letra}|{digito})*
%%
{separador}
{/*me los como*/}
":="
{return(ASIGNACION);}
{identificador} {return(IDENTIFICADOR);}
.
{return(yytext[0]);}
%%
/* no hay funciones de usuario */
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

tokens.h
lexDescen.l

12
Análisis descendente. Un ejemplo
• Para el analizador sintáctico, construi remos un
analizador sintáctico descendente recursivo
• Ideas básicas del método:
– construir un conjunto de procedimientos (recursivos si necesario)
» uno por cada no terminal de la gramática
– cada procedimiento:
» determina la producción a aplicar
» invoca los proc. correspondientes
» detecta error o pasa al siguiente token
– la secuencia de invocaciones a los procedimientos define implícitamente
el árbol de sintaxis

• En este ejemplo funciona bien por las razones que veremos, pero
no siempre es tan sencillo
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

13
Análisis descendente. Un ejemplo
#include <stdio.h>
sinDescen.c
#include "tokens.h"
int elToken;
/*global con sig. token*/
void terminal(int token{
if(elToken==token)
elToken=yylex();
else
hayError(...INFO(elToken) inesperado...);
}
void instruccion(){
instruccion →
terminal(IDENTIFICADOR);
identificador
terminal(ASIGNACION);
opas
expresion ‘;’
expresion();
terminal((int) ‘;’);
}
void main(){
elToken=yylex();
instruccion();
}
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

14
Análisis descendente. Un ejemplo

sinDescen.c
void termino(){
if(elToken==IDENTIFICADOR)
termino → identificador
terminal(IDENTIFICADOR);
| ( expresion )
else if(elToken=='('){
terminal((int) ‘(‘);
expresion();
terminal((int) ‘)‘);
}else
hayError("Se esperaba un IDENTIFICADOR o '('");
}

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

15
Análisis descendente. Un ejemplo
expresion →
termino
expresionP

void expresion(){
termino();
expresionP();
}
void expresionP(){
if(elToken=='+'){
terminal((int) ‘+‘);
termino();expresionP();
} /*else: corresponde a ε */
}

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

sinDescen.c

expresionP →
+ termino expresionP
|

ε

16
Análisis descendente
• En general, el método puede presentar incovenientes:
– necesidad de backtracking: cuando la regla elegida no es la correcta
“devolver” a la entrada todos los tokens recorridos
» Ejemplo: instIF →
tkIF expr tkTHEN insts
| tkIF expr tkTHEN insts tkELSE insts

– recursividad a izda.: si alguna regla se define con recursividad a izda., el
analizador sintáctico construído entra en un bucle infinito
» Ejemplo:
expr → expr + term | termino

• Soluciones:
– factorización a izda.
– eliminación de recursividad a izda.
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

17
Análisis descendente. Factorización a izda.
• Consideremos la gramática A → αC | αB
• Si encontramos una cadena derivada de α, ¿Qué producción
aplicar?
– ¿ Si sigo αC y era αB ?
– ¿ Si sigo αB y era αC ?
• Idea: retrasar la decisión, de manera que siempre se tome la
buena decisión
A → αA’
A’ → C | B
• Ambas gramáticas generan el mismo lenguaje

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

18
Análisis descendente. Eliminación rec. izda.
• En analizadores descendentes, la recursividad a izda. da lugar a
bucles infinitos
• Ejemplo:
instruccion → identificador opas expr ‘;’
expr → expr ‘+’ termino
|

termino

termino → identificador
| ‘(’ expr ‘)’

• Cuando se trata de derivar
velocidad:=(vel1+vel2)+vel3;

la invocación “expresion()” se hace recursivamente sin
consumir nuevos tokens, dando un bucle infinito
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

19
Análisis descendente. Recursividad a izda.
• Por suerte, la rec. directa a izda. se puede eliminar mediante una
transformación de la gramática
A → Aα | β

A

→ βA’

A’ → αA’ |

ε

• Ambas gramáticas son equivalentes

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

20
Análisis descendente. Recursividad a izda.
• Aplicando la transformación a la gramática anterior, obtenemos
instruccion → identificador opas expr ‘;’
expr → termino expr’
expr’ → ‘+’ termino expr’ | ε
termino → identificador | ‘(’ expr ‘)’
• Sin embargo, sólo eliminamos la rec. izda. directa
• ¿Qué pasa con
A → Bα | α
B → AB | β
?
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

21
Análisis descendente. Recursividad a izda.
• El siguiente algoritmo resuelve el problema [AhSU 90]
Algoritmo

eliminaRecIzda(E G:GLC; S G’:GLC)

--Pre: G=(N,T,P,S) sin “ciclos” (A ⇒+ A) ni
-producciones ε (A → ε) ∧ N={A1,...,An}
--Post: G’ ≅ G, sin rec. a izda.

Para tratamiento de ciclos y
Principio
G’:=G
producciones ε, ver [HoUl 79]
Para i:=1 hasta n
Para j:=1 hasta i-1
--Aj → δ1|...|δk son las
-producciones actuales de Aj
sustituir en P’
Ai → Ajα por Ai → δ1α|...|δkα
FPara
eliminar rec. inmediata de Ai
FPara
Fin
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

22
Análisis descendente

Sep 97/98

Ejercicio 4 (1.5 ptos.): Considerar el siguiente código C que
corresponde a un analizador sintáctico descendente recursivo.
Determinar, a partir del propio código, cuál es la gramática, y decir
si el analizador funcionará
correctamente.
enum token …
extern enum token getToken(void);
enum token tok;
void advance(){
void eat(enum token t){
tok=getToken();
if(tok==t)
}
advance();
else
error();
}

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

23
Análisis descendente. Recursividad a izda.
void S(){
switch(tok){
case IF: eat(IF);E();eat(THEN);
S(); eat(ELSE);S();break;
case BEGIN: eat(BEGIN);S();L();break;
case PRINT: eat(PRINT);E();break;
default: error();
}
}
void L(){
switch(tok){
case END: eat(END); break;
case SEMI: eat(SEMI);S();L();break;
default: error();
}
}
void E(){
eat(NUM); eat(EQ); eat(NUM);
}
Compiladores I. C.P.S. Universidad de Zaragoza
-J.Ezpeleta-

24
Analizadores sintácticos predictivos
• Un analizador sintáctico predictivo es un analizador sintáctico
descendente recursivo que NO necesita marcha atrás
• Condición exigible a una gramática para que sea posible:
– que en todo momento, a partir del siguiente token de entrada, sea posible
determinar qué regla aplicar

• Esto es posible cuando (una de dos):
– ningún no terminal tiene alternativas en su parte derecha
» gramáticas poco interesantes
– no terminales con alternativas que empiecen por distintos símbolos

• Aunque hay más casos en que también es posible

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

25
Analizadores sintácticos predictivos no rec.
• El hecho de que haya reglas recursivas hace que el analiziador
predictivo implementado directamente sea recursivo
• Sin embargo, la recursividad se puede evitar mediante el uso
explícito de una pila
• Un analizador predictivo sabe, a partir del símbolo que está
analizando y el siguiente símbolo de entrada, qué regla aplicar
• Por lo tanto, se puede hacer corresponder a una tabla de doble
entrada:
(token de la forma de frase,sig. token)

(no terminal,sig. token)
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

26
Analizadores sintácticos predictivos no rec.
• Esta forma de implementación da lugar
anal. sintácticos dirigidos por tabla
• Esquema general:

Z
Y
k

entrada

..b c b a..

analizador
analizador
sintáctico
sintáctico

pila de símbolos
(a reconocer)

salida

S → X
X → Z Y k

tabla de
análisis
M[Z,a]
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

27
Analizadores sintácticos predictivos no rec.
• Esquema de funcionamiento:
Pre: M:Nx(T∪{$})→2P:tabla de anál. sint.
la sec. de tokens termina con $
Post: sec. de prod. aplicadas o error
Variables p:pila de símbolos gramaticales;sigTok,X:token
Principio
pilaVacia(p);sigTok=yylex();push(p,$,S)
Repetir
X=cima(p)
Si X es terminal ∨ X=$ entonces
Si X=sigTok entonces
pop(p); sigTok=yylex()
Si no
errorSintáctico()
FSi
Si no
....
Hasta Que X=$
Fin
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

28
Analizadores sintácticos predictivos no rec.
Pre: M:Nx(T∪{$})→2P:tabla de anál. sint.
la sec. de tokens termina con $
Post: sec. de prod. aplicadas o error
Variables p:pila de símbolos gramaticales;sigTok,X:token
Principio
Repetir
...
Si no
Si M[X,sigTok]= X→Y1... Yk entonces
pop(p)
push(p,YkYk-1... Y1)
emitir producción X→Y1... Yk
Si no
errorSintáctico()
FSi
FSi
Hasta Que X=$
Fin
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

29
Analizadores sintácticos predictivos no rec.
• Ejemplo: reconocer (x;(x)) para

(
S S→(A)
A A→CB
B
C C→S

)

B→ ε

Compiladores I. C.P.S. Universidad de Zaragoza

;

S
A
B
C

→
→
→
→

( A )
CB
; A |
x | S

x

ε

$

A→CB
B→;A

-J.Ezpeleta-

C→x

30
pila

Analizadores
sintácticos predictivos
no rec.

$S
$)A(
$)A
$)BC
$)Bx

$)B
$)A;
$)A
$)BC
$)BS
$)B)A(
$)B)A
$)B)BC
$)B)Bx
$)B)B
$)B)
$)B
$)
$
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

entrada
(x;(x))$
(x;(x))$
x;(x))$
x;(x))$
x;(x))$
;(x))$
;(x))$
(x))$
(x))$
(x))$
(x))$
x))$
x))$
x))$
))$
))$
)$
)$
$

producción usada
(salida)
S→(A)
A→CB
C→x
B→;A
A→CB
C→ S
S→(A)
A→CB
C →x
B →ε
B →ε
31
Construcción de una tabla para el análisis
• Lo fundamental para la construcción de un analizador sintáctico
predictivo no rec. construcción de la tabla
• Idea básica: uso de las funciones “primero” y “siguiente”
• Objetivo: utilizar dichas funciones para construir la tabla de
análisis predictivo
• Es más: una gramática es LL(1) ssi la tabla construída tiene una
única salida para cada entrada

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

32
Construcción de una tabla para el análisis
• Sea G=(N,T,S,P)una gramática
Sea α una cadena de símbolos de la gramática: α ∈ (N ∪ T)*
• PRI(α): terminales que pueden comenzar una forma de frase
derivable de α
PRI(α)={a∈T| α ⇒* aβ} ∪
(Si α ⇒* ε
entonces {ε}
si no
∅

)
• Importante: para (empezar a) reconocer α, el siguiente token a
procesar deberá estar en PRI(α)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

33
Construcción de una tabla para el análisis
• Paso 1: Calcular los conjuntos PRI(X) para cualquier símbolo gramatical
X∈N∪T
• Paso 2: Sea X1...Xn ∈ (N ∪ T)*

– Añadir a PRI(X1...Xn ) los símbolos de PRI(X1){ε}
– Si

ε ∈ PRI(X1)

– Si

ε ∈ PRI(X1)

– Si

ε ∈ PRI(X1) ∩

añadir a PRI(X1...Xn) los símbolos de PRI(X2) {ε}
∩ PRI(X2)
añadir a PRI(X1...Xn) los símbolos de PRI(X3) {ε}
PRI(X2) ∩ PRI(X3)
añadir a PRI(X1...Xn) los símbolos de PRI(X4) {ε}

– .....
– Si

ε ∈ PRI(X1)∩
añadir ε a

.... ∩ PRI(Xn)
PRI(X1...Xn)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

34
Construcción de una tabla para el análisis
• Paso 1:
aplicar el
siguiente
algoritmo

--Pre: X ∈ N∪T
--Post: calcula PRI(X)
Repetir
Si X∈T
añadir X a PRI(X)
FSi
Si X → ε es una producción
añadir ε a PRI(X)
FSi
Si X → Y1...Yk es una producción
Si a∈PRI(Yj) ∧ ε∈PRI(Y1)∩... ∩PRI(Yj-1)
añadir a a PRI(X)
FSi
Si ε ∈PRI(Y1)∩... ∩PRI(Yk)
añadir ε a PRI(X)
FSi
FSi
Hasta Que no se añada nada a ningún PRI

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

35
Construcción de una tabla para el análisis
• Ejemplos:
S → A B c
A → a |
B → b |

ε
ε

PRI(S)={a,b,c}
PRI(A)={a,ε}
PRI(B)={b,ε}
PRI(a)={a}
PRI(b)={b}
PRI(c)={c}
PRI(AB)={a,b,ε}

S → a S e | B
B → b B e | C
C → c C e | d
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

PRI(S)={a,b,c,d}
PRI(B)={b,c,d}
PRI(C)={c,d}
PRI(a)={a}
PRI(b)={b}
....
36
Construcción de una tabla para el análisis
• Sea G=(N,T,S,P) una gramática
• Sea A un no terminal (A ∈ N)
• SIG(A) será el conjunto de todos aquellos terminales que
pueden aparecer detrás de A en alguna forma de frase
SIG(A)={a∈T| S ⇒+ ...Aa...} ∪
(Si S ⇒+ αA
entonces {$}
si no
∅
)
• Importante: SIG(A)=conjunto de terminales que pueden indicar
(fin del) reconocimiento de una regla que tenga A en la parte
izda.
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

37
Construcción de una tabla para el análisis
• Construcción de los conjuntos SIG
--Pre: TRUE
--Post: calcula SIG(A) para todo A ∈ N
añadir $ a SIG(S)
Repetir
Si A → αBβ es una producción
añadir PRI(β){ε} a SIG(B)
FSi
Si
A → αB es una producción
∨ (A → αBβ con ε∈PRI(β) es producción)
añadir SIG(A) a SIG(B)
FSi
Hasta Que no se añada nada a ningún SIG

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

38
Construcción de una tabla para el análisis
• Ejemplos:
S → A B c
A → a |
B → b |

SIG(S)={$}
SIG(A)={b,c}
SIG(B)={c}

ε
ε

S → a S e | B
B → b B e | C
C → c C e | d

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

SIG(S)={e,$}
SIG(B)={e,$}
SIG(C)={e,$}

39
Construcción de una tabla para el análisis
• Construcción de la tabla:
– filas indexadas por no terminales
– columnas indexadas por terminales (∪ {$})

• Ideas a seguir para la producción
A→α
– Si a∈PRI(α), cuando entra a se expande A por α
– Si α = ε ó α ⇒* ε
» expandir A por α cuando llegue algo de SIG(A)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

40
Construcción de una tabla para el análisis
Pre: Una gramática G=(N,T,S,P)
Post: M: tabla de anál. desc.
Principio
Para cada (n,t)∈Nx(T∪{$})
M[n,t]:= ∅ /*¿Conjunto?*/
FPara
Para cada producción X → α
Para cada a∈PRI(α)
M[X,a]:= M[X,a]∪{X → α}
FPara

Si ε∈PRI(α) entonces
Para cada b∈T∩SIG(X)
M[X,b]:= M[X,b]∪{X → α}
FPara
Si $∈SIG(X) entonces
M[X, $]:= M[X, $]∪{X → α}
FSi
FSi

FPara
Para cada (n,t)∈Nx(T∪{$})
Si M[n,t]=∅ ent M[n,t]=ERROR FSi
FPara
Fin
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

41
Construcción de una tabla para el análisis
Una gramática es LL(1) cuando en la
gramática LL(1)
tabla construída según el método
anterior cada elemento es una de las dos cosas
siguientes:
*ERROR
*un conjunto con una única producción

• Aternativamente, G es LL(1) ssi para toda producción

A

→ α |β

– α y β no pueden derivar cadenas que comiencen por un mismo terminal

a
– ¬( (α ⇒* ε ) ∧ (β ⇒* ε ) )
– Si β ⇒* ε , α no deriva ninguna cadena que comience con un elemento de
T∩SIG(A)
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

42
Construcción de una tabla para el análisis
• Notar las ventajas de LL(1):
– por cada token de entrada, sabemos exactamente qué producción se debe
aplicar
– no hay backtracking
– asegura un anal. descendente correcto
– no son ambíguas
función de long.
– complejidad de los anal. LL(1) :
de la cadena de tokens
» lineal en tiempo
» lineal en espacio

• ¿Si la gramática no es LL(1)?
– intentar transformarla en LL(1)
– no siempre es posible
– aunque aparecen con mucha
frecuencia
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

• También existen
gramáticas LL(k) que
emplean una
generalización de las
técnicas presentadas
43
Sobre recuperación/reparación de errores
• ¿Cuál es el objetivo de la recuperación de errores?
– no abortar la compilación
– informar de las decisiones tomadas

• Situación de error:

pila

A
.
.
.
$

... b ...
entrada

T(A,b)=error

• ¿Cómo recuperarse de la situación?
– recuperación: eliminar símbolos de la entrada o de la pila hasta llegar a
un estado que pueda seguir
– reparación: “reparar“ la entrada del usuario
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

44
Sobre recuperación/reparación de errores
• Recuperación
– modo pánico: eliminar símbolos de la entrada hasta encontrar alguno
específico del conjunto de sincronización

• Reparación:
– supongamos una entrada en el estado αtβ, donde α es lo ya analizado y
t el siguiente token
– tres actuaciones posibles:
» modificar α
» insertar un δ esperando que αδtβ sea del lenguaje
» eliminar t esperando que sea αβ del lenguaje

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

45
Sobre recuperación/reparación de errores
...
x := 27
z ;
y := 29 ;
...

insts
insts
inst
instAS
instMQ
...

→
→
→
→
→

insts ‘;’ inst
inst
instMQ | instAS | ...
tkID tkOPAS exp
tkMQ exp insts

• al encontrar “z” podemos tratar de arreglarlo como:
– Se esperaba “;”
– por lo que lo “insertamos”. Sin embargo ....

– Se esperaba “;”
– por lo que seguimos hasta encontrarlo. Sin embargo ....

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

46
Sobre recuperación/reparación de errores
• No hay un método universal, por lo que se aplican ciertas reglas
heurísticas
• Para cada no terminal, definamos sinc(A)
• Veamos algunos elementos a añadir en sinc(A)
– añadir SIG(A) a sinc(A)
– usar la jerarquía del lenguaje
» añadir el conjunto de sinc de
un nivel a los inferiores

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

bloque
↓
instrucción
↓
expresión
↓
término
↓
factor
....
47
Sobre recuperación/reparación de errores
• Ejemplo:
insts

→ inst insts’

insts’ →
inst
→
instAS →
instMQ →

ε

inst insts’ |
instMQ | instAS | ...
tkID tkOPAS exp ‘;’
tkMQ ‘(‘ exp ‘)’ insts
...

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

x = 3
While (x > y) {
....
}

48
Sobre recuperación/reparación de errores
– para A∈N, añadir PRI(A) a sinc(A)
» Seguir análisis por A cuando llegue uno de ellos

ε, cima(p)=A,
» disparar A ⇒* ε

– si A ⇒*

– si cima(p)=x y x<>sigToken (x es terminal)
» eliminar x de la pila
» dar mensaje “x ha sido insertado”

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

Es una inserción
“virtual”

49
Sobre recuperación/reparación de errores
procedure pruebaErrores1 is
x: integer;
gnatmake
y: integer := 1;
begin
5:15: missing ";"
x := 3
9:13: missing operand
while x>y loop
x := x-1;
end loop;
x := ;
end;
int main(){
int x,
gcc
y = 1; 6: parse error before `while'
x = 3
while(x>y)
x = x-1;
x = ;

8: parse error before `;'

}
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

50
Sobre recuperación/reparación de errores
procedure pruebaErrores2 is
x: integer;
gnatmake
y: integer := 1;
10:10: binary operator expected
begin
14:08: missing operand
x := 3 z;
while x>y loop
x := x-1;
end loop;
x := ;
end;
int main(){
int x,
gcc
y = 1; 5:parse error before `z`
x = 3 z;
while(x>y)
x = x-1;
x = ;

8:parse error before `;`

}
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

51
Sobre recuperación/reparación de errores
int main(){
int x,
y = 1;
x = 3
while(x>y)
x = x-1;
x = ;

lint
line
line
line
line
line
line
line
line

6:
7:
8:
5:
5:
5:
1:
1:

}
error 1000: Unexpected symbol: "while".
error 1000: Unexpected symbol: "x".
error 1000: Unexpected symbol: ";".
error 1533: Illegal function call.
warning 714.
error 1549: Modifiable lvalue required for assignment operator.
warning 517: Function returns no value.
warning 845: errors seen skipping the code including function.

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

52
Sobre recuperación/reparación de errores

NAME
lint - a C program checker/verifier
SYNOPSIS
lint [options] file ...
DESCRIPTION
lint attempts to detect features in C program files that are likely to
be bugs, non-portable, or wasteful. It also checks type usage more
strictly than the compilers. Program anomalies currently detected
include unreachable statements, loops not entered at the top,
automatic variables declared but not used, and logical expressions
whose value is constant. Usage of functions is checked to find
functions that return values in some places and not in others,
functions called with varying numbers or types of arguments, and
functions whose values are not used or whose values are used but none
returned.

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

53
Ejercicios
•Ejercicio 1: Considérese la siguiente gramática:

Jun. 96

S → [ S
| S1
S1→ [a]

•1.1) (1 pto.) Establecer el lenguaje que genera. Es necesario que se justifique, lo
más formalmente posible, la respuesta
•1.2) .....
•1.3) (1 pto.) ¿Se trata de una gramática LL(1)?
•1.4) (0.5 ptos.) Si no es SLR(1), dar una gramática equivalente que sí lo sea.
Análogamente, si no es LL(1) dar una gramática equivalente que sí lo sea..

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

54
Ejercicios
Ejercicio 2 (5 ptos. ) : Considérese la siguiente
gramática (en negrita los terminales):
S
S
L
L

→
→
→
→

Feb. 96

( L )
a
L , S
S

2.1 (0.5 ptos.) ¿Qué lenguaje genera?
2.2 .....
2.3 (2 ptos.) Evidentemente, se trata de una gramática no LL(1). Transformarla
en una equivalente que sí lo sea, y contruir la tabla del análisis sintáctico LL(1)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

55
Ejercicios

Sep. 98

Ejercicio 3 (5.5 ptos. Sep. 98): Considérese la siguiente
gramática:
G:
S → uBDz
B → Bv
B→w
D → EF
E→y
E→ε
F→x
F→ε

1) Construir las tablas del análisis sintáctico SLR, y determinar si se trata de
una gramática SLR o no
2) Comprobar que se trata de una gramática no LL(1). Transformarla en una
gramática LL(1), y calcular su tabla de análisis LL(1)

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

56
Ejercicios
Ejercicio 3 (3.0 ptos.): Considerar la siguiente gramática
(en negrita los terminales):
S → P M
P → E
| q
M → n E
E → , O
| E
O → u
| u,O

Feb. 98

Probar que se trata de una gramática NO LL(1). Si es posible, realizar las
transformaciones precisas para convertirla en LL(1) y, construyendo la tabla
del análisis LL(1), demostrar que la gramática transformada es efectivamente
de esta clase. Es necesario justificar las transformaciones que se realicen. Si
no fuera posible transformarla en LL(1), explicar la razón
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

57
Ejercicios
• Ejercicio 2 (1.5 ptos.): Dada una secuencia ω determinales el
algoritmo de análisis LL(1) emite la secuencia de producciones
aplicadas para su derivación, o error si no es capaz de encontrarla.
Vamos a denotar n el número de no terminales de la gramática, y |ω|
la longitud de la secuencia de entrada. Se sabe que, en el caso de que
el algoritmo dé respuesta afirmativa, el coste de ejecución del
algoritmo es Ω(|ω|), Ο(n|ω|). En el cálculo de este coste se han
considerado como operaciones de coste constante las siguientes:
–
–
–
–

obtener la cima de la pila
apilar y desapilar símbolos gramaticales
obtener el siguiente terminal de la sencuencia de entrada
consultar el valor en la tabla correspondiente a un par (no terminal,
terminal)
– emitir una producción

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

58
Ejercicios
• Consideremos ahora la siguiente gramática:
– X1
– X2
– X3
– X4
– ....
– Xn-1
– Xn

-->
-->
-->
-->

X2
a2
a3
a4

X2 X2
| X3
| X4
| X5

--> an-1 | Xn
--> an

• El ejercicio pide escribir dos frases del lenguaje generado por la
gramática anterior, w1 y w2, tal que los costes de ejecución del algoritmo
de reconocimiento sean, respectivamente, del orden de |w1| y n|w2|.
• ¿Cuál puede ser el coste del algoritmo, en el mejor y el peor caso,
cuando se aplica a una frase que no es reconocida por el análisis LL(1)?
• Nota: en todos los casos la respuesta debe ser razonada.
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

59
Sintaxis expresiones en Pascal

[

expresión

identif.
de variable

]

,

variable

.

identificador
de campo

identif. de campo

^

expresión

expresión
simple
=

<

>

<=

>=

<>

IN
expresión
simple

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

60
Sintaxis expresiones en Pascal
expresión
simple

+
término
-

+

-

OR

mod

and

término
término

factor
*

/

div

factor

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

61
Sintaxis expresiones en Pascal
factor

constante sin signo
variable
identificador
de función
(

expresión

)

,
(

NOT

[

expresión

)

factor

expresión

..

expresión

]

,
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

62
Sintaxis expresiones en Pascal
constante
sin signo

identificador de constante
numero sin signo
NIL
'

Compiladores I. C.P.S. Universidad de Zaragoza

caracter

-J.Ezpeleta-

'

63
Sintaxis expresiones en Pascal
expr:
expSimple
| expr opRel expSimple
expSimple:
term
| expSimple opSum term
opRel:
'='
| '<'
| '>'
| MEI
| MAI
| NI

Compiladores I. C.P.S. Universidad de Zaragoza

opSum:
'+'
| '-'
| OR
term:
factor
| '+' term
| '-' term %prec '-'
| term opMul factor
opMul:
'*'
| '/'
| DIV
| MOD
| AND

-J.Ezpeleta-

64
Sintaxis expresiones en Pascal
factor:
constante
| IDENTIFICADOR
| IDENTIFICADOR '[' expr ']'
| IDENTIFICADOR '(' listaActuales ')'
| '(' expr ')'
| NOT factor %prec NOT
constante:
CONSTENTERA
| CONSTBOOLEANA
| CONSTCADENA
| CONSTCARACTER

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

65
Sintaxis expresiones en Ada
expression
relation
| relation
| relation
| relation
| relation

[...]: 0 ó 1
{...}: 0 ó más

::=
{and relation}
{and then relation}
{or relation}
{or else relation}
{xor relation}

relation ::=
simple_expression [relational_operator simple_expression]
| simple_expression [not] in range
| simple_expression [not] in subtype_mark
simple_expression ::=
[unary_adding_operator] term {binary_adding_operator term}
term ::=
factor {multiplying_operator factor}
factor ::=
primary [** primary]
| abs primary
| not primary

Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

66
Sintaxis expresiones en Ada

[...]: 0 ó 1
{...}: 0 ó más

primary ::=
numeric_literal
| null
| string_literal
| aggregate
| name
| qualified_expression
| allocator
| (expression)
logical_operator ::= and | or | xor
relational_operator ::= = | /= | < | <= | > | >=
binary_adding_operator ::= + | - | &
unary_adding_operator ::= + | multiplying_operator ::= * | / | mod | rem
highest_precedence_operator ::= ** | abs | not
Compiladores I. C.P.S. Universidad de Zaragoza

-J.Ezpeleta-

67

Weitere ähnliche Inhalte

Was ist angesagt?

Análisis Sintactico Predictivo No Recursivo
Análisis Sintactico Predictivo No RecursivoAnálisis Sintactico Predictivo No Recursivo
Análisis Sintactico Predictivo No RecursivoLeonel Morales Díaz
 
Prueba de poker simulacion DFD
Prueba de poker simulacion DFDPrueba de poker simulacion DFD
Prueba de poker simulacion DFDVitto Alcantara
 
Algoritmos de kruskal y prim
Algoritmos de kruskal y primAlgoritmos de kruskal y prim
Algoritmos de kruskal y primfher969
 
Indices de capacidad
Indices de capacidadIndices de capacidad
Indices de capacidadKevin Sotelo
 
HyperLogLog in Hive - How to count sheep efficiently?
HyperLogLog in Hive - How to count sheep efficiently?HyperLogLog in Hive - How to count sheep efficiently?
HyperLogLog in Hive - How to count sheep efficiently?bzamecnik
 
herramientas case
herramientas caseherramientas case
herramientas casetomaspetto
 
Comparacion Entre Rmi Y Api De Sockets
Comparacion Entre Rmi Y Api De SocketsComparacion Entre Rmi Y Api De Sockets
Comparacion Entre Rmi Y Api De Socketsmallita
 
3.3 Ambientes de servicios: negocios, Industria, comercio electrónico.
3.3 Ambientes de servicios: negocios, Industria, comercio electrónico.3.3 Ambientes de servicios: negocios, Industria, comercio electrónico.
3.3 Ambientes de servicios: negocios, Industria, comercio electrónico.PaolanmGongor
 
Peor ajuste (worst fit) sistemas operativos
Peor ajuste (worst fit)   sistemas operativosPeor ajuste (worst fit)   sistemas operativos
Peor ajuste (worst fit) sistemas operativosFabian Rojas
 
Procesamiento paralelo
Procesamiento paraleloProcesamiento paralelo
Procesamiento paralelowarrionet
 
Varios Algoritmos Voraces De DecisióN Y OptimizacióN
Varios Algoritmos Voraces De DecisióN Y OptimizacióNVarios Algoritmos Voraces De DecisióN Y OptimizacióN
Varios Algoritmos Voraces De DecisióN Y OptimizacióNSalvador Fernández Fernández
 
FORMAS NORMALES DE GREIBACH
FORMAS NORMALES DE GREIBACHFORMAS NORMALES DE GREIBACH
FORMAS NORMALES DE GREIBACHCarlos Manuel
 
Uso De Las Distribuciones De Probabilidad En La Simulacion De Sistemas Produc...
Uso De Las Distribuciones De Probabilidad En La Simulacion De Sistemas Produc...Uso De Las Distribuciones De Probabilidad En La Simulacion De Sistemas Produc...
Uso De Las Distribuciones De Probabilidad En La Simulacion De Sistemas Produc...guestb9bf58
 

Was ist angesagt? (20)

Análisis Sintactico Predictivo No Recursivo
Análisis Sintactico Predictivo No RecursivoAnálisis Sintactico Predictivo No Recursivo
Análisis Sintactico Predictivo No Recursivo
 
Prueba de poker simulacion DFD
Prueba de poker simulacion DFDPrueba de poker simulacion DFD
Prueba de poker simulacion DFD
 
Compiladores, Analisis Lexico, Tabla de Transiciones
Compiladores, Analisis Lexico, Tabla de TransicionesCompiladores, Analisis Lexico, Tabla de Transiciones
Compiladores, Analisis Lexico, Tabla de Transiciones
 
Algoritmos de kruskal y prim
Algoritmos de kruskal y primAlgoritmos de kruskal y prim
Algoritmos de kruskal y prim
 
Indices de capacidad
Indices de capacidadIndices de capacidad
Indices de capacidad
 
programacion lineal
 programacion lineal programacion lineal
programacion lineal
 
HyperLogLog in Hive - How to count sheep efficiently?
HyperLogLog in Hive - How to count sheep efficiently?HyperLogLog in Hive - How to count sheep efficiently?
HyperLogLog in Hive - How to count sheep efficiently?
 
herramientas case
herramientas caseherramientas case
herramientas case
 
DB1 Unidad 7: Desnormalizacion
DB1 Unidad 7: DesnormalizacionDB1 Unidad 7: Desnormalizacion
DB1 Unidad 7: Desnormalizacion
 
K-Nearest Neighbor
K-Nearest NeighborK-Nearest Neighbor
K-Nearest Neighbor
 
Comparacion Entre Rmi Y Api De Sockets
Comparacion Entre Rmi Y Api De SocketsComparacion Entre Rmi Y Api De Sockets
Comparacion Entre Rmi Y Api De Sockets
 
Autómatas y complejidad
Autómatas y complejidadAutómatas y complejidad
Autómatas y complejidad
 
3.3 Ambientes de servicios: negocios, Industria, comercio electrónico.
3.3 Ambientes de servicios: negocios, Industria, comercio electrónico.3.3 Ambientes de servicios: negocios, Industria, comercio electrónico.
3.3 Ambientes de servicios: negocios, Industria, comercio electrónico.
 
Peor ajuste (worst fit) sistemas operativos
Peor ajuste (worst fit)   sistemas operativosPeor ajuste (worst fit)   sistemas operativos
Peor ajuste (worst fit) sistemas operativos
 
Procesamiento paralelo
Procesamiento paraleloProcesamiento paralelo
Procesamiento paralelo
 
Varios Algoritmos Voraces De DecisióN Y OptimizacióN
Varios Algoritmos Voraces De DecisióN Y OptimizacióNVarios Algoritmos Voraces De DecisióN Y OptimizacióN
Varios Algoritmos Voraces De DecisióN Y OptimizacióN
 
FORMAS NORMALES DE GREIBACH
FORMAS NORMALES DE GREIBACHFORMAS NORMALES DE GREIBACH
FORMAS NORMALES DE GREIBACH
 
Uso De Las Distribuciones De Probabilidad En La Simulacion De Sistemas Produc...
Uso De Las Distribuciones De Probabilidad En La Simulacion De Sistemas Produc...Uso De Las Distribuciones De Probabilidad En La Simulacion De Sistemas Produc...
Uso De Las Distribuciones De Probabilidad En La Simulacion De Sistemas Produc...
 
Arboles
ArbolesArboles
Arboles
 
Modelo De Transporte
Modelo De TransporteModelo De Transporte
Modelo De Transporte
 

Andere mochten auch

Análisis sintáctico ascendente descendente
Análisis sintáctico ascendente   descendenteAnálisis sintáctico ascendente   descendente
Análisis sintáctico ascendente descendenteJhon Alexito
 
Analisis sintáctico
Analisis sintácticoAnalisis sintáctico
Analisis sintácticoOscar Eduardo
 
Analizador Sintáctico
Analizador SintácticoAnalizador Sintáctico
Analizador SintácticoPablo Guerra
 
Analizador sintactico
Analizador sintacticoAnalizador sintactico
Analizador sintacticoalexisdario
 
Automatas y compiladores analisis sintactico
Automatas y compiladores analisis sintacticoAutomatas y compiladores analisis sintactico
Automatas y compiladores analisis sintacticoGermania Rodriguez
 

Andere mochten auch (7)

Análisis sintáctico ascendente descendente
Análisis sintáctico ascendente   descendenteAnálisis sintáctico ascendente   descendente
Análisis sintáctico ascendente descendente
 
R94315
R94315R94315
R94315
 
Analisis sintáctico
Analisis sintácticoAnalisis sintáctico
Analisis sintáctico
 
Analizador Sintáctico
Analizador SintácticoAnalizador Sintáctico
Analizador Sintáctico
 
Analizador sintactico
Analizador sintacticoAnalizador sintactico
Analizador sintactico
 
Automatas y compiladores analisis sintactico
Automatas y compiladores analisis sintacticoAutomatas y compiladores analisis sintactico
Automatas y compiladores analisis sintactico
 
Analisis sintactico
Analisis sintacticoAnalisis sintactico
Analisis sintactico
 

Ähnlich wie Análisis LL(1) Descendente

Ähnlich wie Análisis LL(1) Descendente (20)

Análisis de Eco. OWASP Conference. 2008
Análisis de Eco. OWASP Conference. 2008Análisis de Eco. OWASP Conference. 2008
Análisis de Eco. OWASP Conference. 2008
 
Cap6
Cap6Cap6
Cap6
 
HECHT-LDZKP-CIBSI15v4
HECHT-LDZKP-CIBSI15v4HECHT-LDZKP-CIBSI15v4
HECHT-LDZKP-CIBSI15v4
 
Analisis Sintactico
Analisis SintacticoAnalisis Sintactico
Analisis Sintactico
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Solucion de problemas por medio de computadoras
Solucion de problemas por medio de computadorasSolucion de problemas por medio de computadoras
Solucion de problemas por medio de computadoras
 
Variables2
Variables2Variables2
Variables2
 
Semana 3
Semana 3Semana 3
Semana 3
 
OWASP Meeting. Análisis de ECO
OWASP Meeting. Análisis de ECOOWASP Meeting. Análisis de ECO
OWASP Meeting. Análisis de ECO
 
Capitulo 3 paul carrera,dego balcazar
Capitulo 3 paul carrera,dego balcazarCapitulo 3 paul carrera,dego balcazar
Capitulo 3 paul carrera,dego balcazar
 
A Sintactico Descendente
A Sintactico DescendenteA Sintactico Descendente
A Sintactico Descendente
 
curso_clips.pdf
curso_clips.pdfcurso_clips.pdf
curso_clips.pdf
 
Floyd
FloydFloyd
Floyd
 
Compilador Usando Jflex y Cup
Compilador Usando Jflex y CupCompilador Usando Jflex y Cup
Compilador Usando Jflex y Cup
 
04 j flex
04 j flex04 j flex
04 j flex
 
Semi-supervised Learning for Word Sense Disambiguation
Semi-supervised Learning for Word Sense DisambiguationSemi-supervised Learning for Word Sense Disambiguation
Semi-supervised Learning for Word Sense Disambiguation
 
Introduccion a la programación
Introduccion a la programaciónIntroduccion a la programación
Introduccion a la programación
 
05 - Analisis de Algoritmos.pptx
05 - Analisis de Algoritmos.pptx05 - Analisis de Algoritmos.pptx
05 - Analisis de Algoritmos.pptx
 
Inteligencia artificial
Inteligencia artificialInteligencia artificial
Inteligencia artificial
 
Sistemas basados en casos
Sistemas basados en casosSistemas basados en casos
Sistemas basados en casos
 

Kürzlich hochgeladen

la unidad de s sesion edussssssssssssssscacio fisca
la unidad de s sesion edussssssssssssssscacio fiscala unidad de s sesion edussssssssssssssscacio fisca
la unidad de s sesion edussssssssssssssscacio fiscaeliseo91
 
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptxSEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptxYadi Campos
 
Lecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdadLecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdadAlejandrino Halire Ccahuana
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfFrancisco158360
 
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptxTECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptxKarlaMassielMartinez
 
30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdfgimenanahuel
 
Identificación de componentes Hardware del PC
Identificación de componentes Hardware del PCIdentificación de componentes Hardware del PC
Identificación de componentes Hardware del PCCesarFernandez937857
 
RETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docxRETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docxAna Fernandez
 
Sesión de aprendizaje Planifica Textos argumentativo.docx
Sesión de aprendizaje Planifica Textos argumentativo.docxSesión de aprendizaje Planifica Textos argumentativo.docx
Sesión de aprendizaje Planifica Textos argumentativo.docxMaritzaRetamozoVera
 
La empresa sostenible: Principales Características, Barreras para su Avance y...
La empresa sostenible: Principales Características, Barreras para su Avance y...La empresa sostenible: Principales Características, Barreras para su Avance y...
La empresa sostenible: Principales Características, Barreras para su Avance y...JonathanCovena1
 
Registro Auxiliar - Primaria 2024 (1).pptx
Registro Auxiliar - Primaria  2024 (1).pptxRegistro Auxiliar - Primaria  2024 (1).pptx
Registro Auxiliar - Primaria 2024 (1).pptxFelicitasAsuncionDia
 
Informatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos BásicosInformatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos BásicosCesarFernandez937857
 
Qué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativaQué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativaDecaunlz
 
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptxOLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptxjosetrinidadchavez
 
Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Lourdes Feria
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.amayarogel
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdfBaker Publishing Company
 
Neurociencias para Educadores NE24 Ccesa007.pdf
Neurociencias para Educadores  NE24  Ccesa007.pdfNeurociencias para Educadores  NE24  Ccesa007.pdf
Neurociencias para Educadores NE24 Ccesa007.pdfDemetrio Ccesa Rayme
 

Kürzlich hochgeladen (20)

Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdfTema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
 
la unidad de s sesion edussssssssssssssscacio fisca
la unidad de s sesion edussssssssssssssscacio fiscala unidad de s sesion edussssssssssssssscacio fisca
la unidad de s sesion edussssssssssssssscacio fisca
 
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptxSEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
 
Lecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdadLecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdad
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
 
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptxTECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
TECNOLOGÍA FARMACEUTICA OPERACIONES UNITARIAS.pptx
 
30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf
 
Identificación de componentes Hardware del PC
Identificación de componentes Hardware del PCIdentificación de componentes Hardware del PC
Identificación de componentes Hardware del PC
 
RETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docxRETO MES DE ABRIL .............................docx
RETO MES DE ABRIL .............................docx
 
Sesión de aprendizaje Planifica Textos argumentativo.docx
Sesión de aprendizaje Planifica Textos argumentativo.docxSesión de aprendizaje Planifica Textos argumentativo.docx
Sesión de aprendizaje Planifica Textos argumentativo.docx
 
La empresa sostenible: Principales Características, Barreras para su Avance y...
La empresa sostenible: Principales Características, Barreras para su Avance y...La empresa sostenible: Principales Características, Barreras para su Avance y...
La empresa sostenible: Principales Características, Barreras para su Avance y...
 
Registro Auxiliar - Primaria 2024 (1).pptx
Registro Auxiliar - Primaria  2024 (1).pptxRegistro Auxiliar - Primaria  2024 (1).pptx
Registro Auxiliar - Primaria 2024 (1).pptx
 
Informatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos BásicosInformatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos Básicos
 
Qué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativaQué es la Inteligencia artificial generativa
Qué es la Inteligencia artificial generativa
 
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptxOLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
OLIMPIADA DEL CONOCIMIENTO INFANTIL 2024.pptx
 
Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...
 
La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.La triple Naturaleza del Hombre estudio.
La triple Naturaleza del Hombre estudio.
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf
 
Neurociencias para Educadores NE24 Ccesa007.pdf
Neurociencias para Educadores  NE24  Ccesa007.pdfNeurociencias para Educadores  NE24  Ccesa007.pdf
Neurociencias para Educadores NE24 Ccesa007.pdf
 
Fe contra todo pronóstico. La fe es confianza.
Fe contra todo pronóstico. La fe es confianza.Fe contra todo pronóstico. La fe es confianza.
Fe contra todo pronóstico. La fe es confianza.
 

Análisis LL(1) Descendente

  • 1. Lección 4: Análisis Sintáctico LL(1) 1) Estrategias para el Análisis Sintáctico 2) Análisis Sintáctico descendente 3) Factorización a izda. de gramáticas 4) Eliminación de la recursividad a izda. 5) Construcción de Analizadores Sintácticos predictivos 6) Construcción de Analizadores Sintácticos predictivos no recursivos 7) Construcción de una tabla para el análisis sintáctico predictivo 8) Sobre recuperación de errores en el análisis sintáctico predictivo Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 1
  • 2. Estrategias para analizadores sintácticos • El analizador sintáctico debe verificar si la entrada corresponde a alguna derivación de S • Primera aproximación: “a lo bestia” – generar todas las derivaciones de S posibles – comprobar si la entrada corresponde con alguna de ellas • Inviable, incluso para gramáticas muy sencillas • Son necesarias estrategias más “astutas” • Las estrategias son de dos categorías: – análisis DESCENDENTE (Top-Down) » construye el árbol desde la raíz (S) hasta llegar a las hojas – análisis ASCENDENTE (Bottom-Up) » construye el árbol desde las hojas hacia la raíz (S) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 2
  • 3. Estrategias para analizadores sintácticos • A distintos tipos de analizadores se les da nombres en función a varios elementos: – lectura de tokens (izda. a dcha., viceversa) – método de derivación (izda. o dcha.) – número de tokens de pre-análisis (look-ahead) • Las más comunes: lectura de tokens “left to right” LL(k) LL(k) derivación por izda. k tokens de lookahead LR(k) LR(k) lectura de tokens “left to right” Compiladores I. C.P.S. Universidad de Zaragoza derivación por dcha. -J.Ezpeleta- k tokens de lookahead 3
  • 4. Estrategias para analizadores sintácticos • Propiedades deseables en un analizador sintáctico – eficiente » en general, se buscarán polinomiales en el tamaño del programa a reconocer – determinar la acción reconociendo unos pocos tokens de entrada » como máximo, un k preestablecido » en la práctica, suele ser k=1 – no necesitar “marcha atrás” (backtracking) » i.e., evitar decisiones » las acciones semánticas son difíciles de deshacer – no ocupar mucha memoria » actualmente, esto no es tan importante Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 4
  • 5. Análisis descendente • Básicamente, es un intento de encontrar una derivación por la izda. • Desde el punto de vista del árbol de sintaxis, correspondería a un recorrido en pre-orden • Método: – Objetivo: reconocer S – Método: » se divide el objetivo en subobjetivos (de acuerdo a las producciones) » se trata de cumplir cada subobjetivo » se sigue con cada subobjetivo, hasta que se encuentren concordancias de terminales (o se detecte un error) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 5
  • 6. Análisis descendente • Ejemplo: S → cAd A → ab|a cad S S S S c a d c a d c A d A c a S c a d a c a d d c c d b S c a d b S A c d A S d a Compiladores I. C.P.S. Universidad de Zaragoza c a d c A d a -J.Ezpeleta- 6
  • 7. Análisis descendente • Sobre implementación de analizadores descendentes – la forma más natural es asociar un procedimiento con cada no terminal – cada procedimiento: » comprueba la corrección del token en estudio con el que el propio procedimiento representa • incorrecto: mensaje de error y/o estrategia de recuperación » hacer avanzar al siguiente token – afinando un poco más: » no terminal: genera invocaciones » terminal: concordancia entre terminales • error sintáctico ó • avanzar a token siguiente Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 7
  • 8. S → cAd A → a Análisis descendente • Un ejemplo muy sencillo void S(){ terminal((int)’c’); A(); terminal((int)’d’); } void main(){ elToken=yylex(); S(); } int elToken; int yylex(){ return(getchar()); } void terminal(int t){ if(elToken==t) elToken=yylex(); else errorSintactico(); } void A(){ terminal((int)’a’); } ¿Qué pasa con ? Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- S S A A → → → → cAd cAd a|ab a|ab 8
  • 9. S → cAd A → a|ab Análisis descendente • Una solución predictiva int elToken; int yylex(){ return(getchar()); } void terminal(int t){ if(elToken==t) elToken=yylex(); else errorSintactico(); } void A(){ terminal((int)’a’); if(elToken==(int)’b’) terminal((int)’b’); } Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- void S(){ terminal((int)’c’); A(); terminal((int)’d’); } void main(){ elToken=yylex(); S(); } preanálisis 9
  • 10. Análisis descendente. Un ejemplo • Ejemplo: Se desea construir un analizador sintáctico para la siguiente gramática instruccion → identificador opas expr ‘;’ expr → termino expr’ expr’ → ‘+’ termino expr’ | ε termino → identificador | ‘(’ expr ‘)’ • donde: – “opas” es un terminal de la gramática que representa al operador de asignación. » Corresponde al lexema “:=“ – “identificador” (letra seguido de letras o dígitos) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 10
  • 11. Análisis descendente. Un ejemplo • Como paso previo, necesitamos construir el analizador léxico • Esquema del proceso: lexDescen.l tokens.h flex sinDescen.c lex.yy.c gcc sinDescen.o lex.yy.o -ll gcc elAnalizador Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 11
  • 12. Análisis descendente. Un ejemplo enum{ASIGNACION=257,IDENTIFICADOR}; %{ #include <stdio.h> #include "tokens.h" extern char yytext[]; /*ó extern char *yytext*/ %} /*EXPRESIONES REGULARES*/ separador [t n]+ /*tabs,blancos*/ letra [a-zA-Z] digito [0-9] identificador {letra}({letra}|{digito})* %% {separador} {/*me los como*/} ":=" {return(ASIGNACION);} {identificador} {return(IDENTIFICADOR);} . {return(yytext[0]);} %% /* no hay funciones de usuario */ Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- tokens.h lexDescen.l 12
  • 13. Análisis descendente. Un ejemplo • Para el analizador sintáctico, construi remos un analizador sintáctico descendente recursivo • Ideas básicas del método: – construir un conjunto de procedimientos (recursivos si necesario) » uno por cada no terminal de la gramática – cada procedimiento: » determina la producción a aplicar » invoca los proc. correspondientes » detecta error o pasa al siguiente token – la secuencia de invocaciones a los procedimientos define implícitamente el árbol de sintaxis • En este ejemplo funciona bien por las razones que veremos, pero no siempre es tan sencillo Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 13
  • 14. Análisis descendente. Un ejemplo #include <stdio.h> sinDescen.c #include "tokens.h" int elToken; /*global con sig. token*/ void terminal(int token{ if(elToken==token) elToken=yylex(); else hayError(...INFO(elToken) inesperado...); } void instruccion(){ instruccion → terminal(IDENTIFICADOR); identificador terminal(ASIGNACION); opas expresion ‘;’ expresion(); terminal((int) ‘;’); } void main(){ elToken=yylex(); instruccion(); } Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 14
  • 15. Análisis descendente. Un ejemplo sinDescen.c void termino(){ if(elToken==IDENTIFICADOR) termino → identificador terminal(IDENTIFICADOR); | ( expresion ) else if(elToken=='('){ terminal((int) ‘(‘); expresion(); terminal((int) ‘)‘); }else hayError("Se esperaba un IDENTIFICADOR o '('"); } Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 15
  • 16. Análisis descendente. Un ejemplo expresion → termino expresionP void expresion(){ termino(); expresionP(); } void expresionP(){ if(elToken=='+'){ terminal((int) ‘+‘); termino();expresionP(); } /*else: corresponde a ε */ } Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- sinDescen.c expresionP → + termino expresionP | ε 16
  • 17. Análisis descendente • En general, el método puede presentar incovenientes: – necesidad de backtracking: cuando la regla elegida no es la correcta “devolver” a la entrada todos los tokens recorridos » Ejemplo: instIF → tkIF expr tkTHEN insts | tkIF expr tkTHEN insts tkELSE insts – recursividad a izda.: si alguna regla se define con recursividad a izda., el analizador sintáctico construído entra en un bucle infinito » Ejemplo: expr → expr + term | termino • Soluciones: – factorización a izda. – eliminación de recursividad a izda. Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 17
  • 18. Análisis descendente. Factorización a izda. • Consideremos la gramática A → αC | αB • Si encontramos una cadena derivada de α, ¿Qué producción aplicar? – ¿ Si sigo αC y era αB ? – ¿ Si sigo αB y era αC ? • Idea: retrasar la decisión, de manera que siempre se tome la buena decisión A → αA’ A’ → C | B • Ambas gramáticas generan el mismo lenguaje Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 18
  • 19. Análisis descendente. Eliminación rec. izda. • En analizadores descendentes, la recursividad a izda. da lugar a bucles infinitos • Ejemplo: instruccion → identificador opas expr ‘;’ expr → expr ‘+’ termino | termino termino → identificador | ‘(’ expr ‘)’ • Cuando se trata de derivar velocidad:=(vel1+vel2)+vel3; la invocación “expresion()” se hace recursivamente sin consumir nuevos tokens, dando un bucle infinito Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 19
  • 20. Análisis descendente. Recursividad a izda. • Por suerte, la rec. directa a izda. se puede eliminar mediante una transformación de la gramática A → Aα | β A → βA’ A’ → αA’ | ε • Ambas gramáticas son equivalentes Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 20
  • 21. Análisis descendente. Recursividad a izda. • Aplicando la transformación a la gramática anterior, obtenemos instruccion → identificador opas expr ‘;’ expr → termino expr’ expr’ → ‘+’ termino expr’ | ε termino → identificador | ‘(’ expr ‘)’ • Sin embargo, sólo eliminamos la rec. izda. directa • ¿Qué pasa con A → Bα | α B → AB | β ? Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 21
  • 22. Análisis descendente. Recursividad a izda. • El siguiente algoritmo resuelve el problema [AhSU 90] Algoritmo eliminaRecIzda(E G:GLC; S G’:GLC) --Pre: G=(N,T,P,S) sin “ciclos” (A ⇒+ A) ni -producciones ε (A → ε) ∧ N={A1,...,An} --Post: G’ ≅ G, sin rec. a izda. Para tratamiento de ciclos y Principio G’:=G producciones ε, ver [HoUl 79] Para i:=1 hasta n Para j:=1 hasta i-1 --Aj → δ1|...|δk son las -producciones actuales de Aj sustituir en P’ Ai → Ajα por Ai → δ1α|...|δkα FPara eliminar rec. inmediata de Ai FPara Fin Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 22
  • 23. Análisis descendente Sep 97/98 Ejercicio 4 (1.5 ptos.): Considerar el siguiente código C que corresponde a un analizador sintáctico descendente recursivo. Determinar, a partir del propio código, cuál es la gramática, y decir si el analizador funcionará correctamente. enum token … extern enum token getToken(void); enum token tok; void advance(){ void eat(enum token t){ tok=getToken(); if(tok==t) } advance(); else error(); } Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 23
  • 24. Análisis descendente. Recursividad a izda. void S(){ switch(tok){ case IF: eat(IF);E();eat(THEN); S(); eat(ELSE);S();break; case BEGIN: eat(BEGIN);S();L();break; case PRINT: eat(PRINT);E();break; default: error(); } } void L(){ switch(tok){ case END: eat(END); break; case SEMI: eat(SEMI);S();L();break; default: error(); } } void E(){ eat(NUM); eat(EQ); eat(NUM); } Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 24
  • 25. Analizadores sintácticos predictivos • Un analizador sintáctico predictivo es un analizador sintáctico descendente recursivo que NO necesita marcha atrás • Condición exigible a una gramática para que sea posible: – que en todo momento, a partir del siguiente token de entrada, sea posible determinar qué regla aplicar • Esto es posible cuando (una de dos): – ningún no terminal tiene alternativas en su parte derecha » gramáticas poco interesantes – no terminales con alternativas que empiecen por distintos símbolos • Aunque hay más casos en que también es posible Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 25
  • 26. Analizadores sintácticos predictivos no rec. • El hecho de que haya reglas recursivas hace que el analiziador predictivo implementado directamente sea recursivo • Sin embargo, la recursividad se puede evitar mediante el uso explícito de una pila • Un analizador predictivo sabe, a partir del símbolo que está analizando y el siguiente símbolo de entrada, qué regla aplicar • Por lo tanto, se puede hacer corresponder a una tabla de doble entrada: (token de la forma de frase,sig. token) (no terminal,sig. token) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 26
  • 27. Analizadores sintácticos predictivos no rec. • Esta forma de implementación da lugar anal. sintácticos dirigidos por tabla • Esquema general: Z Y k entrada ..b c b a.. analizador analizador sintáctico sintáctico pila de símbolos (a reconocer) salida S → X X → Z Y k tabla de análisis M[Z,a] Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 27
  • 28. Analizadores sintácticos predictivos no rec. • Esquema de funcionamiento: Pre: M:Nx(T∪{$})→2P:tabla de anál. sint. la sec. de tokens termina con $ Post: sec. de prod. aplicadas o error Variables p:pila de símbolos gramaticales;sigTok,X:token Principio pilaVacia(p);sigTok=yylex();push(p,$,S) Repetir X=cima(p) Si X es terminal ∨ X=$ entonces Si X=sigTok entonces pop(p); sigTok=yylex() Si no errorSintáctico() FSi Si no .... Hasta Que X=$ Fin Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 28
  • 29. Analizadores sintácticos predictivos no rec. Pre: M:Nx(T∪{$})→2P:tabla de anál. sint. la sec. de tokens termina con $ Post: sec. de prod. aplicadas o error Variables p:pila de símbolos gramaticales;sigTok,X:token Principio Repetir ... Si no Si M[X,sigTok]= X→Y1... Yk entonces pop(p) push(p,YkYk-1... Y1) emitir producción X→Y1... Yk Si no errorSintáctico() FSi FSi Hasta Que X=$ Fin Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 29
  • 30. Analizadores sintácticos predictivos no rec. • Ejemplo: reconocer (x;(x)) para ( S S→(A) A A→CB B C C→S ) B→ ε Compiladores I. C.P.S. Universidad de Zaragoza ; S A B C → → → → ( A ) CB ; A | x | S x ε $ A→CB B→;A -J.Ezpeleta- C→x 30
  • 31. pila Analizadores sintácticos predictivos no rec. $S $)A( $)A $)BC $)Bx $)B $)A; $)A $)BC $)BS $)B)A( $)B)A $)B)BC $)B)Bx $)B)B $)B) $)B $) $ Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- entrada (x;(x))$ (x;(x))$ x;(x))$ x;(x))$ x;(x))$ ;(x))$ ;(x))$ (x))$ (x))$ (x))$ (x))$ x))$ x))$ x))$ ))$ ))$ )$ )$ $ producción usada (salida) S→(A) A→CB C→x B→;A A→CB C→ S S→(A) A→CB C →x B →ε B →ε 31
  • 32. Construcción de una tabla para el análisis • Lo fundamental para la construcción de un analizador sintáctico predictivo no rec. construcción de la tabla • Idea básica: uso de las funciones “primero” y “siguiente” • Objetivo: utilizar dichas funciones para construir la tabla de análisis predictivo • Es más: una gramática es LL(1) ssi la tabla construída tiene una única salida para cada entrada Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 32
  • 33. Construcción de una tabla para el análisis • Sea G=(N,T,S,P)una gramática Sea α una cadena de símbolos de la gramática: α ∈ (N ∪ T)* • PRI(α): terminales que pueden comenzar una forma de frase derivable de α PRI(α)={a∈T| α ⇒* aβ} ∪ (Si α ⇒* ε entonces {ε} si no ∅ ) • Importante: para (empezar a) reconocer α, el siguiente token a procesar deberá estar en PRI(α) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 33
  • 34. Construcción de una tabla para el análisis • Paso 1: Calcular los conjuntos PRI(X) para cualquier símbolo gramatical X∈N∪T • Paso 2: Sea X1...Xn ∈ (N ∪ T)* – Añadir a PRI(X1...Xn ) los símbolos de PRI(X1){ε} – Si ε ∈ PRI(X1) – Si ε ∈ PRI(X1) – Si ε ∈ PRI(X1) ∩ añadir a PRI(X1...Xn) los símbolos de PRI(X2) {ε} ∩ PRI(X2) añadir a PRI(X1...Xn) los símbolos de PRI(X3) {ε} PRI(X2) ∩ PRI(X3) añadir a PRI(X1...Xn) los símbolos de PRI(X4) {ε} – ..... – Si ε ∈ PRI(X1)∩ añadir ε a .... ∩ PRI(Xn) PRI(X1...Xn) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 34
  • 35. Construcción de una tabla para el análisis • Paso 1: aplicar el siguiente algoritmo --Pre: X ∈ N∪T --Post: calcula PRI(X) Repetir Si X∈T añadir X a PRI(X) FSi Si X → ε es una producción añadir ε a PRI(X) FSi Si X → Y1...Yk es una producción Si a∈PRI(Yj) ∧ ε∈PRI(Y1)∩... ∩PRI(Yj-1) añadir a a PRI(X) FSi Si ε ∈PRI(Y1)∩... ∩PRI(Yk) añadir ε a PRI(X) FSi FSi Hasta Que no se añada nada a ningún PRI Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 35
  • 36. Construcción de una tabla para el análisis • Ejemplos: S → A B c A → a | B → b | ε ε PRI(S)={a,b,c} PRI(A)={a,ε} PRI(B)={b,ε} PRI(a)={a} PRI(b)={b} PRI(c)={c} PRI(AB)={a,b,ε} S → a S e | B B → b B e | C C → c C e | d Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- PRI(S)={a,b,c,d} PRI(B)={b,c,d} PRI(C)={c,d} PRI(a)={a} PRI(b)={b} .... 36
  • 37. Construcción de una tabla para el análisis • Sea G=(N,T,S,P) una gramática • Sea A un no terminal (A ∈ N) • SIG(A) será el conjunto de todos aquellos terminales que pueden aparecer detrás de A en alguna forma de frase SIG(A)={a∈T| S ⇒+ ...Aa...} ∪ (Si S ⇒+ αA entonces {$} si no ∅ ) • Importante: SIG(A)=conjunto de terminales que pueden indicar (fin del) reconocimiento de una regla que tenga A en la parte izda. Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 37
  • 38. Construcción de una tabla para el análisis • Construcción de los conjuntos SIG --Pre: TRUE --Post: calcula SIG(A) para todo A ∈ N añadir $ a SIG(S) Repetir Si A → αBβ es una producción añadir PRI(β){ε} a SIG(B) FSi Si A → αB es una producción ∨ (A → αBβ con ε∈PRI(β) es producción) añadir SIG(A) a SIG(B) FSi Hasta Que no se añada nada a ningún SIG Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 38
  • 39. Construcción de una tabla para el análisis • Ejemplos: S → A B c A → a | B → b | SIG(S)={$} SIG(A)={b,c} SIG(B)={c} ε ε S → a S e | B B → b B e | C C → c C e | d Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- SIG(S)={e,$} SIG(B)={e,$} SIG(C)={e,$} 39
  • 40. Construcción de una tabla para el análisis • Construcción de la tabla: – filas indexadas por no terminales – columnas indexadas por terminales (∪ {$}) • Ideas a seguir para la producción A→α – Si a∈PRI(α), cuando entra a se expande A por α – Si α = ε ó α ⇒* ε » expandir A por α cuando llegue algo de SIG(A) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 40
  • 41. Construcción de una tabla para el análisis Pre: Una gramática G=(N,T,S,P) Post: M: tabla de anál. desc. Principio Para cada (n,t)∈Nx(T∪{$}) M[n,t]:= ∅ /*¿Conjunto?*/ FPara Para cada producción X → α Para cada a∈PRI(α) M[X,a]:= M[X,a]∪{X → α} FPara Si ε∈PRI(α) entonces Para cada b∈T∩SIG(X) M[X,b]:= M[X,b]∪{X → α} FPara Si $∈SIG(X) entonces M[X, $]:= M[X, $]∪{X → α} FSi FSi FPara Para cada (n,t)∈Nx(T∪{$}) Si M[n,t]=∅ ent M[n,t]=ERROR FSi FPara Fin Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 41
  • 42. Construcción de una tabla para el análisis Una gramática es LL(1) cuando en la gramática LL(1) tabla construída según el método anterior cada elemento es una de las dos cosas siguientes: *ERROR *un conjunto con una única producción • Aternativamente, G es LL(1) ssi para toda producción A → α |β – α y β no pueden derivar cadenas que comiencen por un mismo terminal a – ¬( (α ⇒* ε ) ∧ (β ⇒* ε ) ) – Si β ⇒* ε , α no deriva ninguna cadena que comience con un elemento de T∩SIG(A) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 42
  • 43. Construcción de una tabla para el análisis • Notar las ventajas de LL(1): – por cada token de entrada, sabemos exactamente qué producción se debe aplicar – no hay backtracking – asegura un anal. descendente correcto – no son ambíguas función de long. – complejidad de los anal. LL(1) : de la cadena de tokens » lineal en tiempo » lineal en espacio • ¿Si la gramática no es LL(1)? – intentar transformarla en LL(1) – no siempre es posible – aunque aparecen con mucha frecuencia Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- • También existen gramáticas LL(k) que emplean una generalización de las técnicas presentadas 43
  • 44. Sobre recuperación/reparación de errores • ¿Cuál es el objetivo de la recuperación de errores? – no abortar la compilación – informar de las decisiones tomadas • Situación de error: pila A . . . $ ... b ... entrada T(A,b)=error • ¿Cómo recuperarse de la situación? – recuperación: eliminar símbolos de la entrada o de la pila hasta llegar a un estado que pueda seguir – reparación: “reparar“ la entrada del usuario Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 44
  • 45. Sobre recuperación/reparación de errores • Recuperación – modo pánico: eliminar símbolos de la entrada hasta encontrar alguno específico del conjunto de sincronización • Reparación: – supongamos una entrada en el estado αtβ, donde α es lo ya analizado y t el siguiente token – tres actuaciones posibles: » modificar α » insertar un δ esperando que αδtβ sea del lenguaje » eliminar t esperando que sea αβ del lenguaje Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 45
  • 46. Sobre recuperación/reparación de errores ... x := 27 z ; y := 29 ; ... insts insts inst instAS instMQ ... → → → → → insts ‘;’ inst inst instMQ | instAS | ... tkID tkOPAS exp tkMQ exp insts • al encontrar “z” podemos tratar de arreglarlo como: – Se esperaba “;” – por lo que lo “insertamos”. Sin embargo .... – Se esperaba “;” – por lo que seguimos hasta encontrarlo. Sin embargo .... Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 46
  • 47. Sobre recuperación/reparación de errores • No hay un método universal, por lo que se aplican ciertas reglas heurísticas • Para cada no terminal, definamos sinc(A) • Veamos algunos elementos a añadir en sinc(A) – añadir SIG(A) a sinc(A) – usar la jerarquía del lenguaje » añadir el conjunto de sinc de un nivel a los inferiores Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- bloque ↓ instrucción ↓ expresión ↓ término ↓ factor .... 47
  • 48. Sobre recuperación/reparación de errores • Ejemplo: insts → inst insts’ insts’ → inst → instAS → instMQ → ε inst insts’ | instMQ | instAS | ... tkID tkOPAS exp ‘;’ tkMQ ‘(‘ exp ‘)’ insts ... Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- x = 3 While (x > y) { .... } 48
  • 49. Sobre recuperación/reparación de errores – para A∈N, añadir PRI(A) a sinc(A) » Seguir análisis por A cuando llegue uno de ellos ε, cima(p)=A, » disparar A ⇒* ε – si A ⇒* – si cima(p)=x y x<>sigToken (x es terminal) » eliminar x de la pila » dar mensaje “x ha sido insertado” Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- Es una inserción “virtual” 49
  • 50. Sobre recuperación/reparación de errores procedure pruebaErrores1 is x: integer; gnatmake y: integer := 1; begin 5:15: missing ";" x := 3 9:13: missing operand while x>y loop x := x-1; end loop; x := ; end; int main(){ int x, gcc y = 1; 6: parse error before `while' x = 3 while(x>y) x = x-1; x = ; 8: parse error before `;' } Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 50
  • 51. Sobre recuperación/reparación de errores procedure pruebaErrores2 is x: integer; gnatmake y: integer := 1; 10:10: binary operator expected begin 14:08: missing operand x := 3 z; while x>y loop x := x-1; end loop; x := ; end; int main(){ int x, gcc y = 1; 5:parse error before `z` x = 3 z; while(x>y) x = x-1; x = ; 8:parse error before `;` } Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 51
  • 52. Sobre recuperación/reparación de errores int main(){ int x, y = 1; x = 3 while(x>y) x = x-1; x = ; lint line line line line line line line line 6: 7: 8: 5: 5: 5: 1: 1: } error 1000: Unexpected symbol: "while". error 1000: Unexpected symbol: "x". error 1000: Unexpected symbol: ";". error 1533: Illegal function call. warning 714. error 1549: Modifiable lvalue required for assignment operator. warning 517: Function returns no value. warning 845: errors seen skipping the code including function. Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 52
  • 53. Sobre recuperación/reparación de errores NAME lint - a C program checker/verifier SYNOPSIS lint [options] file ... DESCRIPTION lint attempts to detect features in C program files that are likely to be bugs, non-portable, or wasteful. It also checks type usage more strictly than the compilers. Program anomalies currently detected include unreachable statements, loops not entered at the top, automatic variables declared but not used, and logical expressions whose value is constant. Usage of functions is checked to find functions that return values in some places and not in others, functions called with varying numbers or types of arguments, and functions whose values are not used or whose values are used but none returned. Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 53
  • 54. Ejercicios •Ejercicio 1: Considérese la siguiente gramática: Jun. 96 S → [ S | S1 S1→ [a] •1.1) (1 pto.) Establecer el lenguaje que genera. Es necesario que se justifique, lo más formalmente posible, la respuesta •1.2) ..... •1.3) (1 pto.) ¿Se trata de una gramática LL(1)? •1.4) (0.5 ptos.) Si no es SLR(1), dar una gramática equivalente que sí lo sea. Análogamente, si no es LL(1) dar una gramática equivalente que sí lo sea.. Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 54
  • 55. Ejercicios Ejercicio 2 (5 ptos. ) : Considérese la siguiente gramática (en negrita los terminales): S S L L → → → → Feb. 96 ( L ) a L , S S 2.1 (0.5 ptos.) ¿Qué lenguaje genera? 2.2 ..... 2.3 (2 ptos.) Evidentemente, se trata de una gramática no LL(1). Transformarla en una equivalente que sí lo sea, y contruir la tabla del análisis sintáctico LL(1) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 55
  • 56. Ejercicios Sep. 98 Ejercicio 3 (5.5 ptos. Sep. 98): Considérese la siguiente gramática: G: S → uBDz B → Bv B→w D → EF E→y E→ε F→x F→ε 1) Construir las tablas del análisis sintáctico SLR, y determinar si se trata de una gramática SLR o no 2) Comprobar que se trata de una gramática no LL(1). Transformarla en una gramática LL(1), y calcular su tabla de análisis LL(1) Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 56
  • 57. Ejercicios Ejercicio 3 (3.0 ptos.): Considerar la siguiente gramática (en negrita los terminales): S → P M P → E | q M → n E E → , O | E O → u | u,O Feb. 98 Probar que se trata de una gramática NO LL(1). Si es posible, realizar las transformaciones precisas para convertirla en LL(1) y, construyendo la tabla del análisis LL(1), demostrar que la gramática transformada es efectivamente de esta clase. Es necesario justificar las transformaciones que se realicen. Si no fuera posible transformarla en LL(1), explicar la razón Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 57
  • 58. Ejercicios • Ejercicio 2 (1.5 ptos.): Dada una secuencia ω determinales el algoritmo de análisis LL(1) emite la secuencia de producciones aplicadas para su derivación, o error si no es capaz de encontrarla. Vamos a denotar n el número de no terminales de la gramática, y |ω| la longitud de la secuencia de entrada. Se sabe que, en el caso de que el algoritmo dé respuesta afirmativa, el coste de ejecución del algoritmo es Ω(|ω|), Ο(n|ω|). En el cálculo de este coste se han considerado como operaciones de coste constante las siguientes: – – – – obtener la cima de la pila apilar y desapilar símbolos gramaticales obtener el siguiente terminal de la sencuencia de entrada consultar el valor en la tabla correspondiente a un par (no terminal, terminal) – emitir una producción Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 58
  • 59. Ejercicios • Consideremos ahora la siguiente gramática: – X1 – X2 – X3 – X4 – .... – Xn-1 – Xn --> --> --> --> X2 a2 a3 a4 X2 X2 | X3 | X4 | X5 --> an-1 | Xn --> an • El ejercicio pide escribir dos frases del lenguaje generado por la gramática anterior, w1 y w2, tal que los costes de ejecución del algoritmo de reconocimiento sean, respectivamente, del orden de |w1| y n|w2|. • ¿Cuál puede ser el coste del algoritmo, en el mejor y el peor caso, cuando se aplica a una frase que no es reconocida por el análisis LL(1)? • Nota: en todos los casos la respuesta debe ser razonada. Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 59
  • 60. Sintaxis expresiones en Pascal [ expresión identif. de variable ] , variable . identificador de campo identif. de campo ^ expresión expresión simple = < > <= >= <> IN expresión simple Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 60
  • 61. Sintaxis expresiones en Pascal expresión simple + término - + - OR mod and término término factor * / div factor Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 61
  • 62. Sintaxis expresiones en Pascal factor constante sin signo variable identificador de función ( expresión ) , ( NOT [ expresión ) factor expresión .. expresión ] , Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 62
  • 63. Sintaxis expresiones en Pascal constante sin signo identificador de constante numero sin signo NIL ' Compiladores I. C.P.S. Universidad de Zaragoza caracter -J.Ezpeleta- ' 63
  • 64. Sintaxis expresiones en Pascal expr: expSimple | expr opRel expSimple expSimple: term | expSimple opSum term opRel: '=' | '<' | '>' | MEI | MAI | NI Compiladores I. C.P.S. Universidad de Zaragoza opSum: '+' | '-' | OR term: factor | '+' term | '-' term %prec '-' | term opMul factor opMul: '*' | '/' | DIV | MOD | AND -J.Ezpeleta- 64
  • 65. Sintaxis expresiones en Pascal factor: constante | IDENTIFICADOR | IDENTIFICADOR '[' expr ']' | IDENTIFICADOR '(' listaActuales ')' | '(' expr ')' | NOT factor %prec NOT constante: CONSTENTERA | CONSTBOOLEANA | CONSTCADENA | CONSTCARACTER Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 65
  • 66. Sintaxis expresiones en Ada expression relation | relation | relation | relation | relation [...]: 0 ó 1 {...}: 0 ó más ::= {and relation} {and then relation} {or relation} {or else relation} {xor relation} relation ::= simple_expression [relational_operator simple_expression] | simple_expression [not] in range | simple_expression [not] in subtype_mark simple_expression ::= [unary_adding_operator] term {binary_adding_operator term} term ::= factor {multiplying_operator factor} factor ::= primary [** primary] | abs primary | not primary Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 66
  • 67. Sintaxis expresiones en Ada [...]: 0 ó 1 {...}: 0 ó más primary ::= numeric_literal | null | string_literal | aggregate | name | qualified_expression | allocator | (expression) logical_operator ::= and | or | xor relational_operator ::= = | /= | < | <= | > | >= binary_adding_operator ::= + | - | & unary_adding_operator ::= + | multiplying_operator ::= * | / | mod | rem highest_precedence_operator ::= ** | abs | not Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 67