Professional Documents
Culture Documents
======================================================================
A.Definitii:
-----------In cele ce urmeaza notam cu & pe lambda (cuvantul vid).
Gramatici regulate si independente de context:
1. GR: G = (VN, VT, S, P), unde:
VN, VT multimi finite nevide disjuncte
(neterminale, respectiv terminale)
S apartine lui VN (simbolul de start)
P inclus in VN x (VN U VT)*
P contine doar perechi (productii) de forma:
A -> bB
A -> a
unde A,B in VN, b in VT, a in VT U {&}
2. GIC: G = (VN, VT, S, P), unde:
VN, VT, S, P ca mai sus
P contine doar productii de forma:
A -> x
unde A in VN, x in (VN U VT)*
3. Fie G = (VN, VT, S, P) o GR sau GIC.
Derivare:
x |-- y (x,y in (VN U VT)*) daca:
x=uAv, y=uzv, u,v in (VN U VT)* si (A,z) in P
fie |-*- inchiderea reflexiva si tranzitiva a lui |-fie |-+- inchiderea tranzitiva a lui |-Limbajul generat de G este:
L(G) = {x in VT* | S |-*- x}
Fie G = (VN, VT, S, P) o GIC cu L(G) nevid.
Q din VN U VT este inaccesibil daca nu exista o derivare
S |-*- xQy (x,y in (VN U VT)*);
Q din VN U VT este neutilizat daca nu exista o derivare
S |-*- xQy |-*- xzy (x,y,z in VT*);
Fie G = (VN, VT, S, P) o GIC.
O &-productie a lui G este o productie a sa de forma A -> &;
O redenumire a lui G este o productie a sa de forma A -> B, cu A,B in VN.
G este proprie daca este fara simboluri neutilizate, fara &-productii,
fara redenumiri.
Fie G = (VN, VT, S, P) o GIC a.i. not & in L(G).
Atunci G este in forma normala Chomsky (FNC) daca are doar productii
de forma A -> BC, A -> a, cu A,B,C in VN, a in VT;
pentru a acoperi si cazul cand & in L(G) uneori se adauga la definitie
si ca putem avea productia S -> &, dar atunci S nu va fi continut in
membrul drept al nici unei productii.
Fie G = (VN, VT, S, P) o GIC.
A in VN este recursiv imediat la stanga daca
exista w in (VN U VT)+ a.i. A |-- Aw;
A in VN este recursiv la stanga daca
exista w in (VN U VT)+ a.i. A |-+- Aw.
Constructie:
S' un simbol nou
VN' := VN U {S'}
VT' := VT
P' := {A -> aB | A -> aB in P} U {A -> aS' | A -> a in P} U
U {S' -> S, S' -> &}.
9) Stelare GIC:
--------------Intrare: G = (VN, VT, S, P) GIC
Iesire: G' = (VN', VT', S', P') GIC a.i. L(G') = L(G)*
Constructie:
S' un simbol nou
VN' := VN U {S'}
VT' := VT
P' := P U {S' -> S'S, S' -> &}.
10) Intersectie GR:
------------------Intrare: Gi = (VNi, VTi, Si, Pi), i=1,2, GR
Iesire: G = (VN, VT, S, P) GR a.i. L(G) = L(G1) intersectat cu L(G2)
Constructie:
VN := VN1 X VN2
VT := VT1 intersectat cu VT2
S := [S1,S2]
P := {[A,B] -> a[C,D] | A -> aC in P1, B -> aD in P2} U
U {[A,B] -> a | A -> a in P1, B -> a in P2}.
11) Pastrarea neterminalelor ce se deriva doar in siruri de terminale:
---------------------------------------------------------------------Intrare: G = (VN, VT, S, P) GIC;
Iesire: daca L(G) = vid, un mesaj adecvat;
daca L(G) nevid, G' = (VN', VT', S', P') GIC a.i. L(G') = L(G)
si pentru orice A in VN' exista x in VT'* a.i. A |-*- x;
Algoritm:
(1) V(0) := vid; i := 1;
(2) V(i) := V(i-1) U {A in VN | A -> x in P, x in (V(i-1) U VT)*}
(3) daca V(i) != V(i-1) atunci i := i+1 si salt la (2)
(4) daca not S in V(i) atunci L(G) este vid,
altfel iau: VN' := V(i), VT' := VT, S' := S,
P' := multimea productiilor din P cu membrul stang in V(i).
12) Eliminarea simbolurilor inaccesibile:
----------------------------------------Intrare: G = (VN, VT, S, P) GIC cu L(G) nevid;
Iesire: G' = (VN', VT', S', P') GIC a.i. L(G') = L(G) si G' nu contine
simboluri inaccesibile;
Algoritm:
(1) V(0) := {S}; i := 1;
(2) V(i) := V(i-1) U
U {x in VN U VT | A -> uxv in P, A in V(i-1), u,v in (VN U VT)*}
(3) daca V(i) != V(i-1) atunci i := i+1 si salt la (2)
11;
12.
14;
15.
elimin productiile
A -> Aa(1), ..., A -> Aa(m)
si adaug productiile
A -> b(1)A', ..., A -> b(n)A',
A' -> a(1), ..., A' -> a(m), A' -> a(1)A', ..., A' -> a(m)A'
]
(2) VN' este VN la care s-au adaugat noile neterminale A';
VT' := VT; S' := S; P' este P cu modificarile facute mai sus.
19) Eliminarea recursivitatii la stanga:
----------------------------------------Intrare: G = (VN, VT, S, P) GIC fara &-productii si fara redenumiri;
Iesire: G' = (VN', VT', S', P') GIC fara recursivitati la stanga
a.i. L(G') = L(G);
Algoritm:
(0) presupunem VN = {A(1), ..., A(n)}, S = A(1);
(1) pentru i de la 1 la n executa (2.1) si (2.2):
(2.1) pentru j de la 1 la i-1 executa (3)
(3) pentru fiecare A(i) -> A(j)u din P, cu u in (VN U VT)*
executa (4.1) si (4.2):
(4.1) daca A(j) -> v(1), ..., A(j) -> v(t) sunt toate productiile din P
cu membrul stang A(j) atunci adaug productiile
A(i) -> v(1)u, ... A(i) -> v(t)u;
(4.2) elimin productia A(i) -> A(j)u;
(2.2) elimin recursivitatea imediata pentru A(i), ca in algoritmul 18
(5) VT' := VT; S' := S;
VN' si P' sunt VN, respectiv P, cu modificarile facute mai sus.
20) Aducerea la FNG:
-------------------Intrare: G = (VN, VT, S, P) GIC cu L(G) nevid si not & in L(G);
Iesire: G' = (VN', VT', S', P') GIC in FNG a.i. L(G') = L(G);
Algoritm:
(0) presupunem VN = {A(1), ..., A(n)}, S = A(1);
aplicam algoritmul 19; cu aceasta ocazie apar niste neterminale noi A',
iar toate productiile vor fi in final de una din formele:
A(i) -> aw, cu a in VT;
A(i) -> A(j)w, cu i<j;
A' -> w, iar w nu incepe cu un neterminal de tip B';
consideram ca G este gramatica obtinuta;
(1) pentru k de la n-1 la 1 executa:
pentru fiecare productie de forma A(k) -> A(j)u din P executa:
P := (P U {A(k) -> vu | A(j) -> v in P}) - {A(k) -> A(j)u}
(2) pentru fiecare productie de forma B' -> A(j)u din P executa:
P := (P U {B' -> vu | A(j) -> v in P}) - {B' -> A(j)u}
(3) VN' := VN; VT' := VT; S' := S; P' este P cu modificarile facute mai sus.
Obs: la pasul (0), daca la aplicarea algoritmului 18 in cadrul algoritmului
19 fiecare neterminal nou A' este adaugat la sfarsitul lui VN (primind un
indice incrementat cu 1 fata de maximul existent), atunci pasul (1) de la
algoritmul 19 parcurge si noile neterminale, iar in final toate productiile
vor fi de forma A(i) -> aw (a in VT), A(i) -> A(j)w (i<j) si astfel aici nu
va mai fi necesar pasul (2).
21) Analiza sintactica top-down: