Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Leccin 11,12,13
Gramticas Libres del Contexto
- 4.1 -
Definicin de Gramtica
Una gramtica G es una tupla (T,N,I,P)
donde:
- 4.2 -
Ejemplo de Gramtica
La gramtica G=(N,T,I,P) donde,
N={I,A,B}
T={x,(,),+,-,*,/}
P={
II+I
II-I
IA
AA*A
AA/A
A(I)
Ax
x, x*x
x*x+x
x*(x/x)
x-x+x*x/x
- 4.3 -
Pasos de Generacin
Secuencia: x*x+x
I+I
x*A+A
A+I
x*x+A
A*A+I
A*A+A
x*x+x
Arbol sintctico:
I
A
A *
x
I
A
- 4.4 -
Generales
Complejidad del anlisis: no se puede con
memoria finita.
- 4.5 -
Solucin:
Utilizar una gramtica libre del contexto
que tiene una complejidad lineal y dejar las
caractersticas del lenguaje dependientes
del contexto para el anlisis semntico.
- 4.6 -
Terminal:
Forma nica: secuencia de caracteres que
lo forma.
Ej. if, +, then, for
Secuencia vaca:
Operadores:
Unin: |
Secuencia:
Opcional: [ |
Repeticin: {}= | | | |...
- 4.7 -
Ejemplo
Gramtica simplificada de la declaracin
de una variable en C.
<dec>::=<tipo> <var> {, <var>};
<tipo>::=[signed|unsigned] (int|char)
<var>::={*} identificador {[ nmero ]}
Smbolos terminales: signed, unsigned, int,
char, identificador, nmero, [, ], ,
Smbolos no terminales: <dec>, <tipo>,
<var>
Smbolo inicial: <dec>
Secuencias vlidas:
int a,**b[3][4];
unsigned char *p;
signed char str[100];
- 4.8 -
<operando>
* <operando>
identificador
identificador
identificador
- 4.9 -
<factor>
<factor>
identificado
<trmino>
identificador
<factor>
identificador
- 4.10 -
Ej. -, /
<operacin>::=<operando>{<operando>}
<operacin>
<operando> <operando> <operando>
Operacin asociativa por la derecha:
abc = abc)
Ej. = (asignacin)
<operacin>::=<operando>[<operacin>]
<operacin>
<operando>
<operacin>
<operando>
<operando>
- 4.11 -
Ambigedad Gramatical
Una gramtica es ambigua si puede generar
una secuencia de smbolos con dos rboles
sintcticos diferentes.
Ejemplo: <a> ::= <a> (+ | *) <a> | nmero
Secuencia: 1*2+3
Arboles sintcticos generados:
<a>
<a>
<a>
<a>
<a> + <a>
<a> * <a> nmero
nmero nmero
- 4.12 -
Diagramas Sintcticos
No Terminal
Diagrama sintctico de un
smbolo no terminal
No Terminal
Smbolo no terminal
Terminal
Smbolo Terminal
sumas
nmero
nmero
- 4.13 -
Ejemplo
Diagramas sintcticos para expresiones
aritmticas.
expresin
trmino
+
trmino
trmino
factor
*
factor
/
-
factor
identificador
factor
nmero
(
expresin
- 4.14 -
No terminal
Diagrama sintctico
de la expresin BNF
<no terminal>
No Terminal
Terminal
Terminal
- 4.15 -
Diag. sint.
de
Diag. sint.
de n
n
Diag. sint.
de
Diag. sint.
de
Diag. sint.
de n
- 4.16 -
Diag. sint.
de
Diag. sint.
de
- 4.17 -
instruccin
Diagrama sintctico de
if <condicin> then <instruccin>
[else <instruccin>]
- 4.18 -
instruccin
Diag.
Diag.
Diag.
if
<condicin>
then
Diag.
<instruccin>
Diag.
[else <instruccin>]
Diag. if
if
Diag. then
then
Diag. <condicin>
condicin
Diag. <instruccin>
instruccin
- 4.19 -
Diag. sint. de
else <instruccin>
Diag.
Diag.
else
<instruccin>
Diag. else
else
Diag. <instruccin>
instruccin
instruccin
if
condicin
else
Compiladores (05/02/15 04:50)
then
instruccin
instruccin
- 4.20 -
- 4.21 -
Reconocer:
aabccd
- 4.22 -
T+ Primero() = { x | x... y x T}
Primero(i) Primero(j) = i j
Ejemplo:
S ABe
SC
A dB
A aS
A c
B AS
Bb
Cb
Primero(S) = {a,b,c,d}
Primero(A) = {a,c,d}
Primero(B) = {a,b,c,d}
Primero(C) = {b}
- 4.23 -
*
Primero() = { | ...
y T}
Siguientes: concepto N
*
Siguiente() = { | S
Primero() y
S es el smbolo inicial y
T}
- 4.24 -
- 4.25 -
B+I
CAB
DCA
- 4.26 -
,aT
(Pn(A)-{})PrimerosDe()
sino Pn(A)
- 4.27 -
P(T) P(B)
{} {}
{}
{x}
{x} {}
{x} {}
{x} {}
P(F) P(C)
{}
{x} {}
{x} {}
{x} {}
- 4.28 -
- 4.29 -
Primeros
P(I)
{x}
P(T) P(B)
{x} {}
P(F) P(C)
{x} {}
S(I) S(T)
S(B) S(F)
S(C)
{}
{} {} {} {}
{} {} {} {} {}
{} {} {} {} {}
- 4.30 -
S( A )
P()
X : A
Problema:
Estas definiciones generan recursividades
infinitas que tras su estudio se pueden eliminar
- 4.31 -
siguiente
- 4.32 -
Tabla de Producciones
1
5
6
- 4.33 -
Tabla de prediccin
No terminales
Terminales
+
- 4.34 -
- 4.35 -
noterminal ( ) {
Parser[Diagrama sintctico]
};
Diag. sint.
de
Diag. sint.
de
Diag. sint.
de n
{
Parser[
Parser[
...
Parser[n
}
Compiladores (05/02/15 04:50)
- 4.36 -
Diag. sint.
de n
switch (SLA) {
case ( Primero()) : Parser[] break;
case (Primero()) : Parser[] break;
...
case (Primero(n)) : Parser[n] break;
default: error();
}
- 4.37 -
Diag. sint.
de
while (SLAPrimero() )
Parser[
No Terminal
Noterminal( );
Terminal
- 4.38 -
- 4.39 -
Parser[n]
switch (SLA) {
case ( Primero()) : Parser[] break;
case (Primero()) : Parser[] break;
...
case (Primero(n)) : Parser[n] break;
default: error();
}
- 4.40 -
- 4.41 -
Consideraciones:
No se pueden solucionar correctamente
todos los casos.
Hay que considerar la psicologa del
programador.
Como mnimo tratar correctamente los
errores ms comunes.
Minimizar:
Error no detectados
Falsas alarmas
- 4.42 -
- 4.43 -
Correccin de Errores
Despus de un error aadir o quitar
smbolos hasta poder continuar el anlisis
sintctico.
Aadir: ir hacia delante dentro de la
gramtica.
Quitar: ir hacia atrs dentro de la
gramtica.
- 4.44 -
Lecciones 17,18
- 4.45 -
Ejemplo
Gramtica
II+I | I-IA
AA*A | A/A(I) |num
Expresin 1+2*3
Derivacin: I => I+I => num+I => num+A =>
num+A*A => num+num*A => num+num*num
La reduccin de smbolos supone ir de derecha a
izquierda en los pasos de derivacin
1 + 2 * 3
num+num*num
A
I
Compiladores (05/02/15 04:50)
- 4.46 -
Gramticas LR(k)
El conjunto de las gramticas LR(k) es el
conjunto de las gramticas libres del
contexto no ambiguas
El conjunto de las gramticas LR(k)
contiene las gramticas LL(k).
k es el nmero de smbolos que hay que
considerar hacia delante antes de que el
analizador sintctico realice una accin.
Solo se consideran las gramticas LR(0) y
LR(1) ya que para k>1 el anlisis tiende ha
ser demasiado costoso.
Familias de gramticas
demasiado costoso
LR(k)
LR(1)
equivalentes
por transformacin
LALR(1)
SLR(1)
demasiado simple
Compiladores (05/02/15 04:50)
LL(1)
LR(0)
- 4.47 -
t T*
- 4.48 -
Como es un parser LR
Es una mquina con
como entrada la secuencia a analizar
una pila
un mecanismo de control finito formado
por:
estados de lectura
Lee un smbolo, lo pone en la pila y salta a
un nuevo estado
un estado inicial
- 4.49 -
Gramtica LR(0)
Gramtica
Estado reductor
SE#
ET | E+T | E - T
Ti | (E)
T
+
EE+T
SE#
Estado de lectura
Ti
EE-T
T
2
ET
T
(
10
11
T(E)
- 4.50 -
Trazado
Secuencia: i-(i+i)#
Paso
Pila
Entrada Prefijo
Grupo
i-(i+i)#
0 i3
-(i+i)#
0 T2
-(i+i)#
0 E1
-(i+i)#
0 E1 -7
(i+i)#
E-
0 E1 -7 (4
i+i)#
E-(
0 E1 -7 (4 i3
+i)#
E-(i
0 E1 -7 (4 T2
+i)#
E-(T
0 E1 -7 (4 E10
+i)#
E-(E
0 E1 -7 (4 E10 +6
i)#
E-(E+
10
0 E1 -7 (4 E10 +6 i3
)#
E-(E+i
11
0 E1 -7 (4 E10 +6 T8
)#
E-(E+T E+T
12
0 E1 -7 (4 E10
)#
E-(E
E+T
13
0 E1 -7 (4 E10 )11
E-(E)
(E)
14
0 E1 -7 T9
E-T
E-T
15
0 E1
16
0 E1 #5
17
E#
Aceptado
- 4.51 -
Gramticas no LR(0)
Gramtica LR(0)
SE#
ET | E+T | E - T
Ti | (E)
Gramtica No LR(0)
S E#
E E - T
ET
T F ^ T
TF
F (E)
Fi
- 4.52 -