Sunteți pe pagina 1din 10

Lucrare de laborator nr.

3
Tema: Forma Normal Chomsky (FNC)
Sarcina lucrrii:
1. Eliminai producii
2. Eliminai redenumirile
3. Eliminai simbolurile inaccesibile
4. Eliminai simbolurile neproductive
5. Aducei la Forma ormal !"oms#$
1. Eliminm !roduc"ii:
a%
=

N

b% pentru producia !
=

N
{ } A

{ } A N =

&'({
1.S)*A+
2.S)*bA
3.A)*+
4.A)*b
5.A)*a,
-.A)*AS
..A)*bAA+
/.+)*b
0.+)*bS
11.!)*A+
11.,)*++
12.S)*+
13.S)*b
14.A)*S
15.A)*bA+
1-.!)*+
1..A)*b+
2
#. Eliminm redenumirile:
O producie de forma XY, X i Y neterminale, se numete redenumire.
3edenumirile din &' sunt: A+4 S+4 !)*+
{ } S R
S
=
4 { } B R
B
= 4 { } A R
A
=
pentru S+
{ } { } { } S B S B R R R
S B B
, = = =

pentru A+ { } { } { } A S B A S B R R R
A B B
, , , = = =
pentru !+
{ } { } { } C A S B C A S B R R R
C B B
, , , , , = = =

&
''
(5
1.S)*A+
2.S)*bA
3.A)*b
4.A)*a,
5.A)*AS
-.A)*bAA+
..+)*b
/.+)*bS
0.!)*A+
11.,)*++
11.S)*b
12.A)*bA+
13.A)*b+
14.A)*A+
15.A)*bA
1-.!)*b
1..A)*bS
1/.S)*bS
10.!)*bS2
3. Eliminm simbolurile ne!roducti$e:
( ) { }
T N
V v v A V A A G PROD = , , |
( ) ( ) G PROD V G NEPROD
N
\ =
{ } D C B A S V
N
, , , , =
{ } b a V
T
, =
( ) { } D C S B A G PROD , , , , =
( ) { } { } = = D C S B A D C B A S G NEPROD , , , , \ , , , ,
&
666
( &
66
%. Eliminm simbolurile inaccesibile:
6niial
( ) { } S G ACCES =
( ) { } x S x G ACCES = |
( ) ( ) ( ) G ACCES V V G INACCES
T N
\ =
( ) { } , , , , , d A B a S G ACCES =
{ } D C B A S V
N
, , , , =
{ } b a V
T
, =
( ) { } { } { } E D b A B a S b a D E C B A S G INACCES = = , , , , , \ , , , , , , ,
&
67
( 5
1.S)*A+
2.S)*bA
3.A)*b
4.A)*a,
5.A)*AS
-.A)*bAA+
..+)*b
/.+)*bS
0.,)*++
11.S)*b
11.A)*bA+
12.A)*b+
13.A)*A+
14.A)*bA
15.A)*bS
1-.S)*bS
2
&. 'ducem la Forma Normal Chomsky
O gramatic n forma normal Chomsky este o gramatic cu reguli de forma A
C, !i, unde A,,C,!"
#
i i "
$
&
7
( 5
1. S)* A+
2. S)* 8A
3. A)* b
4. A)* 9,
5. A)* AS
-. A)*:1A+
.. +)* b
/. +)* 8S
0. ,)* ++
11. S)* b
11. A)*:1+
12. A)* 8+
13. A)* A+
14. A)* 8A
15. A)* 8S
1-. S)* 8S
1.. 9)* a
1/. 8)* b
10.:1)* 8A
2
Textul Programului n limbajul C++
;include <iostream*
;include <conio."*
;include <strin=."*
;include <iomanip*
;include <stdlib."*
;include <stdio."*
usin= namespace std>
struct &roductie 5
c"ar ?rom@3A>
c"ar to@/A>
2>
int current&rod ( 12>
&roductie productii@31A ( 5
5BSB4 BA+B2 4 5BSB4 BbAB24 5BAB4 B+B24
5BAB4 BbB2 4 5BAB4 Ba,B24 5BAB4 BASB24
5BAB4 BbAA+B2 4 5BAB4 B;B2 4 5B+B4 BbB24
5B+B4 BbSB2 4 5B!B4BA+B2 4 5B,B4 B++B2
2>
void a?iseaCa&rodD% 5
c"ar c4c1>
?or Dint i ( 1> i <current&rod> EEi% 5
cout << setFD3% << DiE1% << B.B << productii@iA.?rom << B)*B << productii@iA.to << endl>
2
2
void elim&roductiaDint indice% 5
?or Dint i ( indice> i < current&rod)1> EEi% 5
strcp$Dproductii@iA.?rom4 productii@iE1A.?rom%>
strcp$Dproductii@iA.to4 productii@iE1A.to%>
2
))current&rod>
2
void elim&rod3epetateD% 5
?or Dint i ( 1> i < current&rod)1> EEi%
?or Dint G ( iE1> G < current&rod> EEG%
i?DHstrcmpDproductii@iA.?rom4 productii@GA.?rom% II
HstrcmpDproductii@iA.to4 productii@GA.to%%
elim&roductiaDG))%>
2
void elim&rode?olositeDc"arJ ne?olosite% 5
c"ar temp@2A>
?or Dint i ( 1> i < strlenDne?olosite%> EEi%
?or Dint G ( 1> G < current&rod> EEG% 5
temp@1A ( ne?olosite@iA>
temp@1A ( 'K1'>
i?DHstrcmpDtemp4 productii@GA.?rom% LL
strstrDproductii@GA.to4 temp%%
elim&roductiaDG))%>
2
2
void reuniuneDc"arJ stin=a4 c"arJ dreapta4 c"arJ reCultat% 5
c"ar temp@2A>
strcp$DreCultat4 stin=a%>
?or Dint i ( 1> i < strlenDdreapta%> EEi%
i? DHstrc"rDreCultat4 dreapta@iA%% 5
temp@1A ( dreapta@iA>
temp@1A ( 'K1'>
strcatDreCultat4 temp%>
2
2
void di?erentaDc"arJ stin=a4 c"arJ dreapta4 c"arJ reCultat% 5
c"ar temp@2A>
strcp$DreCultat4 BB%>
?or Dint i ( 1> i < strlenDstin=a%> EEi%
i? DHstrc"rDdreapta4 stin=a@iA%% 5
temp@1A ( stin=a@iA>
temp@1A ( 'K1'>
strcatDreCultat4 temp%>
2
2
int str6ncludeStrDc"arJ stin=a4 c"arJ dreapta% 5
?or Dint i ( 1> i < strlenDdreapta%> EEi%
i?DHstrc"rDstin=a4 dreapta@iA%%
return 1>
return 1>
2
void strSc"imbaDc"arJ str4 c"arJ s7ec"i4 c"arJ sou% 5
int len ( strlenDstr%> int G>
?or Dint i ( 1> i < len)2> EEi%
i? Dstr@iA (( s7ec"i@1A II
str@iE1A (( s7ec"i@1A% 5
str@iA ( sou@1A>
?or D G ( iE1> G < len)1> EEG%
str@GA ( str@GE1A>
str@GA ( 'K1'>
2
2
void adau=a&roductieDc"arJ ?rom4 c"arJ to% 5
strcp$Dproductii@current&rodA.?rom4 ?rom%>
strcp$Dproductii@current&rodA.to4 to%>
EEcurrent&rod>
2
void elimEps&rodD% 5 int s>
c"ar Eps@.A>
strcp$DEps4 B;B%>
int sc"imbari>
c"ar temp@11A>
do 5
sc"imbari ( 1>
?or Dint i ( 1> i < current&rod> EEi%
i? Dstr6ncludeStrDEps4 productii@iA.to%% 5
strcp$Dtemp4 Eps%>
reuniuneDEps4 productii@iA.?rom4 Eps%>
i? DstrcmpDtemp4 Eps%% sc"imbari ( 1>
2
2 F"ile Dsc"imbari%>
?or Dint i ( 1> i < current&rod> EEi%
i? DHstrcmpDproductii@iA.to4 B;B%%
elim&roductiaDi))%>
?or Dint i ( 1> i < current&rod> EEi%
?or Dint G ( 1> G < strlenDEps%> EEG%
?or Dint # ( 1> # < strlenDproductii@iA.to%> EE#%
i? DEps@GA (( productii@iA.to@#A II
strlenDproductii@iA.to% * 1% 5
strcp$Dtemp4 productii@iA.to%>
?or D s ( #> s < strlenDproductii@iA.to%)1> EEs%
temp@sA ( temp@sE1A>
temp@sA ( 'K1'>
adau=a&roductieDproductii@iA.?rom4 temp%>
2
i? Dstrc"rDEps4 'S'%% 5
adau=a&roductieDBSB4 B;B%>
2
2
void elim3edenumiriD% 5
c"ar 3@5A@5A ( 5BSB4 BAB4 B+B4 B,B4B!B2>
int indice>
c"ar temp@2A>
?or Dint i ( 1> i < current&rod> EEi%
i? D1 (( strlenDproductii@iA.to% II
productii@iA.to@1A *( 'A' II productii@iA.to@1A <( ':'% 5
sFitc"Dproductii@iA.to@1A% 5
case 'S': indice ( 1> brea#>
case 'A': indice ( 1> brea#>
case '+': indice ( 2> brea#>
case '!': indice ( 3> brea#>
case ',': indice ( 4> brea#>
2
reuniuneD3@indiceA4 productii@iA.?rom4 3@indiceA%>
elim&roductiaDi))%>
2
?or Dint i ( 1> i < current&rod> EEi% 5
sFitc"Dproductii@iA.?rom@1A% 5
case 'S': indice ( 1> brea#>
case 'A': indice ( 1> brea#>
case '+': indice ( 2> brea#>
case '!': indice ( 3> brea#>
case ',': indice ( 4> brea#>
2
?or Dint G ( 1> G < strlenD3@indiceA%> EEG% 5
temp@1A ( 3@indiceA@GA>
temp@1A ( 'K1'>
adau=a&roductieDtemp4 productii@iA.to%>
2
2
2
void elim6naccesD% 5
c"arJ v ( BSA+!,abB>
c"ar aces@11A>
strcp$Daces4 BSB%>
c"ar temp@2A>
c"ar inaces@5A ( BB>
?or Dint i ( 1> i < strlenDaces%> EEi%
?or Dint G ( 1> G < current&rod> EEG% 5
i? Daces@iA (( productii@GA.?rom@1A%
reuniuneDaces4 productii@GA.to4 aces%>
2
di?erentaDv4 aces4 inaces%>
elim&rode?olositeDinaces%>
2
void elimeprodD% 5
c"ar prod@11A ( BB>
c"ar prod&rim@11A>
strcp$Dprod&rim4 BabB%>
do 5
strcp$Dprod4 prod&rim%>
?or Dint i ( 1> i < current&rod> EEi%
i? Dstr6ncludeStrDprod&rim4 productii@iA.to%%
reuniuneDprod&rim4 productii@iA.?rom4 prod&rim%>
2 F"ile DstrcmpDprod4 prod&rim%%>
c"ar ne&rod@11A ( BB>
c"arJ v ( BSA+!,B>
di?erentaDv4 prod4 ne&rod%>
elim&rode?olositeDne&rod%>
2
void F!"oms#$D% 5
?or Dint i ( 1> i < current&rod> EEi%
i?DstrlenDproductii@iA.to% * 1%
?or Dint G ( 1> G < strlenDproductii@iA.to%> EEG%
i? Dproductii@iA.to@GA (( 'a'%
productii@iA.to@GA ( '9'>
else i? Dproductii@iA.to@GA (( 'b'%
productii@iA.to@GA ( '8'>
adau=a&roductieDB9B4 BaB%>
adau=a&roductieDB8B4 BbB%>
c"ar indice ( '1'>
c"ar ?rom@2A>
c"ar to@4A>
?or Dint i ( 1> i < current&rod> EEi%
i?DstrlenDproductii@iA.to% * 2% 5
?rom@1A ( indice>
?rom@1A ( 'K1'>
to@1A ( productii@iA.to@1A>
to@1A ( productii@iA.to@1A>
to@2A ( 'K1'>
adau=a&roductieD?rom4 to%>
EEindice>
?or Dint G ( 1> G < current&rod> EEG%
i? DstrlenDproductii@GA.to% * 2 II
strstrDproductii@GA.to4 to%% 5
strSc"imbaDproductii@GA.to4 to4 ?rom%>
2 22
int mainD% 5
s$stemDBclsB%>
cout << BKn&roductiile initiale:KnKnB>
a?iseaCa&rodD%>
=etc"D%>
s$stemDBclsB%>
cout << BKn&roductiile dupa eliminarea epsilon productiiKnKnB>
elimEps&rodD%>
elim&rod3epetateD%>
a?iseaCa&rodD%>
=etc"D%>
s$stemDBclsB%>
cout << BKn&roductiile dupa eliminarea redenumirelorKnKnB>
elim3edenumiriD%>
elim&rod3epetateD%>
a?iseaCa&rodD%>
=etc"D%>
s$stemDBclsB%>
cout << BKn&roductiile dupa eliminarea simbolurilor neproductiveKnKnB>
elimeprodD%>
elim&rod3epetateD%>
a?iseaCa&rodD%>
=etc"D%>
s$stemDBclsB%>
cout << BKn&roductiile dupa eliminarea simbolurilor inaccesibileKnKnB>
elim6naccesD%>
elim&rod3epetateD%>
a?iseaCa&rodD%>
=etc"D%>
s$stemDBclsB%>
cout << BKn&roductiile Forma ormala !"oms#$KnKnB>
F!"oms#$D%>
elim&rod3epetateD%>
MMa?iseaCa&rodD%>
c"ar c4c1>
c(' '> c1 ( ' '>
?or Dint i ( 1> i <current&rod> EEi% 5
MMcout << productii@iA.to@1A << endl>
i?Dproductii@iA.?rom@1A (( '1' LL productii@iA.?rom@1A (( '2' LL productii@iA.?rom@1A (( '3' LL productii@iA.?rom@1A
(( '4'% c ( ':'>
i?Dproductii@iA.to@1A (( '1' LL productii@iA.to@1A (( '2' LL productii@iA.to@1A (( '3' LL productii@iA.to@1A (( '4'% c1 (
':'>
cout << setFD3% << DiE1% << B.B << c << productii@iA.?rom << B)*B << c1 << productii@iA.to << endl>
c(' '> c1( ' '>
2
=etc"D%>
return 1>
2
(creenshot)uri:

S-ar putea să vă placă și