Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Gramaticas PDF
Gramaticas PDF
Gramaticas PDF
Gramticas
friosam@prodigy.net.mx
II
GRAMTICAS.
.......................
34
.......................
37
.......................
41
.......................
44
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
33
34
Gramticas
friosam@prodigy.net.mx
Programa
Fuente
ANALIZADOR
ANALIZADOR
LXICO
SINTCTICO
rbol de
reconocimiento
(rbol de parse)
tokens
Expresiones regulares
Gramticas
LyA
34
= especificacin de tokens.
35
friosam@prodigy.net.mx
Gramticas
Los programas analizadores sintcticos que se basan en gramticas para reconocer las
instrucciones residentes en el programa fuente se denominan Parsers (reconocedores).
Las dos clases de parser ms comunes son :
Parser Descendente ( Top Down )
Parser Ascendente ( Bottom Up )
INSTRUCCIONES
Especificacin
Reconocimiento
Gramticas
1. Parser Descendente
( Top Down )
2. Parser Ascendente
( Bottom Up )
scanf (%d,&iNum);
scanf (%f,pfNum);
scanf (%s %d,sNom,&iTen);
scanf (%c,&asCar[i]);
scanf (%d %f %d,piEnt1,pfReal,piEnt2);
.....
35
36
friosam@prodigy.net.mx
Gramticas
Podemos llegar a ciertas conclusiones hechndole un vistazo a la fig. 2.3. Entre las
cuestiones que mas nos interesan, estn :
1. Las n instancias son un conjunto de tokens concatenados. La instancia 1 tiene 8
tokens debidamente concatenados :
scanf
Palabra reservada
Separador
%d
CteLit
Separador
&
Operador de Direccin
iNum
Identificador
Separador
Terminador de Instruccin
LyA
36
37
friosam@prodigy.net.mx
Gramticas
read
readln
read (P)
readln (P)
P, id
id
37
38
friosam@prodigy.net.mx
Gramticas
LyA
La gramtica es :
A
E
E
E
T
T
T
F
id := E;
E+T
E -T
T
T*F
T/F
F
id
38
39
9)
10)
11)
F
F
F
friosam@prodigy.net.mx
Gramticas
num
(E)
-E
id := E;
E+TE-TT
T*FT/F F
id num (E) -E
Ejemplo 2.3 Veamos una gramtica que nos genera el lenguaje de todos los
nmeros enteros pares :
N
N
K
K
L
L
L
L
P
P
P
P
P
Z
Z
...
...
Z
D
KP
L
KD
Z
2
4
6
8
0
2
4
6
8
1
2
9
0
39
40
D
D
...
...
D
friosam@prodigy.net.mx
Gramticas
1
2
VT = { 0, 1, 2..., 9 }
VN = { N, K, L, Z, D, P }
S=N
La gramtica con la agrupacin de las alternativas para cada variable sintctica es :
N
K
P
L
D
Z
KP L
KD Z
0 2 4 6 8
2468
0 1 ... 9
1 2 ...9
tiene 32 producciones
LyA
LyA
40
41
Gramticas
friosam@prodigy.net.mx
Gramticas no restringidas.
Gramticas sensibles al contexto.
Gramticas de contexto libre.
Gramticas regulares.
Ejemplo :
(1)
(2)
(3)
(4)
(5)
(6)
S
S
bB
bC
CB
cC
aSBC
abC
bB
bb
bC
bc
CB
BC
cC
cc
41
42
friosam@prodigy.net.mx
Gramticas
Pero,...Porqu eso de
sensibles al contexto ?
LyA
bb
bC
bc
CB
BC
42
43
friosam@prodigy.net.mx
Gramticas
LyA
, donde y VN.
Ejemplo :
S
C
C
aCa
aCa
b
NO MS
Gramticas Regulares.- Son aquellas que contienen slo producciones de la forma
43
44
Ejemplo :
S
S
B
C
C
friosam@prodigy.net.mx
Gramticas
aS
aB
bC
aC
a
aS
aB
bC
aC
a
a=a
a=a
a=b
a=a
a=a
,
,
,
,
B=S
B=B
B=C
B=C
44
45
friosam@prodigy.net.mx
Gramticas
pero ...
Existen varias formas de visualizar el proceso mediante el cual una gramtica genera o
define a un lenguaje. A continuacin veremos dos de ellas :
Derivaciones
Arboles de Reconocimiento (Arboles de Parse).
Herramientas para generar un lenguaje
utilizando una gramtica :
LyA
Derivaciones
Arboles de parse
45
46
friosam@prodigy.net.mx
Gramticas
Derivaciones.
Supongamos la gramtica del ejemplo 2.1, que define al lenguaje de la instruccin de
lectura en Pascal.
R
P
LyA
46
47
(1)
friosam@prodigy.net.mx
Gramticas
(2)
LyA
decimos que R es definido por las cadenas read o readln o read(P) o bien readln(P). La
definicin del smbolo no terminal R est en funcin de los tokens read, readln, ( , ) y la
variable sintctica -smbolo no terminal- P. Para la definicin de P, se utilizan dos
producciones :
P
P,id id
LyA
Gramticas
48
friosam@prodigy.net.mx
Gramticas
readln (P)
readln (P,id)
readln (P,id,id)
readln (id,id,id)
//
//
//
//
R
P
P
P
readl (P)
P,id
P,id
id
...
Cadena de L(P)
id (,id) 0 = id = id
id (,id) 1 = id,id
P * readln (x) ?
NUNCA
LyA
48
49
Gramticas
friosam@prodigy.net.mx
id = E
E+T E-T T
T*F T/F F
id num -E (E)
id = E
id = E+T
id = T+T
id = F+T
id = id+T
id = id+T*F
id = id+F*F
id = id+num*F
id = id+num*id
A *
x = y+5*z .
Produccin Aplicada
A
E
E
T
F
T
T
F
F
id = E
E+T
T
F
id
T*F
F
num
id
LyA
49
!!
50
Gramticas
friosam@prodigy.net.mx
A id = E id = E+T id = T+T
E
T
En una derivacin ms a la izquierda
siempre sustitumos a la no terminal que se
encuentra ms a la izquierda.
LyA
id
id
id
id
id
id
id
id
id
id
id
id
Produccin Aplicada
= E
= E+T
= T+T
= T*F+T
= F*F+T
= -E*F+T
= -T*F+T
= -F*F+T
= -id*F+T
= -id*id+T
= -id*id+F
= -id*id+num
LyA
A
E
E
T
T
F
E
T
F
F
T
id = E
E+T
T
T*F
F
-E
T
F
id
id
F
num
51
Gramticas
friosam@prodigy.net.mx
Produccin Aplicada
id = E
id = E
id = E+T
E+T
id = E+T*F
T*F
id = E+T*id
id
id = E+F*id
id = E+num*id
num
id = T+num*id
id = F+num*id
id = id+num*id
id
id = E + T
id = E+T id = E+T*F
51
52
Gramticas
friosam@prodigy.net.mx
Derivacin a la derecha
Produccin Aplicada
id = E
id = E
id = E+T
E+T
id = E+F
id = E+num
num
id = T+num
id = T*F+num
T*F
id = T*id+num
id
id = F*id+num
id = -E*id+num
-E
id = -T*id+num
id =
-F*id+num
id =
-id*id+num
id
Reconocedores descendentes.
Derivaciones a la derecha ... utilizadas por :
LyA
Reconocedores ascendentes.
52
53
Gramticas
friosam@prodigy.net.mx
Ejemplo 2.6 Encontrar el lenguaje generado L(G) por la gramtica cuyo conjunto
de producciones es :
S
C
C
aCa
aCa
b
aCa
aCa b
Paso 1.
Agrupar las producciones.
aCa
aCa
aba
Paso 2.
Obtener las sentencias simples,
empleando slo combinaciones de
producciones no recursivas.
Derivacin
Produccin utilizada
S aCa
aba
S
C
aCa
b
LyA
Ohh !! ...
Existe un smbolo b y en su
contexto, observo que a la
izquierda y a la derecha se tiene un
smbolo a .
53
LyA
54
Gramticas
friosam@prodigy.net.mx
aCa
aCa
aCa
aabaa
C
aCa
aaabaaa
C
aaaabaaaa
La regla C
aCa produce el mismo nmero de as a la izquierda y a la derecha de la
b.
Podemos concluir, que el lenguaje generado por G= ( {a,b}, {S,C}, S, ) es :
L (G) =
{ an b an n > 0 }
Y para n = 0 ?
LyA
R
P
//
1a. cadena
read
R readln
//
2a. cadena
54
55
R
readln
R read (P)
R
read(P)
read (id)
//
readln(P)
3a. cadena
id
Gramticas
friosam@prodigy.net.mx
//
4a. cadena
id
Ahora, apliquemos la regla recursiva para observar el conjunto de cadenas que produce :
R
R
read(P)
read(P)
read(P,id)
P,id
read(P,id,id)
read(id,id)
P
P,id
read(P,id,id,id)
P,id
read(id,id,id)
id
id
read(id,id,id,id)
P
id
Juntemos las sentencias anteriormente derivadas en una tabla, y observemos las partes
que las componen :
Sentencia
read
readln
read(id)
readln(id)
read(id,id)
readln(id,id)
read(id,id,id)
readln(id,id,id)
Parte 1
Parte 2
read
readln
read
readln
read
readln
read
readln
(id )
(id)
(id,id)
(id,id)
(id,id,id)
(id,id,id)
Ejemplo 2.8
S
S
B
C
C
aS
aB
bC
aC
a
55
56
Gramticas
friosam@prodigy.net.mx
Instruccin = concatenacin de
tokens !!
LyA
S
B
C
aB
bC
a
aB
aB abC
B
bC
aba
aB
S
aB
abC
bC
abaC
C
aC
abaaC
abaaaC
aC
abaa
aC
abaaa
56
aC .
abaaaa
C
57
friosam@prodigy.net.mx
Gramticas
Reglas recursivas
de ms abajo ? !!
LyA
aaba
aaaba
aaaaba
aaaaaba
La regla S
aS produce as a la izquierda de la b !! . As, el lenguaje generado es
identificado como :
N
N
P
P
P
P
P
D
D
D
D
.
D
DN
P
0
2
4
6
8
0
1
2
3
9
57
58
G:
N
P
D
friosam@prodigy.net.mx
Gramticas
DN P
0 2 4 6 8
0 1 2 3 4 5 6 7 8 9
DN
DN
N
DP
P
DN.
D0 00
P
10
D
D2
P
N DN
N
DN
Pares de 2 cifras
DDN
DN
02
20
DDDN
DN
La recursividad en N
DN , produce
dgitos a la izquierda de un dgito par.
La gramtica genera nmeros pares,
incluyendo al cero.
58
LyA
59
Gramticas
friosam@prodigy.net.mx
aS
bA
aA
aB
b
S
A
B
Recuerda !!
El primer paso es
agrupar las producciones
LyA
Recursivas
S
A
No recursivas
aS
aA
S
A
B
bA
aB
b
S bA baB
bab
Cadena ms simple
bA
bA
A
baA
aA
baab
baaB
aB
baaab
baaA baaaB
59
60
A
aA
friosam@prodigy.net.mx
aB
baaaab
baaaA baaaaB
A
aA
aB
baaaaA baaaaaB
baaaaab
aA
aB
Gramticas
La regla A
aA
produce as entre las dos
bs .
LyA
Slo falta aplicar la otra regla recursiva. Observemos las cadenas que produce :
S aS abA abaB
aaS aabA aabaB
aaaS aaabA aaabaB
aaaaS aaaabA aaaabaB
abab
aabab
aaabab
aaaabab
S
aS agrega as a
la izquierda de la
primera b
60
61
Gramticas
friosam@prodigy.net.mx
read(P)
P,id
read
(
P
id
id
id
En el rbol se aprecian 6 nodos sin hijos, es decir, hojas. Todos ellos etiquetados por un
token. La raz es el smbolo de inicio R de la gramtica. Los nodos intermedios son 2 y
ambos son etiquetados por la variable sintctica P.
Tomemos la gramtica del ejemplo 2.3 cuyo lenguaje generado son los nmeros pares
excluyendo al cero. El nmero par nunca empieza con cero. La derivacin para la
sentencia N * 768 y el rbol de parse son los siguientes :
N
K
K
KP
KD
8
D
7
N KP
N
KP
KDP
K
KD
ZDP
7DP
7
76P
D
768
P
La raz del rbol es etiquetado con el smbolo de inicio N. Existen 3 hojas etiquetadas
por los tokens 7,6 y 8. Los nodos intermedios son 5, etiquetados por los smbolos no
terminales K, Z, D y P.
Ambigedad.
Se dice que una gramtica es ambigua, si sta produce ms de un rbol de
reconocimiento (parse) para una misma sentencia. O de otra manera, cuando la
61
62
Gramticas
friosam@prodigy.net.mx
gramtica produce ms de una derivacin -ya sea izquierda derecha- para una misma
sentencia.
Supongamos la gramtica :
E
G = ( { +, -, *, /, id, num }, { E }, E, )
Obtengamos la derivacin para la sentencia : 5 + id * 9
(1) E E+E num+E num+E*E num+id*E num+id*num
E
E+E
num
E*E
id
num
E*E
E+E
num
id
num
num
E
E
id
E
E
num
num
(1)
num
id
(2)
LyA
62
63
Gramticas
friosam@prodigy.net.mx
donde :
S
E
E1
if
if ( E )
E2
I else I
S1
( E
E1
S2
if ( E ) I
E2
(a)
(b)
63
else I
S1
S2
64
friosam@prodigy.net.mx
Gramticas
Fig 2.6 Arboles de parse para la sentencia if (E1) if(E2) S1 else S2.
Es claro, que el rbol que se prefiere es el de la fig 2.6(a), ya que la regla general es que
el else pertenece al if ms cercano. Modifiquemos la gramtica para que no exista
entre el entonces y el sino del if, una instruccin if que no tenga la rama else (sino).
I
M | N
if ( E ) M else M | S
if ( E ) I | if ( E ) M else N
(1)
(2)
(3)
(5)
(4)
(6)
(3)
Falla !!
Obliga a utilizar de nuevo if (E) M else M
o terminar con S .
(6)
Tambin falla !!
Obliga a terminar con M
S ... (4), o
bien a utilizar M
if ( E ) M else M ...
(3), que sera fatal, ya que slo existe un
else en la sentencia .
As, encontramos que la sentencia slo es derivable siguiendo las etapas de sustitucin
que se muestran a continuacin :
I N
(2)
if ( E ) I
(5)
if ( E1 ) M
(1)
if ( E1 ) if ( E ) M else M
(3)
if ( E1 ) if ( E2 ) S1 else M
(4)
Sentencia reconocida !!
64
65
Gramticas
friosam@prodigy.net.mx
if ( E1 ) if ( E2 ) S1 else S2
(5)
Escritura de Gramticas.
La escritura de gramticas es una tarea muy parecida a la de escribir definiciones
regulares. No existe una metodologa definida para efectuar dicho trabajo, pero un buen
empiezo es examinar las sentencias ms representativas del lenguaje que deseamos
generar con la gramtica.
uses
crt ;
uses
crt, pilas, dos;
uses
colas, listas;
...
...
Sentencias representativas
para la instruccin ...
uses .
LyA
Analizando las sentencias anteriores, observamos que la instruccin siempre inicia con
la palabra reservada uses, la cual es un token, seguida de uno ms identificadores de
bibliotecas separados por la coma.
uses
crt;
token uses
uses
crt, pilas, dos;
parte 2 .....
bibliotecas separadas
por coma y la
terminacin punto y
coma.
LyA
uses B ;
Parte 2
Parte 1
LyA
65
66
Gramticas
friosam@prodigy.net.mx
Smbolo de inicio.
uses B ;
B,C | C
id | crt | printer | dos | graph
( G1 )
B B,C C,C
B
B,C
B,C
B,C
// tres bibliotecas.
...
...
De acuerdo a lo anterior, B genera las cadenas C ( , C ) n n >= 0, donde el nmero de
bibliotecas generadas es n+1.
n
0
1
2
3
...
n
bibliotecas generadas
1
2
3
4
...
n+1
La variable sintctica C se utiliza para generar los tokens id (bibliotecas definidas por el
usuario) y las bibliotecas predefinidas crt, dos, graph y printer.
As, la gramtica G1 tiene :
66
67
Gramticas
friosam@prodigy.net.mx
8 producciones,
VT = { uses, , , ; , id, crt, printer, dos, graph },
VN = { U, B, C }
el smbolo de inicio S = U .
Las derivaciones y arboles de parse para las sentencias representativas se muestran en la
tabla de la figura 2.7.
sentencia
uses crt;
derivacin
rbol de parse
U uses B;
uses C ;
uses crt;
U
uses
C
crt
uses crt, pilas, dos;
U uses B;
uses B,C;
uses B,C,C;
uses C,C,C;
uses crt,C,C;
uses crt,id,C;
uses crt,id,dos;
U
uses
dos
id
crt
uses colas, listas;
U uses B;
uses B,C ;
uses C,C;
uses id,C ;
uses id,id;
U
uses
B
B
C
id
67
;
C
id
68
Gramticas
friosam@prodigy.net.mx
var
i,j : integer;
(2)
var
x : real;
c,d : char;
k : integer;
var R
var R
RI:T; | I:T;
// 1 rengln de declaraciones
I:T;
R I : T; I : T; I : T;
R
RI:T;
// 2 renglones
I:T;
R I : T; R I : T; I : T; I : T; I : T; I : T;
R
RI:T;
RI:T;
// 3 renglones
I:T;
...
R genera el lenguaje : ( I : T; ) n , n > 0. En todos los casos I representa a las
cadenas de identificadores separados por una coma y T es el no terminal que denota a
los tipos de datos.
I
I , id
I genera el lenguaje :
| id
id ( ,id ) n ,
LyA
68
n >= 0
Demustralo con
derivaciones !!!
69
friosam@prodigy.net.mx
Gramticas
y T genera :
T
char | integer | real
Juntando las producciones, tenemos la gramtica que especifica la declaracin de
variables pedida :
D
var R
(1)
RI:T; | I:T;
I , id
(2)
(4)
(6)
(3)
| id
(5)
(7)
(8)
derivacin
var
i,j : integer;
var
x : real;
c,d : char;
k : integer;
69
var R
var I : T;
4
var I,id : T;
5
var id,id : T;
7
var id,id : integer;
3
var R
var RI : T ;
var RI : T; I : T;
var I : T; I : T; I : T;
var id : T; I : T; I : T;
var id : real; I : T; I : T;
var id : real; I,id : T; I : T;
var id : real; id,id : T; I : T;
var id : real; id,id : char; I : T;
var id : real; id,id : char; id : T;
var id : real; id,id : char; id : integer;
70
friosam@prodigy.net.mx
Gramticas
Ejemplo 2.13
LyA
sentencias representativas
(1)
(2)
(3)
(4)
scanf (%d,&iNum);
scanf (%f%d,pfReal, piEnt);
scanf (%s ,sCad);
scanf (%d %d %d,&x[i],piy[i],&z[4] [1][i]);
Todas las sentencias representativas tienen el prefijo comn : scanf (CteLit, seguido
de los identificadores que pueden presentarse en las formas :
& id
id
&id[ ]
id[ ]
La primera produccin es :
scanf ( CteLit , V ) ;
LyA
70
71
Gramticas
friosam@prodigy.net.mx
V
V,I | I
El lenguaje generado por V es :
L (V) = { I ( ,I )n | n >= 0 }
Puede comprobarse con las derivaciones siguientes :
V I
// 1 identificador
V
V,I
V
I,I
V,I
// 2 identificadores
V,I,I
V
V,I
I,I,I
V
// 3 identificadores
id | & id | id K | & id K
K[L] | [L]
id | num
// 1 dimensin
[L]
K[L] [L][L]
K
K[L]
// 2 dimensiones
[L]
K[L][L]
K
K[L]
[L][L][L]
K
// 3 dimensiones
[L]
L (K) = { ( [ L ] ) n | n > 0 }
scanf ( CteLit , V ) ;
(1)
V,I | I
id | & id | id K | & id K
(2)
(4)
(3)
(5)
(6)
K[L] | [L]
id | num
(8)
(10)
...... ( G3 )
(7)
(9)
(11)
71
72
friosam@prodigy.net.mx
Gramticas
10
11
10
scanf (CteLit,V);
scanf (CteLit,V,I);
scanf (CteLit,I,I);
scanf (CteLit,&idK,I);
scanf (CteLit,&idK[L],I);
scanf (CteLit,&id[L][L],I);
scanf (CteLit,&id[id][L],I);
scanf (CteLit,&id[id][num],I);
scanf (CteLit,&id[id][num],id);
Evaluacin de x = 3 + 6 * 4 * 2 - 10
LyA
Paso 1 : x = 3 + 48 - 10
Paso 2 : x = 51 - 10
Paso 3 : x = 41
// multiplicacin
// suma
// resta
Una gramtica que especifique una expresin, debe tomar en cuenta y representar en sus
producciones , la precedencia de ejecucin de los operadores que intervienen ya sean
aritmticos, relacionales, lgicos de otra naturaleza.
Por ejemplo, la gramtica para la instruccin de asignacin y expresiones aritmticas que
incluyen los operadores +, -, *, / es tpicamente escrita como :
72
73
Gramticas
friosam@prodigy.net.mx
(1) A
id = E
(2) E
E+T | E-T | T
.... ( G4 )
(3) T
T*F | T/F | F
(4) F
id | num
La sentencia x = 10 + y * z - 20 tiene el siguiente rbol de reconocimiento :
0
id
E
E
T * F
num
id
num
id
LyA
Observaciones :
(1) La asignacin de E a id en el nivel 1 del rbol, no se
puede realizar hasta que no se obtenga el valor de E .
(2) El valor de E en el nivel 1, se sabe hasta que se
efecta la resta E - T en el nivel 2.
LyA
Concluyendo :
id = E sujeta a E - T
E-T
sujeta a E + T
E + T sujeta a T * F
prioridad de ejecucin.
73
74
Gramticas
friosam@prodigy.net.mx
Recursividad
a la izquierda ?!!
LyA
E+T | E-T | T
T*F | T/F | F
E+T
E-T
74
T*F
T/F
75
Gramticas
friosam@prodigy.net.mx
Recursividad a la izquierda
La recursividad aparece a la izquierda de
Podemos escribir
estas reglas recursivas, conservando la recursividad a la derecha, tal y
la alternativa.
como lo mostramos enseguida :
(1)
(2)
(3)
(4)
A
E
T
F
id = E
T+E | T-E | T
F*T | F/T | F
id | num
.... ( G5 )
Recursividad
a la derecha ?!!
La misma gramtica G4
pero con .....
recursividad a la derecha !!
LyA
id
num
T -
F * T
id
F F
id
num
LyA
ejecucin
76
Gramticas
friosam@prodigy.net.mx
id = L
id = L | num
..... (G6)
G6 = ( { id , = , num } , { A , L } , A , )
El rbol de parse para la sentencia a = b = c = 0 es el siguiente :
A
0
1
id
L
2
id
L
3
76
77
id
Gramticas
friosam@prodigy.net.mx
L
4
num
LyA
x=-5* y
x = x * ( y+ 2 )
A
id
F
id
78
friosam@prodigy.net.mx
Gramticas
num
id = E
E+T | E-T | T
T*F | T/F | F
id | num | - E | ( E )
......
( G7 )
id
id
num
id
Orden de ejecucin :
78
79
friosam@prodigy.net.mx
Gramticas
79
80
friosam@prodigy.net.mx
Gramticas
var R
RI:T; | I:T;
I , id | id
char | integer | real
80
81
friosam@prodigy.net.mx
LyA
id = E
E+T | E-T | T
T*F | T/F | F
id | num | - E | ( E )
......
( G7 )
LyA
82
(4) <Factor>
Gramticas
friosam@prodigy.net.mx
LyA
La gramtica an acepta otra forma en su notacin BNF. Las producciones (2) y (3) son
susceptibles al estatuto 5, es decir, a la agrupacin de alternativas.
(1)
(2)
(3)
(4)
<Asignacin>
<Expresin>
<Trmino>
<Factor>
::=
::=
::=
::=
id = <Expresin>
<Trmino> ( { + <Trmino> } | { - <Trmino>} )
<Factor> ( { * <Factor> } | { / <Factor> } )
id | num | - <Expresin> | ( <Expresin> )
<Asignacin>
<Expresin>
<Trmino>
<Factor>
::=
::=
::=
::=
id = <Expresin>
<Trmino> { ( + | - ) <Trmino> }
<Factor> { ( * | / ) <Factor> }
id | num | - <Expresin> | ( <Expresin> )
S
V
I
K
L
scanf ( CteLit , V)
V,I | I
id | &id | idK | &idK
K[L] | [L]
id | num
Aplicamos los
estatutos 1 y 2.
82
83
(5) <Indice>
Gramticas
friosam@prodigy.net.mx
::= id | num
<InstrLectura>
<ListaDatos>
<Dato>
<Dimensin>
<Indice>
::=
::=
::=
::=
::=
LyA
Veamos ahora las producciones que cumplen las condiciones para el empleo del estatuto
5.
(3) <Dato> ::= id | &id | id <Dimensin> | &id <Dimensin>
*
Se observa que las alternativas marcadas con asterisco (*) coinciden en el prefijo id, y
las alternativas marcadas con el smbolo de admiracin (!) tienen &id como prefijo
comn. Agrupemos estas alternativas ayudndonos de los estatutos 5 y 4 .
<Dato> ::= id [ <Dimensin> ]
| &id [ <Dimensin> ]
Se aplica el estatuto 4 :
[x] 0 o una ocurrencia
83
84
Gramticas
friosam@prodigy.net.mx
(L) | a
L,S | S
c) R
P
Q
S
readln | readln ( P )
P,Q | Q
id | id [ S ]
S,T | T
id | num
b) S
Aa | bAc | Bc | bBa
A d
B d
2. Encuentra el lenguaje generado por las siguientes gramticas :
(a) S
aSb | ab
(b) S
A
aSd | aAd
bAc | bc
(c)
S
A
B
AB
aAb | ab
cBd | cd
(d)
0S1 | 01
(e)
S
S
bB
bC
CB
cC
aSBC
abC
bb
bc
BC
cc
84
85
(f) A
A0
A1
0B0
1B1
(g) K
T
A0B0 | A1B1
1
0
1
0
K,T | T
num
(h) S
(S)S |
friosam@prodigy.net.mx
Gramticas
(i)
S
ccc
S
Abccc
A
Ab
A
aBa
B
aBa
B
AC
C
Cb
C
b
3. Modificar la gramtica del ejemplo 2.12 para que en adicin especifique tipos
subrango y tipos string [ ].
var
i,j
subrango
limite
sNombre
: integer;
: 1 .. MAX;
: MIN .. 40;
: string [40];
85
86
friosam@prodigy.net.mx
Gramticas
86