Documente Academic
Documente Profesional
Documente Cultură
Limbaje Formale Si Translatoare
Limbaje Formale Si Translatoare
a
b
M 1
2
a
b
b
a 0igura 2
23
>nei stri i unui simbol de intrare nu 'i mai corespunde o stare ci o mulime5 e6entual 6id de
stri$
atricea de tranziii pentru acest automat este8
1
a
77
M
GM51H
G25+H
G2H
G+H G2H
77 77
77
b
2
+ 77 77 77
%6ident5 "0D este un caz particular al "0N$
!ornind de la e,presii regulate5 se pot construi automate 1inite nedeterministe$
0ie o e,presie regulat # peste un al1abet $ "lgoritmul de mai jos 6a genera un automat
1init nedeterminist N5 care 6a accepta limbajul de1init de #$
.e descompune e,presia # 'n componentele sale elementare -simboluri i operatori/$ .e
6or construi automate elementare pentru 1iecare simbol5 dup care5 1olosind aceste automate5 se
6or construi automatele pentru e,presiile compuse$ "utomatele pentru e,presiile compuse se
construiesc inducti65 pentru 1iecare operaie 8 reuniune5 concatenare5 inc9idere$ "lgoritmul de
construcie introduce la 1iecare pas cel mult 2 stri noi5 prin urmare5 automatul rezultat 6a a6ea
cel mult de 2 ori at<tea stari c<te simboluri si operaii are e,presia regulat$
Al/'ri&,)l l)i T+',s'n prezentat 'n continuare5 nu este cel mai e1icient -un algoritm
mai per1ormant ar genera un "0N cu mai puine stri pentru aceeai e,presie regulat/$ "re 'ns
a6antajul simplitii5 iar dup trans1ormarea din automat nedeterminist 'n automat determinist5
e,ist posibilitatea reducerii numrului de stri ale automatului 1init determinist obinut$
0olosim urmtoarele notaii8
i 7 stare iniial
f 7 stare 1inal
()i! 7 automatul corespunztor e,presiei regulate #i$
7 !entru -simbolul 6id notat i / se genereaz8
1 i
_
7 !entru a - un simbol oarecare al al1abetului surs/8
1 i
a
!entru 1iecare "0N elementar construit5 strile 6or 1i notate cu nume -numere/ distincte= dac un
acelai simbol al al1abetului apare de mai multe ori 'n %#5 se 6a construi pentru 1iecare apariie a sa c<te un
"0N separat5 cu stri notate distinct$
:n continuare5 se conecteaz 'ntre ele "0N elementare construite5 corespunztor operatorilor
aplicai asupra primiti6elor din %#5 compun<ndu7se ast1el5 din aproape 'n aproape -prin inducie/
"0N 1inal$
24
Descompunerea %# 'n componente elementare5 respecti6 compunerea acestora se 1ace
aduc<nd %# la 1orma post1i,5 tin<nd cont c operatorii se e6alueaz 'n ordinea urmtoare8
parantezele5 'nc9iderea - J /5 concatenarea si selecia -N/$
7 !entru 01102
1 i
N-#1/
N-#2
0igura +
"utomatul corespunztor e,presiei #1 N #25 este N-#1 N#2/5 obinut prin creerea a 2 stri noi8
o stare iniial5 di1erit de strile iniiale ale automatelor N-#1/ i N-#2/ i o stare 1inal di1erit de
strile 1inale din N-#1/ i N-#2/5 care 'i pierd proprietatea de satre iniial i 1inal$
Limbajul corespunztor e,presiei regulate #1 N#2 este8 L-#1/ L-#2/$
7 !entru 0102
1 i N-#1/
N-#2/
0igura 3
"utomatul corespunztor e,presiei #1#2 este N- #1#2/ pentru care starea iniial este starea
se start a automatului N-#1/ iar starea 1inal este cea a automatului N-#2/$ .tarea 1inal a automatului
N-#1/ se identi1ic cu starea se start a automatului N-#2/$
>n drum 'ntre i i f 6a tra6ersa mai 'nt<i automatul N-#1/5 dup care 6a trece prin
automatul N-#2/$ !rin urmare5 irul de simboluri recunoscut 6a 1i un ir din limbajul e,presiei #1
urmat de un ir al limbajului e,presiei #2$ :n consecin5 limbajul modelat de automat este8
L-#1/L-#2/$
7 !entru 01*
1 i N-#1/
0igura 4
"utomatul are 2 stri noi i ne putem deplasa din starea iniial i 'n starea 1inal f5 1ie direct
prin tranziia 5 1ie prin automatul N-#1/5 de un numr oarecare de ori$
>n automat obinut pe baza algoritmului lui T9omson are urmtoarele proprieti8
7"0N 1inal 6a a6ea o singur stare de start i o singur stare 1inal$
7 0iecare stare a automatului are cel mult o tranziie etic9etat cu un simbol din
al1abet sau cel mult 2 tranziii etic9etate cu $
2;
A-lica2ie8 .e consider e,presia regulat # K -aba/
J
aa $ "utomatul construit pas cu pas5 pornind de
la aceast e,presie este8
1
i
1
2 + 3
4 ;
B A L
a a
a
a
b
0igura ;
*.1.2. %ransformarea A.N /n A.(
>n "0N se poate trans1orma 'ntr7un automat 1init determinist -"0D/ care s accepte acelai
limbaj ca i "0N$
Notm cu s0 starea iniial a "0N$ O stare a "0D 6a 1i compus dintr7o mulime de stri Gs*+ s,+"""+ sn
H ale "0N$
Noiunea de 7'nc9idere se de1inete pentru 1iecare mulime de stri T ale unui automat8
este mulimea strilor 'n care se poate trece din strile mulimii T pentru un simbol de intrare$
%,emplu8 !entru automatul din 0igura 25 prin tranziii 6ide5 7'nc9idere-M/ K GM52H5 7
'nc9idere-1/ K G1H5 7'nc9idere-M5 +/ K GM525+H etc$
Notm8 al1abetul limbajului surs
Ds&ri mulimea strilor "0D
D&ranz mulimea tranziiilor
!entru implementarea algoritmului putem 1olosi ca structuri de date dou sti6e i un ir
de ci1re binare inde,at de strile automatului$ :ntr7una din sti6e se ine e6idena mulimii curente
a strilor nedeterministe iar a doua sti6 se utilizeaz pentru calculul mulimii de stri urmtoare$
\ectorul de ci1re binare 'nregistreaz dac o stare este prezent 'n sti65 pentru a se e6ita dublarea
ei$ Organizarea acestei structuri ca 6ector are a6antajul timpului de cutare constant al unei stri$
Dup 'nc9eierea procesului de calcul a mulimii de stri urmtoare5 rolul sti6elor se in6erseaz$
.e iniializeaz strile "0D cutat Dstri cu un singur element -o stare/5 i anume cu
mulimea strilor 'n care se poate ajunge din starea s- a "0N numai prin tranziii 6ide -de 1apt 7
'nc9idere-Gs-H/5 care 6a 1i notat cu 7'nc9idere-Gs-H/$
La 'nceput aceast stare e nemarcat$ Totodat5 mulimea tranziiilor este 6id$
!entru 1iecare stare nemarcat din Dstri i pentru 1iecare simbol din al1abet se caut strile 'n
care se poate ajunge 'n "0N pentru simbolul respecti6$ "daug aceste stri la Dstri dac ele nu sunt
deja incluse 'n aceast mulime5 adaug tranziia la Ditranz i marc9eaz starea testat din Dstri$
"lgoritmul de obinere a "0D este8
-r'ce()ra A.(,A./ es&e
Jiniializeaz Dstri cu 7'nc9idere-Gs-H/
Jla 'nceput strile din Dstri sunt nemarcate
Dtranz K
c3& &i,- mai e,ist 'n Dstri o stare x K Gs*+ s,+" " "+ sn H nemarcat exec)&
Jmarc9eaz x
2B
-en&r) 1iecare a exec)&
J1ie 0 K mulimea strilor din "0N pentru care o tranziie etic9etat cu a de la o
stare si x=
1 K 7'nc9idere-0/=
(ac 1 Dstri a&)nci
Jadaug 1 la Dstri5 1 7 nemarcat
Jadaug tranziia x 1 la Dtranz5 dac nu e,ist deja
4
4
4
s53r 6 i& A.(,A./
"lgoritmul de calcul pentru 1uncia -7nc+i(ere este8
5)nc 2ia 7'nc9idere- 0 / es&e
Jpune toate strile din 0 'ntr7o sti6
Jiniializeaz 7'nc9idere- 0 / cu 0
c3& &i,- sti6a nu e 6id exec)&
Je,trage starea s din 6<r1ul sti6ei
-en&r) 1iecare stare t pentru care s t pentru simbolul exec)&
(ac t 7'nc9idere- 0 / a&)nci
Jadaug t la 7'nc9idere- 0 /
Jpune t 'n sti6
4
4
4
s5 3 r 6 i& 7'nc9idere- 0 /
2A
%xe,-l)8 0ie "0N din 1igura B$ Limbajul acceptat este8 Ga5 b5 ab5 abab5 RH$
B
M
1 2 +
3
4
;
b
a b
a
0igura B
"plicm algoritmul A.(,A./ pe diagrama de tranziii$
Dstri K G-M5153/H Dtranz K
.e marc9eaz cu J starea -M515 3/
7 !entru simbolul a construim mulimea G25 4H i calculm 7'nc9idere -G25 4H/ K G25 45 BH
Dstri K G-M5153/J 5 -25 45 B/H Dtranz K G-M5153/-25 45 B/ cu simbolul aH
7 !entru simbolul b construim mulimea G;Hi calculm 7'nc9idere -G;H/ K G;5 BH
Dstri K G-M5153/J 5 -25 45 B/5 -;5 B/H Dtranz K G-M5153/-25 45 B/ cu a= -M5153/-;5B/ cu b H
.e marc9eaz cu J starea -25 45 B/
7 !entru simbolul a nu a6em tranziii
7 !entru simbolul b construim mulimea G+Hi calculm 7'nc9idere -G+H/ K G15 +5 BH
2L
Dstri K G-M5153/J 5 -25 45 B/J5 -;5 B/5 -15 +5 B/H
Dtranz K G-M5153/-25 45 B/ cu a= -M5153/-;5B/ cu b = -25 45 B/ -15 +5 B/ cu bH
.e marc9eaz cu J starea -;5B/
7 !entru simbolul a nu a6em tranzitii
7 !entru simbolul b nu a6em tranziii
Dstri K G-M5153/J 5 -25 45 B/J5 -;5 B/J5 -15 +5 B/H
Dtranz K G-M5153/-25 45 B/ cu a= -M5153/-;5B/ cu b = -25 45 B/ -15 +5 B/ cu bH
.e marc9eaz cu J starea -15 +5 B/
7 !entru simbolul a construim mulimea G2Hi calculm 7'nc9idere -G2H/ K G2H
Dstri K G-M5153/J 5 -25 45 B/J5 -;5 B/J5 -15 +5 B/J5 -2/H
Dtranz K G-M5153/-25 45 B/ cu a= -M5153/-;5B/ cu b = -25 45 B/ -15 +5 B/ cu b= -15 +5 B/ -2/ cu a H
7 !entru simbolul b nu a6em tranziii
.e marc9eaz cu J starea -2/
7 !entru simbolul a nu a6em tranziii
7 !entru simbolul b construim mulimea G+Hi calculm 7'nc9idere -G+H/ K G15 +5 BH5 dar ea e,ist$
Dstri K G-M5153/J 5 -25 45 B/J5 -;5 B/J5 -15 +5 B/J5 -2/JH
.trile pot 1i redenumite5 de e,emplu8
-M5153/ K "
-25 45 B/ K *
-;5 B/ K C
-15 +5 B/ K D
-2/ K %
atricea i diagrama de tranziii pentru "0D parial de1init sunt cele din 0igura A$
.e obser6 c "0D obinut accept e,act limbajul Ga5 b5 ab5 abab5 RH acceptat de "0N
iniial$
+M
.trile acceptoare -1inale/ ale "0D obinut 6or 1i acele stri x care 6or conine cel puin o
stare acceptoare a "0N$ .tarea de start a "0D este cea 1ormat din s0 'mpreun cu toate strile la
care se poate ajunge din s0 doar prin simbolul $
"lgoritmul de mai sus este important pentru c d soluia pentru simularea unui "0N$
.imularea direct este di1icil5 deoarece trebuie simulat calculul ?'n paralel? al di1eritelor
traiectorii ce pot 1i urmate 'n "0N$ 0olosind algoritmul5 se determin mai 'nt<i "0D ec9i6alent i
apoi se simuleaz "0D$ "ceast simulare este ec9i6alent cu construirea analizorului limbajului
generat de gramatic$
*
a
C
"
*
D 77
b
C
D % 77
%
77 77
77 D
D
"
b
a
0igura A
*
CC
b
%
a
*.1.3. Al"oritm pentru simularea comportrii unui automat finit nedeterminist
.e consider un automat N construit dintr7o e,presie regulat prin metoda T9omson$ .e
prezint algoritmul de simulare care 6a decide dac automatul N recunoate sau nu un ir de
intrare x$ #spunsul automatului 6a 1i `daa 'n cazul recunoaterii i `nua alt1el$
7 "lgoritmul citete intrarea simbol cu simbol -carurm/
7 Calculeaz pentru 1iecare mulime de stri T mulimea strilor 'n care se poate trece din
strile din T numai prin tranziii 6ide$ - 'nc9idere/$
7 \eri1ic dac se poate ajunge 'ntr7o stare acceptoare$
.8K 7 'nc9idere-.M/=
a8K carurm=
O9ile a eo1 do
begin
.8K 7 'nc9idere-.5a/=
a 8K carurm=
end=
i1 .0 {} t9en genereaz-`daa/
else genereaz-`nua/=
!entru implementarea algoritmului putem 1olosi ca structuri de date dou sti6e i un ir
de ci1re binare inde,at de strile automatului$ :ntr7una din sti6e se ine e6idena mulimii strilor
curente5 iar a doua sti6 se utilizeaz pentru calculul mulimii de stri urmtoare$ \ectorul de
ci1re binare 'nregistreaz dac o stare este prezent 'n sti65 pentru a se e6ita dublarea ei$
Organizarea acestei structuri ca 6ector are a6antajul timpului de cutare constant al unei stri$
Dup 'nc9eierea procesului de calcul a mulimii de stri urmtoare5 rolul sti6elor se in6erseaz$
*.1.!. Minimizarea numrului de stri ale unui A.(
"utomatul 1init determinist obinut din automatul 1init nedeterminist nu este 'ntotdeauna
cel mai simplu posibil pentru irul de intrare dat$ >neori este posibil reducerea numrului de
stri ale "0D ast1el obinut$
.e prezint un algoritm care5 'n caz c este posibil5 reduce numrul de stri ale unui "0D$
+1
O stare s a unui "0N este o stare important dac are cel puin o tranziie etic9etat cu un
simbol di1erit de $ De e,emplu5 'n algoritmul de con6ersie "0N7"0D5 strile importante au 1ost
cele care au determinat creerea unei noi stri 'n "0D$
Consider<nd mulimile de stri din "0N corespunztoare la 2 stri din "0D5 2
submulimi sunt identice dac8
1$ ele au aceleai stri importante
2$ ambele 1ie includ5 1ie e,clud stri acceptoare
Al/'ri&,)l (e ,ini,izare 8
Considerm c a6em un "0D notat 5 a6<nd mulimea strilor notat cu .5 iar
reprezint mulimea de simboluri de intrare$ !resupunem c 1iecare stare are o tranziie pentru
1iecare simbol de intrare$ Dac "0D nu 'ndeplinete aceast condiie5 6om crea o stare 1icti65
numit `stare de blocaja5 m din care 6om trasa arce spre el 'nsui pentru 1iecare simbol de intrare$
!entru toate strile care nu au tranziii pentru toate simbolurile5 tranziiile lips se 6or completa
cu arce spre starea m"
Iniial di6izm mulimea strilor "0N 'n 2 submulimi5 una conin<nd strile care nu sunt
1inale5 celalat conin<nd mulimea strilor 1inale$ "lgoritmul 6a partiiona aceste mulimi ast1el
'nc<t dou stri din aceeai mulime 6or trece 'n aceeai mulime de stri pentru orice simbol de
intrare$
Considerm ! o partiie obinut la un moment dat 'n procesul de partiionare5 .K{s15s25
R5s2} una din mulimile partiiei i un simbol de intrare a$ Cutm pentru 1iecare stare si starea 'n
care trece pentru simbolul a$ Dac strile urmtoare obinute aparin la mulimi di1erite din !5
mulimea . se 6a 'mpri 'n submulimi ale cror elemente duc 'n aceeai submulime din !$
!rocesul de di6izare se repet p<n c<nd nu mai gsim grupuri ce trebuiesc di6izate$
i/ .e realizeaz o partiionare ! a multimii Dstari 'n dou grupuri de stri8 0Ksetul de stri
acceptoare i Dstari 7 0 K setul de stri non7acceptoare$ !rintr7o procedur5 care se 6a da mai jos5 se
'ncearc e1ectuarea unei noi partiionri5 !nou5 prin descompunerea grupurilor lui ! 'n subgrupuri$
Dac !nou !5 se 'nlocuiete ! cu !nou i se repet procedura de descompunere$ Dac !nou !5
'nseamn c partiionarea nu se mai poate 1ace$
-r'ce()ra partiionare es&e
-en&r) 1iecare grup ) ! exec)&
J descompune ) 'n subgrupuri a$'$ 2 stri s i t din ) s se a1le 'n acelai subgrup dac
i numai dac5 pentru toate simbolurile a 5 s si t tranziteaz 'n stri aparin<nd
aceluiai subgrup
J subgrupurile obinute se pun 'n !nou
s53r s i& partitionare
ii/ Din 1iecare grup al partiiei obinute 'n pasul anterior5 se alege c<te o stare oarecare -stare
reprezentant/$ "cestea 6or 1i strile "0D minimizat$ .tarea iniial 6a 1i starea reprezentant a
grupului ce conine starea initial s05 iar strile 1inale 6or 1i reprezentantele subgrupurilor pro6enite
din 0$
iii/ Toate tranziiile dintre strile automatului iniial se trans1orm 'n tranziii 'ntre
reprezentanii grupelor respecti6e$ Dac "0D minimizat conine o stare de bloca2 m5 adic o stare
care nu este 1inal i care tranziteaz 'n ea 'nsi pentru toate simbolurile a aceast stare se
elimin$ .e 6or elimina5 de asemenea5 strile care nu pot 1i atinse plec<nd din starea iniial$
Tranziiile spre strile de blocaj dinspre alte stri de6in nede1inite$
%,emplu8 1ie automatul din 1igura L8
+2
%
b
a
b
" *
C
a
b
a
b
0igura L
D
b
a
a
.K{"5*5C5D5%}
!rima partiie8 K {"5*5C5D} {%}
!entru a construi nou5 considerm mulimea {%}= aceast mulime nu se mai poate
di6iza5 deci o includem in noua partiie$
Considerm acum {"5*5C5D}i cutm tranziiile pentru simbolul a8 " 7
a
7> *5 * 7
a
7> *5 C
7
a
7> *5 D 7
a
7> *5 prin urmare simbolul a nu di6izeaz mulimea$
Considerm acum b8 " 7
b
7> C5 * 7
b
7> D5 C 7
b
7> C5 D 7
b
7> %5 aceste tranziii 6or partiiona
mulimea 'n {"5 *5 C} i 'n {D}$
nou K -{"5 *5 C} {D} {%}/
{"5 *5 C} 7
a
7> {*5 *5 *} {"5 *5 C} 7
b
7> {C5 D5 C}
Deoarece D este 'n alt partiie5 obinem8
nou K -{"5 C} {*} {D} {%}/
{"5 C} 7
a
7> {*5 *} {"5 C} 7
b
7> {C5 C}
nou K -{"5 C} {*} {D} {%}/
:n acest moment nou K 5 deci automatul minimizat 6a a6ea strile {"5 C} {*} {D} {%}$
Din mulimea {"5 C} alegem satrea " ca stare reprezentati6$ Toate tranziiile spre C 6or de6eni
tranziii spre "5 iar celelalte tranziii le copiem din automatul iniial$ Deci5 'n acest caz s7a reuit
minimizarea numrului de stri cu o stare$
*.1.*. Construirea arborelui binar corespunztor )1
C*
a$ 9n ar:'re (e (eri;are -parse tree/ 'ntr7o gramatic )KGN5 T5 !5 .H este un arbore
orientat5 etic9etat5 cu urmtoarele proprieti8
- rdcina arborelui este etic9etat cu .=
- nodurile interioare sunt etic9etate cu neterminalele gramaticii5 iar 1runzele cu neterminale sau
terminale=
- pentru orice nod interior etic9etat cu " a6<nd descendeni direci etic9etai 'n ordine de la st<nga
la dreapta cu simbolurile din "8 &15 &25 R &2 -2 1/ e,ist 'n ! o producie8 " &1 &2 R &2 $
^irul simbolurilor care etic9eteaz 1runzele arborelui scrise 'n ordine de la st<nga la dreapta
se numete frontiera arborelui$
.e poate arta c oricrei 1orme propoziionale din ) 'i corespunde cel puin un arbore de
deri6are 'n ) care are ca 1rontier pe $ %l se numete arborele de derivare #n G al lui " $
0ie gramatica8 )KGG%H5 Gi5 @5 JH5 !5 %H
cu ! K G % % @ %
% % J %
++
% -%/
% i H$
!ropoziia8 iJ-i@i/ are urmtoarea deri6are canonic st<nga8
% % J % i J % i J -%/ i J - % @ %/ i J - i @ % / i J - i @ i /
:n 1igura urmtoare se prezint arborele de deri6are al acestei propoziii$ Construcia urmrete
deri6area canonic st<ng8 1rontierele arborilor construii reproduc 1ormele propoziionale din
deri6area canonic st<ng$
%
%
%
J
i
-
/
%
%%
%
@
i i
b$ Ar:'rele c'res-)nz&'r %0 este un ar:'re :inar care are c<te un nod terminal pentru
1iecare simbol ce apare 'n %# i c<te un nod interior pentru 1iecare operator aplicat -c'nca&enare5
7nc+i(ere5 sa)/$ :n prealabil %# 6a 1i modi1icat5 'n sensul c la s1<ritul ei 6a 1i concatenat un
simbol special5 notat cu <5 care 6a ser6i drept marcator de s1<rit al %#$ O asemenea %# modi1icat
se numete %0 a)/,en&a&$
:n 1uncie de operatorul 'nmagazinat 'ntr7un nod5 nodul se 6a numi nod7cat dac operatorul
este concatenare5 nod7sau dac operatorul este sau5 nod7stea$
:n automatul "0D corespunztor %# augmentate5 orice stare de la care 6a e,ista o tranziie
etic9etat cu Z<Z 6a 1i stare acceptoare$
0iecare simbol din %# 6a 1i numerotat5 'n ordinea te,tual a apariiei sale 'n %#$ Dac
acelai simbol apare de mai multe ori5 1iecare apariie 6a a6ea un numr distinct$ Deci5 unui simbol
din al1abet 'i pot corespunde mai multe numere de poziie dac el este repetat 'n cadrul e,presiei$
Numerele atribuite 'n acest mod se numesc -'zi 2ii$$
"rborele se obine aduc<nd %# la 1orma post1i, $
%,emplu8
0ie %# 8 - a N b /J a b b
%# augmentat este8 - a N b /J
a b b C
a b a b b C
poz$ 1 2 + 3 4 ;
0iecare nod al arborelui primete c<te un identi1icator unic5 pentru a putea 1i localizat$ :n
1igura urmtoare5 identi1icatorii nodurilor au 1ost notai cu Ni5 iK1$ $1+$ "rborele corespunztor 6a 1i
cel din 1igura urmtoare$
+3
C
;
b
4
b
3
a
+
J
N
b a
1
2
N1
N2
N+
N3 N4
N; NB
NA NL
N1M
N11
N12
N1+
*.1.*. Obinerea A.( din arborele binar
.e 1olosete %# augmentat5 se construiete arborele sintactic -ca 'n e,emplul anterior/ i se
aplic o metod de analiz sintactic$ .e poate demonstra c strile importante din "0N ec9i6alent
%# sunt ec9i6alente cu poziia 1runzelor din arborele sintactic corespunztor %#$ De aceea5 metoda
obine direct un "0D5 iar strile lui 6or 1i mulimi de poziii din arborele sintactic$
!rin tra6ersri peste arborele construit5 pentru 1iecare nod n din arbore5 se 6or determina 3
1uncii notate8 Anulabil n!5 3rimapozn! 5 Ultimapozn!5 3ozurmi!5 unde n este identi1icatorul
nodului$ "0D se 6a obine din 1uncia 3ozurmi!5 !rimele + 1uncii sunt de1inite de nodurile
arborelui sintactic i se 1olosesc 'n calculul lui 3ozurmi!5 care este de1init numai de poziia din
arbore$
0uncia 'ozurm2i3 7 unde i este o poziie din arborele %#7 reprezint mulimea poziiilor #
care pot urma poziiei i 'n arbore$
!entru e,presia regulat din e,emplul precedent5 3ozurm*! K G15 25 +H$
!oziia 1 corespunde primului a din %#$ Dup acesta poate s urmeze8
- un nou a din aceeai poziie datorit aplicrii operatorului J
- un b din poziia 2 din acelai moti65 consider<nd i 1aptul c operatorul este sau
- un a de pe poziia + cu care 'ncepe irul 1inal abb
!entru a calcula 3ozurmi! trebuie s se cunoasc ce poziii pot 1i puse 'n coresponden cu
primul sau cu ultimul simbol al unui ir generat de o anumit sube,presie din %#$
Dac e,presia este rJ atunci 1iecare poziie care poate 1i prima 'n r poate urma dup 1iecare
poziie care poate 1i ultima 'n r$
Dac e,presia este rs atunci 1iecare poziie care poate 1i prima 'n s poate urma dup 1iecare
poziie care poate 1i ultima 'n r$
0uncia 'rimapoz2n3 este mulimea poziiilor corespunztoare cu primul simbol al tuturor
irurilor generate de sube,presiile cu rdcina 'n n$ "nalog5 4ltimapoz2n3 este mulimea poziiilor
corespunztoare cu ultimul simbol dintr7un ast1el de ir$
!entru e,presia regulat din e,emplul precedent5 dac n este rdcina arborelui5
3rimapozn! K G15 25 +H5 Ultimapozn! K G;H$
!entru calculul acestor 1uncii este necesar s se determine acele noduri care sunt rdcini
ale unor subarbori ce pot genera irul 6id$ "semenea noduri se numesc anulabile$ \om de1ini o
1uncie Anulabil2n3 care 6a returna 6aloarea logic &r)e dac n este un nod anulabil5 i 5alse 'n caz
contrar$
+4
%,ist 2 reguli de baz i + reguli inducti6e pentru cei + operatori$ !e baza acestor reguli5
parcurg<nd arborele de la 1runze spre rdcin5 se pot determina 6alorile celor + 1uncii$
#egulile de calcul sunt urmtoarele8
Nr$ Nodul n Anulabil n! 3rimapoz n! Ultimapoz n!
1$ 0runz cu
etic9eta true
2$ 0runz eti7
c9etat cu i 1alse GiH GiH
+$ Anulabilc*! 3rimapozc*! Ultimapozc*!
sa) Anulabilc,! 3rimapozc,! Ultimapozc,!
3$ Anulabilc*! (ac Anulabilc*! (ac Anulabilc,!
6i Anulabilc,! a&)nci 3rimapozc*! a&)nci Ultimapozc,!
3rimapozc,!
Ultimapozc*!
al&5el 3rimapozc*! al&5el
Ultimapozc,!
4$ true 3rimapoz c*! Ultimapoz c*!
+;
n 1
c
1
c
2
c
1
c
2
n
c
1
* n
Obser6aii8
- !entru 4ltimapoz regulile sunt similare cu cele de la 'rimapoz5 doar c se 'nlocuiete 'rimapoz
cu 4ltimapoz i se intersc9imb c1 cu c2 -unde este cazul/$
- #egula 4 pentru Anulabil n! arat c dac nodul n este 'nc9iderea e,presiei prin J atunci
Anulabil n! este true5 deoarece 'nc9iderea e,presiei prin J genereaz un limbaj care include cu
certitudine pe $
- #egula 3 pentru !rimapoz arat c dac 'n e,presia rs5 r genereaz pe -adic Anulabilc*! K
true/ atunci 3rimapoz s! ?se 6ede? prin r i se include 'n 3rimapoz n!$ :n caz contrar5 3rimapoz
n! 6a conine 3rimapoz r!$
0unciile 3rimapoz n! i Ultimapozn!5 calculate pentru e,emplul precedent sunt8
C
;
b
4
b
3
a
+
J
N
b a
1
2
-aNb/JabbC
12 +34;
G1525+H G;H
G1525+H G4H
G1525+H G3H
G4H G4H
G;H G;H
G3H G3H
G+H G+H
N1
N2
N+
N3
N4
N;
NB
N1M
NA
G152H G152H
G152H G152H N11
N12
G1525+H
G+H
NL
N1+
G152H G152H
#egulile pentru calculul lui 'ozurm2i3 sunt8
i/ Dac n este un nod7concatenare -b/5 cu 1iul st<ng c1 i cu 1iul drept c2 i
i4ltimapoz2c135 atunci se include 'rimapoz2c23 'n 'ozurm2i3$
ii/ Dac n este un nod7'nc9idere -J/ i i4ltimapoz2n35 atunci se include
'rimapoz2n3 'n 'ozurm2i3$
+B
:n e,emplul dat5 a6<nd 1unciile 3rimapoz n! i Ultimapozn! calculate5 se determin
3ozurmi!"
Nod !oziie "nulabil !rimapoz >ltimapoz !ozurm
N1+ 2 1alse G 2 H G 2 H G 1525+ H
N12 1 1alse G 1 H G 1 H G 1525+ H
N11 7 1alse G 152 H G152 H
N1M J true G152 H G 152 H 7
NL + 1alse G + H G + H G 3 H
NA b true G 152 H G 152 H 7
NB 3 1alse G 3 H G 3 H G 4 H
N; b 1alse G 1525+ H G + H 7
N4 4 1alse G 4 H G 4 H G ; H
N3 b 1alse G 1525+ H G 3 H 7
N+ ; 1alse G ; H G ; H
N2 b 1alse G 1525+ H G 4 H 7
N1 b 1alse G 1525+ H G ; H 7
.e parcurge arborele5 lu<nd 'n considerare numai nod7cat i nod7stea8
N2 este 1iu st<nga 5 N+ este dreapta5 deci includem ; 'n 3ozurm pentru 4$
N3 este 1iu st<nga 5 N4 este dreapta5 deci includem 4 'n 3ozurm pentru 3$
N; este 1iu st<nga 5 NB este dreapta5 deci includem 3 'n 3ozurm pentru +$
NA este 1iu st<nga 5 NL este dreapta5 deci includem + 'n 3ozurm pentru 1 i 2$
N1M este nod7stea5 deci includem G 152 H 'n 3ozurm pentru 1 i 2$
Deci8
!oz$
Pozur
m
1 G1525+H
2 G1525+H
+ G3H
3 G4H
4 G;H
; 7
0uncia 3ozurm se poate reprezenta ca un gra1 orientat5 a6<nd c<te un nod pentru 1iecare
poziie i un arc orientat de la i la j5 dac j este 'n 3ozurmi!"
+A
a
1
a
2
b
a b
+ 3 4
;
a
b b
C
"cest gra1 este un "0N 1r pentru %# dat5 dac sunt 'ndeplinite condiiile8
- Toate poziiile din 3rimapoz rad! de6in stri de start G1525+H
- 0iecare arc orientat -i5j/ este etic9etat cu simbolul din poziia j
- .tarea asociat cu C este singura stare acceptoare
Not<nd cu rad nodul rdcin al arborelui i prelu<nd notaiile D&ranz i Ds&ri de la cursul anterior5
algoritmul de trans1ormare a arborelui %# 'n "0D este8
-r'ce()ra E),A./ es&e
Jiniializeaz Dstri cu 3rimapoz rad!
Jla 'nceput strile din Dstri sunt nemarcate
c3& &i,- e,ist stare nemarcat 0 'n Dstri exec)&
Jmarc9eaz 0
-en&r) 1iecare a exec)&
J1ie UK3ozurm p!5 unde p 0 i simbolul din poziia p este a
(ac U i U Dstri a&)nci
Jadaug U ca stare nemarcat la Dstri
4
Jadaug tranziia 0 U la Dtranz
4
4
s53r 6 i& E),A./
%tapele care se parcurg pentru obinerea "0D pe baza arborelui unei %# sunt8
I$.e determin 'rimapoz i 4ltimapoz pentru 1iecare nod al arborelui$
II$.e calculeaz 'ozurm pentru 1iecare poziie5 parcurg<nd arborele de sus 'n jos$
III$.e e,ecut procedura E),A./$
*.2. -mplementarea "eneratorului automat de analizor lexical
.peci1icarea de intrare pentru un generator o reprezint e,presiile regulate care descriu
atomii le,icali5 'nsoite de speci1icaii semantice$ "ciunile semantice sunt sec6ene de program
care se e,ecut atunci c<nd 'n irul de intrare se identi1ic o le,em corespunztoare tiparului cu
care este asociat aciunea$
r1 {aciune 1 }
r2 {aciune 2 }
r+ {aciune + }
R
rn {aciune n }
+L
a
)eneratorul este un program care pe baza speci1icaiilor de intrare produce tabela de
tranziii a automatului$ "nalizorul le,ical 6a 1i 1ormat dintr7un simulator pentru automat5
'mpreun cu tabela de tranziii generat$
)enerator .peci1icare de
intrare
Tabela de
tranziii
.imulatorul citete tamponul de intrare i pe baza tabelei de tranziie identi1ic le,emele$
Ieire
Le,em
Tamponul de intrare
Tabela de
tranziii
.imulatorul
automatului
1init
"utomatul generat la ieire poate 1i nedeterminist sau determinist5 'n 1uncie de
implementarea dorit$
:n continuare 6om analiza c<te6a probleme de proiectare speci1ice pentru cele 2 6ariante de
automate$
a. Genera&'r care i,-le,en&eaz A$N
Considerm tiparele reprezentate prin ri5 iK15n pentru care se 6or construi automatele
nedeterministe N-ri/$ "utomatele pariale obinute se combin 'ntr7un automat general5 5 numit
"0N combinat ast1el8 se introduce o nou stare de start de la care pleac tranziii spre toate cele
n automate$
sM
N-r1/
N-rn/
$
$
$
.imularea automatului combinat se bazeaz pe o 6ariant a algoritmului iniial5 care
recunoate cel mai lung cu6<nt din intrare$ "ceasta 'nseamn c de 1iecare dat c<nd automatul
ajunge la o mulime de stri care conine o stare acceptoare5 6a reine poziia din intrare i tiparul
ri asociat cu acea stare5 dar simularea continu p<n 'n momentul 'n care se ajunge 'n situaia de
terminare5 adic din mulimea de stri curent nu e,ist nici o tranziie pentru simbolul din
intrare$ La atingerea condiiei de terminare5 pointerul de a6ans al intrrii se 6a retrage la poziia
corespunztoare ultimei stri acceptoare marcate$ Tiparul memorat pentru aceast poziie
identi1ic atomul gsit5 iar le,ema recunoscut se gsete 'ntre cei doi pointeri$ Dac nu e,ist
stare acceptoare5 se poate genera un mesaj de eroare$
%,emplu8
.e consider urmtoarele tipare8
3M
a {}
abb {}
a
J
b
@
{}
"utomatele pariale corespunztoare celor + e,presii sunt8
2 1
a
; +
a
3 4
b b
A
a
B
b
b
Combinarea automatelor pariale 'n automatul general este8
A
a
B
b
b
M + 3 4
a b b
1
;
2
a
.e 6a analiza irul de intrare aa:a
ulimea strilor de start8 M515+5B
b a a
B
2
3
B
A
b
terminare
tipar 1
M
1
+
B
tipar +
ulimea de stri iniial este M515+5B$ La intrare a6em simbolul a5 deci se 6a trece 'n
mulimea 2535B$ :ntruc<t starea 2 este stare 1inal5 se reine poziia 2 'n irul de intrare i tiparul 1
asociat cu cu6<ntul recunsocut$ .e continu simularea i pe baza celui de7al doilea a din intrare se
trece 'n starea B5 apoi 'n starea A care este stare 1inal$ !ointerul este acum pe simbolul b din
intrare deci se 6a memora poziia lui b i tiparul + asociat cu irul aab" .e continu simularea
pentru ultimul a la care s7a ajuns i din acest punct nu mai a6em tranziii5 :n consecin5 se re6ine
la ultima coresponden recunosc<nd le,ema aab corespunztoare celui de7al treilea tipar$
Dac e,presiile regulate ar a6ea asociate aciuni semantice5 acestea s7ar e,ecuta 'n
momentul recunoaterii unui tipar$ "ceast operaie nu se 6a 1ace 'n mod automat de 1iecare dat
31
c<nd analizorul ajunge 'ntr7o stare acceptoare corespunztoare unui tipar5 ci numai atunci c<nd
tiparul se do6edete a 1i tiparul care realizeaz cea mai lung coresponden$
:. Genera&'r care i,-le,en&eaz A$D
Dac generatorul 1urnizeaz la ieire un "0D5 programul de simulare este asemntor cu
cel pentru "0N din capitolul anterior5 adic se 6a cuta le,ema de lungime ma,im$
!roblema care apare este c s7ar putea ca prin trans1ormarea "0N7> "0D5 mulimea de
stri din "0N corespunztoare unei stri din "0D s conin mai multe stri acceptoare$ Trebuie
s decidem care stare din cele acceptoare se 6a alege pentru a determina tiparul asociat$ #egula
este c se 6a alege acea stare care corespunde e,presiei regulate a1late mai 'n 1a5 'n ordinea
introducerii e,presiilor$
%,emplu8 "plicm algoritmul de con6ersie automatului generalizat de mai sus8
stare a b tiparul
anunat
M515+5B 2535B A nimic
2535B B 45A a
A 7 A aJb@
B B A nimic
45A 7 ;5A aJb@
;5A 7 A abb
:n mulimea de stri {;5A} ambele stri sunt 1inale$ Deoarece starea ; este stare terminal
pentru o e,presie regulat care apare 'naintea e,presiei regulate pentru starea 1inal A -ordinea de
introducere a 1ost a5 abb5 aJb@/5 se 6a alege starea ; ca stare acceptoare$
!entru irul de intrare aaba5 algoritmul de simulare 6a genera aceleai puncte de marcare
ca i la simularea "0N$
=. Analiza sin&ac&ic C=
%ste etapa din construcia compilatorului 'n care se recunosc construciile sintactice ale
programului$ #egulile care descriu structura sintactic a programelor corecte pentru un anumit limbaj
de programare se e,prim 'n mod uzual prin gramatici independente de conte,t scrise de e,emplu 'n
notaia *N0$ >tilizarea gramaticilor pentru descrierea limbajelor de programare are urmatoarele
a6antaje8
a$ gramatica reprezint o notaie precis a unui limbaj5 relati6 uor de reinut=
b$ s7au elaborat metode de construcie manual sau automat de analizoare sintactice
e1iciente pentru limbaje descrise prin gramatici= aceste metode permit i punerea 'n
e6iden a unor ambiguiti sintactice care ar trece neobser6ate 'n 1aza de de1iniie a
limbajului sau la 'nceputul proiectrii compilatorului
c$ descrierea limbajului printr7o gramatic corect 1a6orizeaz procesul de detectare a
erorilor i de traducere a programului surs 'n cod obiect
d$ dac limbajul e6olueaz 'n timp5 i apar construcii de limbaj noi -completri la sinta,/
care trebuie s e1ectueze sarcini noi -completari la semantic/5 construciile noi se pot
aduga mai uor limbajului iniial5 iar modi1icrile implicate 'n compilator sunt mai
simple
:n cele ce urmeaz5 se 6or prezenta principalele metode de analiz sintactic utilizate 'n
compilatoare$ .e 6or studia conceptele generale ]operaii cu gramatici5 trans1ormri aplicate
gramaticilor75 te9nici de implementare manual a analizoarelor sintactice precum i te9nici de
generare automat a analizoarelor sintactice$ etodele prezentate se 6or completa cu te9nici speci1ice
de re6enire 'n caz de eroare$
=.1. 0'l)l analizei sin&ac&ice
32
"nalizorul sintactic primete ca intrare de la analizorul le,ical un ir de atomi le,icali i are
sarcina de a 6eri1ica dac irul respecti6 poate 1i generat de gramatic$ :n caz de eroare 6a trebui s
semnaleze c<t mai clar at<t poziia c<t i cauza erorii i s apeleze rutine de tratare i re6enire din
erori pentru a putea continua analiza$
atom
!rogram arbore cod cod
surs citire atom
Ieirea analizorului sintactic este o reprezentare a arborelui sintactic corespunztor irului
de atomi 1urnizat de analizorul le,ical$ :n di1erite cazuri practice5 arborele sintactic poate s nu 1ie
construit e1ecti6 ca o structur de date real5 c9iar dac el apare implicit 'n timpul analizei$ :n a1ara
construirii arborelui sintactic5 analiza sintactic are i alte sarcini8 colectarea de in1ormaii despre
atomi i depunerea lor 'n tabela de simboluri5 e,ecutarea 6eri1icrilor de tip5 analiza de domeniu5 alte
6eri1icri semantice merg<nd p<n la generare de cod intermediar$
%,ist + tipuri de analizoare sintacice bazate pe gramatici8
7universale8 pot analiza orice gramatic dar sunt practic ine1iciente
7analiz'are sin&ac&ice (escen(en&e -&'--('>n -arsin/ denumite i analizoare LL/
7analiz'are sin&ac&ice ascen(en&e -:'&&',-)- -arsin/ denumite i analizoare L#/
Cele mai e1iciente analizoare sintactice ascendente respecti6 descendente 1uncioneaz pentru
subclase de gramatici5 aceste subclase conin 'ns majoritatea construciilor de limbaj uzuale$
etodele bazate pe clasele de gramatici analizabile LL sunt utilizate 'n analizoare sintactice
implementate manual5 iar cele pentru gramatici L# sunt mai generale i utilizate 'n metodele de
generare automat$
=.1.1. Tra&area er'ril'r sin&ac&ice
>n compilator trebuie s localizeze cu precizie o eroare5 s identi1ice natura erorii i s
asigure continuarea analizei$ O prim di1icultate pro6ine din 1aptul c de1iniiile limbajelor de
programare nu cuprind i tratarea erorilor5 reacia 1iind lsat 'n totalitate 'n sarcina proiectantului
compilatorului$
!lani1icarea erorilor de la 'nceputul proiectrii compilatorului poate s simpli1ice structura
acestuia i s 'mbuntaeasc reacia compilatorului la erori$ !rogramele pot conine erori la di1erite
ni6ele8 le,ical5 sintactic5 semantic i logic$ Cele mai multe erori detectabile 'n 1aza de compilare sunt
erorile sintactice5 iar metodele de analiz sintactic dispun de te9nici per1ormante de detectare de erori
care 'n anumite situatii garanteaz cu certitudine detecia tuturor erorilor$ !entru erorile semantice i
logice nu e,ist metode de detecie at<t de precise$
La 'nt<lnirea unei erori5 analizorul sintactic trebuie s raporteze clar i precis eroarea i s
aplice o metod de re6enire din eroare$ Toate aceste sarcini trebuie ast1el implementate 'nc<t s nu
reduc semni1icati6 6iteza de prelucrare a programelor corecte$ O tratare complet i detaliat a
tuturor acestor probleme este di1icil de realizat 'n practic$ De obicei se pre1er mecanisme mai simple
de tratare a erorii care se bazeaz pe ideea c majoritatea erorilor de compilare care apar sunt simple i
uor de detectat$
etodele de analiz sintactica LL i L# au proprietatea de pre1i, 6iabil5 adic sesizeaz
apariia unei erori imediat ce apare la intrare un pre1i, care nu corespunde nici unui ir din limbaj5
moti6 pentru care sunt considerate metode rapide din punct de 6edere al deteciei erorilor$ La
raportarea unei erori se indic de obicei locul 'n care s7a detectat eroarea5 1r a e,ista certitudinea c
3+
"nalizor
le,ical
"nalizor
sintactic
#estul prg$ de
1ront7end
Tabela de simboluri
acela este locul erorii$ %,ist totui probabilitatea ca eroarea s 1ie c9iar 'n acel loc sau 'n imediata lui
6ecinatate5 cel mult c<ti6a atomi mai 'n 1a$ Natura erorii se precizeaz prin mesaje de eroare5 dac
e,ist o probabilitate mare de estimare corect se genereaza un mesaj e,act5 de e,emplu `lipsete=a5
dac nu5 este de pre1erat un mesaj mai 6ag8 asinta, errora$
:n ceea ce pri6ete metodele de re6enire din eroare5 e,ist c<te6a metode generale$ :n
principiu5 compilarea nu poate 1i abandonat dec<t la erori gra6e5 iar analiza trebuie reluat dintr7un
punct c<t mai apropiat de locul erorii cu condiia ca prin re6enire s nu se introduc erori noi$
=.1.2. !&ra&e/ii (e re;enire (in er'ri
%,ist + strategii acceptate8
a$ ,'()l (e -anic ] este metoda cel mai 1rec6ent 1olosit i cel mai uor de implementat$
:n momentul detectrii unei erori se elimin din intrare unul sau mai multe simboluri
p<n c<nd se ajunge la un atom special de sincronizare5 iar din acest punct al intrrii
analiza se poate relua$ etoda are a6antajul c se ajunge 'ntotdeauna la s1<ritul sirului
de intrare i nu pot aprea cicluri in1inite 'n analiz$ Ca i atomi de sincronizare se aleg
di1erii delimitatori speci1ici limbajului$
b$ re;enirea la ni;el (e -r'-'zi2ie ] la detectarea unei erori5 analizorul 'ncearc s 1ac
corecii locale 'n irul de intrare5 de genul8 'nlocuirea unui simbol cu altul5 tergerea sau
inserarea unui simbol$ !rin aceste modi1icri urmrete s construiasc un pre1i, corect al
intrrii 'n locul celui eronat$ La aceast metod e,ist pericolul ciclului in1init -de
e,emplu la inserarea repetat a unuia i aceluiai simbol5 1r a se putea continua
analiza/$ Deza6antajul principal al metodei este c nu permite corecii adec6ate 'n cazul
'n care eroarea este 'nainte de punctul de detecie$
c$ )&ilizarea -r'()c2iil'r (e er'are ] este o metoda care impune cunoaterea precis a
tipurilor de eroare ce se pot 'nt<lni i practic5 numrul erorilor posibile nu este 1oarte
mare$ !entru aceast metod se suplimenteaz gramatica limbajului cu producii care s
genereze i construcii eronate5 iar analizorul sintactic se construiete pe baza acestei
gramatici e,tinse$ Dac pe parcursul analizei se utilizeaz o producie de eroare5 aciunile
asociate cu acea producie nu 6or conduce la traducere ci la un mesaj de eroare$
d$ e5ec&)area (e c'rec2ii /l':ale ] este o metod teoretic care compar programul , cu un
program F obinut printr7un numr minim de trans1ormri5 presupus a 1i cel `intenionat
de programatora$
=.2. r'iec&area )nei /ra,a&ici !entru a 1i analizat sintactic5 un limbaj 6a 1i descris 'n continuare
printr7o gramatic independent de conte,t$
O gramatic independent de conte,t nu poate descrie 'ns complet sinta,a unui limbaj de
programare5 deoarece e,ist i constructii dependente de conte,t i acestea 6or trebui tratate 'n 1azele
urmtoare de analiz -de e,emplu cerina ca un identi1icator s 1ie declarat 'nainte de utilizare/$ O alt
problem care se pune este 1aptul c 1iecare metod de analiz poate trata numai gramatici de o
anumit 1orm i de aceea este uneori necesar ca gramatica iniial s 1ie trans1ormat pentru a o 1ace
analizabil prin metoda aleas$ :n acest subcapitol se 6or trata acele trans1ormri care 1ac o gramatic
potri6it pentru metode descendente de analiz8 eliminarea ambiguitii din gramatic5 eliminarea
simbolurilor inutile5 eliminarea recursi6itii de st<nga5 1actorizarea la st<nga/$
=.2.1. C',-ara2ie8 ex-resii re/)la&e-/ra,a&ici in(e-en(en&e (e c'n&ex&
!<n acum5 pentru descrierea atomilor le,icali5 s7au 1olosit 'n principal e,presiile regulate$
#egulile le,icale sunt simple i descrierea lor nu necesit un 1ormalism at<t de puternic ca i cel o1erit
de gramatici$
%,presiile regulate5 1a de gramatici o1er urmtoarele a6antaje8
a$ pentru structuri simple de limbaj reprezint notaii mai precise i mai clare dec<t
gramaticile
b$ analizorul le,ical realizat pe baza e,presiilor regulate are structura mai simpl i poate 1i
mai uor generat automat$
33
Observa$ie8 0iecare construcie e,primabil printr7o e,presie regulat se poate descrie i
printr7o gramatic independent de conte,t5 respecti6 orice automat 1init nedeterminist se poate
trans1orma 'ntr7o gramatic care generaz acelai limbaj$
%,emplu$ 0ie e,presia regulat8 -aNb/Jabb$ %i 'i corespunde un "0N di 1igura urmtoare8
+
a
b
M 1 2
a
b
b
!e baza acestui "0N se poate construi gramatica8
)8 "M a"M N b"M N a"1
"1 b"2
"2 b"+
"+
etoda de trans1ormare este8
- !entru 1iecare stare i din automat se creaz un neterminal "i
- !entru 1iecare tranziie 2 i
a
se creaz 'n gramatic o construcie de 1orma "i a"j
- !entru 1iecare tranziie 2 i
s
b"e
s
bd"e
s
bdde
Dac irul de intrare ar 1i 1ost bddb5 la 'ncercarea de a6ans cu e s7ar 1i 'nregistrat eec5
ceea ce ar 1i dus la re6eniri succesi6e ast1el8 'nt<i o 'ncercare cu o alt alternati6 pentru
neterminalul "$ Deoarece nu mai e,ist o ast1el de alternati65 se re6ine la obiecti6ul b5 care este
cel mai din st<nga descendent a lui .$ Dar acesta este un terminal5 se raporteaz eec pentru
'ntreaga alternati6 b"e$ Deoarece aceasta este singura alternati6 pentru .5 se raporteaz eec
pentru .5 iar acesta 1iind nodul rdcin5 situaia este ec9i6alent cu neacceptarea irului bddb$
Implementarea unui asemenea proces necesit5 pentru e6entualele re6eniri5 memorarea
drumului parcurs 'n arbore5 precum i a punctelor din irul de la intrare 'n care s7a 'nceput
e,pandarea neterminalelor$
%eoarece revenirile se fac strict n ordine invers fa& de cea a axpandrilor i
avansurilor, mecanismul de implementare va fi cel de stiv.
.ti6a poate 1i implementat e,plicit sau implicit5 1olosind mecanismul de implementare al
recursi6itii e,istent 'n multe limbaje de programare$
Observa$ie$ Dac produciile gramaticii ar 1i de 1orma8 " "d N d5 analizorul sintactic ar
e,ecuta 7 pentru orice ir de intrare ] un ciclu in1init$ :ntr7ade6r5 dup a6ansul peste b5 obiecti6ul
urmtor de6ine "5 care se e,pandeaz 'n prima sa alternati65 adic "d5 ceea ce 1i,eaz ca
obiecti6 tot pe " $a$m$d$ O soluie ar 1i s lsm analiza lui "d ultima i s 'ncercm mai 'nt<i cu
d5 dar atunci ciclul in1init ar apare pentru iruri incorecte5 de e,emplu be$ Deci o gramatic
recursi6 la st<nga poate determina ca un analizor sintactic descendent recursi65 c9iar i pentru
6arianta cu re6eniri s intre 'ntr7un ciclu in1init$ "ceast situaie apare atunci c<nd e,pand<nd un
neterminal recursi6 ajungem din nou la e,pandarea sa5 1r s a6ansm 'n irul de intrare$
%xe,-l) (e i,-le,en&are. 0ie gramatica8
) K PG.5"H5 Ga5b5c5dH 5 !5.Q5 unde ! conine produciile8
. c"d
" ab N a
i 1ie O K cad irul de intrare$
.e d un e,emplu de implementare prin scrierea unei 1uncii pentru 1iecare neterminal5
analiz<nd pe r<nd alternati6ele de e,pandare ale neterminalului$ Trecerea la o nou alternati6 are
loc dac 'ncercarea alternati6ei precedente a euat$ "ceast trecere trebuie s restabileasc
indicatorul irului de la intrare$ Dac toate alternati6ele au euat5 se 'ntoarce 6aloarea logic 1als$
Dac o alternati6 e satis1ctoare5 se 'ntoarce 6aloarea logic ade6rat$
"naliza unei alternati6e 'nseamn propunerea pe r<nd ca obiecti6e a simbolurilor
succesi6e ce 1ormeaz alternati6a$ Dac este 6orba de terminal5 se 6eri1ic 1aptul c el coincide cu
simbolul de intrare5 iar dac e neterminal se 6eri1ic dac apelul 1unciei asociate 'ntoarce
6aloarea logic ade6rat$
typedef 32&" 1false4 true= %<<6!
><?32 -tokens; /*iesire de la scanner-/
><?32- to.en ! /-ato0ul curent -/
4+
%<<6 sintax/9AB
/-anali@a sintactica deriMata din 9 -/
1 /-incearca alternatiMa 9 L> c#d -/
if A-to.en ==KcKB1
JJto.en!
if Asintax/#ABB
if A-to.en ==KdKB1
JJto.en!
return true!
=
=
return false!
=
%<<6 sintax/#AB
/-anali@a sintactica deriMata din # -/
><?32 save; /pentru bac.trac.ing -/
saMe = to.en!
1 /-incearca alternatiMa # L> ab -/
if A-to.en ==KaKB1
JJto.en!
if A-to.en ==KbKB1
JJto.en!
return true!
=
=
to.en = saMe! /-esec4 bac.trac.ing -/
1 /-incearca alternatiMa # L> a -/
if A-to.en ==KaKB1
JJto.en!
return true!
=
to.en = saMe! /-esec4 bac.trac.ing -/
/- nu 0ai sunt alternatiMe4 esec -/
return false!
=
Be&'(a -rezen&a& are (') (eza;an&aCe8
- Nu se poate aplica unei gramatici recursi6e la st<nga
- *ac2trac2ing este di1icil de implementat5 deoarece toate aciunile compilatorului
p<n 'n punctul de re6enire -de e,emplu actualizarea tabelei de simboluri/ trebuiesc
terse$ .oluia ar 1i aplicarea analizorului sintactic asupra unor gramatici pentru care
nu mai este necesar procedeul de bac2trac2ing$
(liminarea recursivit&ii st/nga se poate face cu algoritmul prezentat la 5.-.L.
(xamin/nd exemplul dat, se observ c, pentru evitarea procedeului de bac7trac7ing, ar
trebui ca decizia asupra alternativei corecte s poat fi luat doar pe baza urmtorului
simbol de la intrare.
5(emplu de factori#are st8nga a unei gramatici.
43
.evenind la exemplul +, un ir de intrare bdde este respins pentru ordinea de
ncercare d urmat de dA. Astfel, dup avansul lui b i expandarea cu d a lui A, se
avanseaz cu d i se verific existen&a lui e la intrare, ceea ce conduce la eec
#urmtorul simbol este d, nu e$. Acest lucru se datoreaz faptului c d este un prefix al
lui dA i se raporteaz succes la expandarea cu d a lui A at/t n cazul n care alternativa
d este corect, c/t i n cazul n care structura intrrii este dA.
1olu&ia pentru aceast problem este ordonarea alternativelor de tip i
astfel nc/t s l precead pe . Aceast ordonare permite o optimizare) %ac pentru
analiza conform cu se ob&ine succes, se memoreaz starea intrrii i se analizeaz
conform cu . %ac se raporteaz eec, se revine la situa&ia intrrii de la sf/ritul lui i
se raporteaz succes.
=ai general, problema se pune pentru alternativele care ncep la fel. %e
exemplu, A + M - . 9mplementarea prezentat ar fi ncercat + i apoi - . 1e
observ c s-ar fi ncercat de dou ori.
Pentru evitarea acestei situa&ii se recurge la factorizare st/nga)
A AN
AN + M -
*olosind aceast metod, pentru A exist o singur posibilitate, iar alternativele
lui AN difer cu primul simbol, deci este uor de recunoscut alternativa corect fa& de
irul curent de la intrare. Aceast idee st la baza analizei sintactice descendente fr
reveniri. Aceasta ns nu se poate implementa pentru orice tip de gramatic
independent de context. 1e pune problema determinrii unei astfel de gramatici.
A.2. Analiza sin&ac&ic (escen(en& 5r re;eniri
9.2.1. Anali#or sintactic descendent recursi! de tip predicti!
"nalizoarele sintactice cu re6eniri se caracterizeaz printr7un timp mare de analiz5 din
acest moti6 'n practic sunt rar 'nt<lnite$ Dac dintr7o gramatic se elimin recursi6itatea de
st<nga i se aplica 1actorizare la st<nga5 gramatica de6ine analizabil prin metode de analiz
sintactic descendent5 1r s 1ie necesare re6eniri$ >n ast1el de analizor sintactic de numete
analiz'r sin&ac&ic (escen(en& rec)rsi; (e &i- -re(ic&i;.
:n cazul unui analizor sintactic predicti65 pentru un simbol de intrare Ua U i un neterminal
" care urmeaz s 1ie e,pandat5 trebuie s se poat decide care din alternati6ele "7Q1N 2 NRN n
este unica alternati6 din care pot deri6a iruri care s 'nceap cu UaV$ Cu alte cu6inte5 trebuie s
se aleag alternati6a corect cercet<nd doar simbolul curent din intrare -un singur simbol din
intrare/ i a6<nd acces la un singur simbol 'n arbore$
:n majoritatea limbajelor de programare construciile sintactice -instruciuni5 declaraii5
etc$/ 'ncep cu un cu6<nt c9eie tocmai 'n scopul de a 1acilita analiza$ Cu6intele c9eie 1iind distincte
de la o construcie la alta5 pe baza lor se poate alege producia corect pe parcursul analizei
sintactice$
>n analizor sintactic de tip recursi6 se compune tot din proceduri recursi6e5 c<te una
pentru 1iecare neterminal al gramaticii$ .pre deosebire de cazul analizorului cu re6eniri5 unde5
dac alegerea unei alternati6e se do6edete a 1i greit se selecteaz urmtoarea alternati65 'n
acest caz alegerea alternati6ei se 1ace e,clusi6 pe baza simbolului de intrare$ Odat aleas o
alternati65 euarea analizei este ec9i6alent cu neacceptarea intrrii$
.imbolului de anticipare selecteaz uni6oc procedura care trebuie apelat la un moment
dat$ .ec6ena de apeluri pentru prelucarea unui ir de intrare dat de1inete implicit arborele
sintactic corespunztor intrrii$
44
%,emplu$ 0ie produciile unei gramatici8
tip 7Q simplu N cid N arraF WsimpluX o1 tip
simplu 7Q integer N c9ar N num pp num
"nalizorul sintactic se 6a compune din 2 proceduri corespunztoare neterminalelor tip i
simplu precum i dintr7o procedur suplimentar notat coresp care 6a a6ansa simbolul de
anticipare la urmtorul caracter din intrare dup ce 6eri1ic corespondena dintre simbolul de
anticipare i argument$
!rocedure coresp-t8atom/=
*egin
I1 saKt t9en sa8Kurmatorul
%lse eroare-/=
%nd=
!rocedure tip=
*egin
I1 sa 'n Winteger5c9ar5numX t9en simplu
%lse i1 sa K dcd t9en begin
Coresp-UcV/= coresp-id/=
%nd
%lse
I1 saKarraF t9en begin
Coresp-arraF/= coresp-UWU/=
.implu= -J trateaza tipul indicelui J/
Coresp-UXV/= coresp-o1/=
Tip=
%nd
%lse eroare-/=
%nd= GtipH
!rocedure simplu=
*egin
I1 saKinteger t9en coresp-integer/
%lse i1 saKc9ar t9en coresp-c9ar/
%lse i1 saKnum t9en begin
Coresp-num/= coresp-pp/= coresp-num/=
%lse eroare-/=
%nd=
"naliza sintactic propriu7zis -programul principal/ 'ncepe cu un apel la procedura
pentru neterminalul de start al gramaticii -'n acest caz tip/$
Consider<nd analiza irului de intrare arraF W num pp numX o1 integer5 6om a6ea iniial sa
K arraF -simbolul de anticipare/$ :n procedura tip se 6a e,ecuta a treia ramur corespunztoare
celei de7a treia alternati6e din produciile pentru tip$
:n principiu 1iecare neterminal din partea dreapt a produciei care se regsete 'n
construcia procedurii respecti6e 6a determina un apel la procedura pentru acel neterminal iar
1iecare terminal 6a 1i pus 'n coresponden cu simbolul de anticipare$ .a g9ideaz -decide/
selecionarea produciei ce trebuie aplicat$ Dac partea drepat a produciei 'ncepe c9iar cu un
terminal5 acea productie se 6a aplica dac sa coincide cu terminalul$ Dac partea dreapt a
produciei 'ncepe cu un neterminal -e,8 tip 7Q simplu/ atunci 6a 1i selectat acea producie dac
din neterminalul respecti6 pot s deri6eze iruri care s 'nceap cu simbolul de anticipare$
4;
#ezult c analiza sintactic predicti6 se bazeaz pe in1ormaii despre simbolurile care
pot s 1ie primele 'n irul deri6at din partea dreapt a produciei$ Not<nd cu partea dreapt a
unei producii5 se de1inete ca !#I-/ mulimea tuturor simbolurilor terminale care pot s apar
pe prima poziie 'n cel puin un ir deri6at din $ Dac K sau poate genera 5 atunci se include
i 'n !#I-/$
%,emplu8 !#I-cid/KGcH
!#I-simplu/KGinteger5 c9ar5 numH
Dac prile drepte 'ncep cu un terminal -de e,emplu cu6<nt c9eie/ acel terminal este
singurul element al mulimii !#I i determinarea se 1ace 'ntr7un singur pas$
Considerm producia " 7Q N cu dou alternati6e pentru neterminalul "$ "naliza
sintactic descendent recursi6 de tip predicti6 cere ca !#I-/ i !#I-/ s 1ie disjuncte$
Dac aceast cerin nu este 'ndeplinit se poate 'ncerca rezol6area ei prin 1actorizare la st<nga$
>tilizarea produciilor 6ide -/
!roduciile cu 'n partea dreapt impun o tratare special 'n sensul c analizorul sintactic
descendent recursi6 utilizeaz implicit o producie 6id atunci c<nd nu se poate utiliza nici o alt
producie$
Instr 7Q begin corpDinstr end$
CorpDinstr 7Q listaDinstr N
"tunci c<nd se trateaz corpul instruciunii5 dac sa nu este 'n !#I -listaDinstr / nu se
6a e1ectua nici o acti6itate - dar nici nu se d eroare/ presupun<ndu7se c s7a selectat producia $
"cest alternati6 este corect numai dac sa este end5 'n caz contrar se 6a ajunge totui la eroare5
dar 'n procedura care trateaza instr$
A.2.2. r'iec&area )n)i analiz'r)l sin&ac&ic -re(ic&i;
CD
"nalizorul sintactic predicti6 este un program ce const dintr7o procedur pentru 1iecare
neterminal$ 0iecare procedur 6a e,ecuta dou aciuni8
a$ pe baza simbolului de anticipare decide care producie se 6a utiliza=
- dac sa este 'n !#I-/ se 6a utiliza producia cu partea dreapt
- dac e,ist un con1lict -ambiguitate/ 'ntre 2 pri drepte pentru acelai sa5 atunci
gramatica nu poate 1i analizat prin aceast metod$
- dac sa-!#I-// pentru nici o parte dreapt5 se 6a selecta producia cu 'n partea
dreapt -dac e,ist o ast1el de producie/$
b$ acti6itatea procedurii 6a urmri partea dreapt a produciei alese$ >n neterminal 'n partea
dreapt 6a determina apelul procedurii corespunzatoare acelui neterminal5 iar un
neterminal care corespunde simbolului de anticipare determin citirea urmtorului
atom$ :n cazul 'n care atomul din partea dreapt a produciei nu corespunde cu sa se
6a semnala eroare de sinta,$
B$2$+$ %,emplu de analizor sintactic complet realizat prin metoda de analiza cu descendeni recursi6i
)ramatica limbajului este urmtoarea8
program $
4B
bloc
bloc CON.T id K nr =
5
\"# id =
5
!#OC%D>#% = =
instructiune 8K
C"LL
*%)IN %ND
=
I0 TE%N
TEIL% DO
conditie ODD
K
<>
<
<=
>
>=
4A
id e,presie
id
instructiune
e,presie
e,presie
conditie instructiune
id bloc
conditie
instructiune
instructiune
e,presie
1actor identi1icator
e,presie
numar
e,presie @
7
@ 7
termen 1actor
J I
- /
Obser6aie8 J Numerele se consider a 1i de un singur 1el iar 1elul identi1icatorilor nu intereseaz
!rogram analDsintactic=
Label LL= Gabandonarea compilariiH
Const nrcu6c9eieK11=
T,ma,K1MM= Glungimea tabelei de simboluriH
idlungK1M=
TFpe codle, K-nede15 ident5 numar5 plus5 minus5 inm5 impr5 oddcl5 eY5 ne5 ge5 gt5 le5 lt5 prDstg5 prDdr5
6irgula5 punct5 punctD6irg5 atrib5 begincl5 endcl5 i1cl5 t9encl5 O9ilecl5 docl5 callcl5 constcl56arcl5
proccl/=
ObiectK-constanta56ariabila5procedura/=
\ar cl8codle,=
Id8stringW1MX= Gultimul identi1 citit de "L%&H
Num8integer= Gse considera doar nunere intregiH
c98c9ar=
cc5ll8integer=
linie8 Gtamponul de intrareH
c9eie8 arraFW1$$nrcu6c9eieX o1 codle,=
clsing8arraFWc9arX o1 codle,=
ts8 arraFWM$$tma,X o1 record
nume8stringW1MX=
1el8obiect=
%nd=
!rocedure initDanDle,RR
!rocedure eroareR$
!rocedure eroaregra6aR$$
!rocedure carurmR$
!rocedure anle,R$$
!rocedure bloc-t,8integer/=
!rocedure intrare-18obiect/= IIobiect8constante5proceduri5 6ariabile
*egin
t,8Kt,@1= IIe6entual se poate 6eri1ica depasirea indicelui T.
Oit9 tsWt,X do
begin
4L
termen
num8Kid=
1el8K1=
end=
end=
IIcauta id in tab de simb
1unction pozitie-id8stringW1MX/8integer=
6ar i8integer=
begin
tsWMX$nume8Kid= i8Kt,=
O9ile-tsWiX$numePQid/ do dec-i/=
pozitie8Ki=
end=
procedure declconst=
begin
i1 clKident t9en
begin
anle,=
i1 clKeY t9en
begin
anle,=
i1 clKnumar t9en
begin
intrare-constanta/=
anle,=
end=
else eroare-A/= -Jlipseste 6aloare pentru decl de constanteJ/
end=
else eroare-L/= -Jlipseste UKV in decl$ de const J/
end=
else eroare-1M/= -Jlipseste nume constanta J/
end=
procedure decl6ar=
begin
i1 clKident t9en
begin
intrare-6ariabila/=
anle,=
end=
else eroare-11/= -J lipseste nume simbolic J/
end=
procedure instructiune=
6ar i8integer=
procedure e,presie=
procedure termen=
procedure 1actor=
6ar i8integer=
begin
i1 clKident t9en
begin
i8Kpozitie-id/=
i1 iKM t9en eroare-12/
else i1 tsWiX$1elKprocedura t9en eroare-1+/=
anle,=
end=
;M
else i1 clKnumar t9en anle,
else i1 clKprstinga t9en
begin
anle,=
e,presie=
i1 clKprdreapta t9en anle,=
else eroare-13/=
end
else eroare-14/= -J eroare de 1actor J/
end= -J 1actor J/
begin -J termen J/
1actor=
O9ile cl in Winm5imprX do
begin
anle,=
1actor=
end=
end=
begin -Je,presieJ/
i1 cl in Wplus5minusX t9en anle,=
termen=
O9ile cl in Wplus5minusX do begin
anle,=
termen=
end=
end= -Je,presieJ/
procedure conditie=
begin
i1 clKoddcl t9en begin
anle,=
e,presie=
end
else begin
e,presie=
i1 not-cl in WeY5ne5lt5le5gt5geX/t9en eroare-1;/=
else begin
anle,=
e,presie=
end=
end=
end=
begin -JinstructiuneJ/
i1 clKident t9en begin
i8Kpozitie-id/=
i1 iKM t9en eroare-12/= -Jid nedeclaratJ/
i1 tsWiX$1el PQ6ariabila t9en eroare-1B/=
anle,=
i1 clKatrib t9en anle, else eroare-1A/=
e,presie=
end
else i1 clKcallcl t9en begin
anle,=
i1 clPQident t9en aroare-1L/ else begin
i8Kpozitie-id/=
i1 iKM t9en eroare-12/
else i1 tsWiX$1elPQprocedura t9en eroare-2M/=
;1
anle,=
end=
end
else -Jnot callclJ/
i1 clKbegincl t9en begin
anle,=
instructiune=
O9ile clKpunct6irg do begin
anle,=
instructiune= -J descendenta recursi6aJ/
end=
i1 clKendcl t9en anle, else eroare-21/=
end
else i1 clKi1cl t9en begin
anle,=
conditie=
i1 clKt9encl t9en anle, else eroare-22/=
instructiune= -J descendenta recursi6aJ/
i1 clKelsecl t9en begin
anle,=
instructiune=
end=
end
else i1 clKO9ilecl t9en begin
anle,=
conditie=
i1 clKdocl t9en anle, else eroare-2+/=
instructiune=
end
else eroare-23/=
end= -J instructiune J/
begin -J bloc J/
i1 clKconstcl t9en
begin
anle,=
declconst=
O9ile -clK6irgula/ do
begin
anle,=
declconst=
end=
i1 clKpunct6irg t9en anle, else eroare-24/=
end=
i1 clK6arcl t9en
begin
anle,=
decl6ar=
O9ile -clK6irgula/ do
begin
anle,=
decl6ar=
end=
i1 clKpunct6irg t9en anle, else eroare-24/=
end=
O9ile clKprocedurecl do
;2
begin
anle,=
i1 clKident t9en
begin
intrare-procedura/=
anle,=
end
else eroare-2;/=
i1 clKpunct6irg t9en anle, else eroare-24/=
bloc-t,/=
i1 clKpunct6irg t9en anle, else eroare-24/=
end -JO9ileJ/
instructiune=
end= -JblocJ/
begin -Jprogram mainJ/
initale,=
anle,=
bloc-M/=
i1 clPQpunct t9en eroare-2B/=
LL8 Oriteln-U1atal errorV/=
end$
A.2. ?. Analiz'r sin&ac&ic -re(ic&i; nerec)rsi; CE
>n algoritm recursi6 poate 1i trans1ormat 'ntr7unul nerecursi6 prin gestiunea e,plicit a unei
sti6e de lucru$ !roblema esenial de rezol6at pentru un analizor sintacti6 predicti6 nerecursi6 -".!N/
este de a alege 'n mod unic producia pentru e,pandarea unui neterminal$
:n 6arianta nerecursi6 aceasta se realizeaz prin cutarea 'ntr7o tabel de analiz sintactic$
Din acest punct de 6edere metoda este dirijat de tabele$
tampon de intrare
sti6a ieire
-5 id
regula %V7Q
regula T7Q0TV
regula TV7Q
-5 id regula %7QT%V
.e poate construi apoi urmtorul tabel8
id @ J - /
prim -%/ true 1alse 1alse true 1alse 1alse
prim -%V/ 1alse true 1alse 1alse 1alse true
prim -T/ true 1alse 1alse true 1alse 1alse
prim -TV/ 1alse 1alse true 1alse 1alse true
prim -0/ true 1alse 1alse true 1alse 1alse
Calculul mulimii )r, pentru neterminalele gramaticii se realizeaz prin aplicarea repetat a
urmtoarelor reguli p<n c<nd nu se mai pot adauga noi simboluri$
1 arcajul e al sirului de intrare se adauga la urm-./$ -iniializare/
2 Dac 'n gramatica e,ist o producie de 1orma " 7Q *5 atunci simbolurile din prim-/ mai putin
aparin lui urm-*/
+$Dac 'n gramatica e,ist o producie de 1orma " 7Q * sau o producie " 7Q * cu prim-/5
atunci adaug urm-"/ la urm-*/$
!entru e,emplul dat a6em urmtoarele etape ale construirii acestei mulimi8
% %V T TV 0
e iniializare
/
@
J
regula %V 7Q @T %V
regula 07Q-%/
regula TV 7Q J 0 TV
e 5 /
e 5 /
e5/5@
e5/5@
regula %7QT%V
regula %V 7Q @T %V
regula T7Q0TV
regula T7Q0TV
e 5 / e 5 / @5e5/ e5/5@ J5e 5 /5@ 0inal
- "daug e la urm-%/ deoarece % este simbolul de start
- Deooarece %V 7Q @T %V 5 prim-%V / mai puin se include 'n urm-T/5 adic @
- Deoarece 0 7Q -%/ 5 se include / 'n urm-%/
- Deoarece TV 7Q J 0 TV 5 se include prim-TV/ mai puin 'n urm-0/5 adic J
- Deoarece % 7Q T %Z se adaug urm-%/ la urm-%Z/5 adic e i /
- Deoarece prim-%Z/ i %V 7Q @T %V se adaug urm-%Z/ la urm-T/5 adic / i e
- Deoarece T 7Q 0 TV 5 se adaug urm-T/ la urm TZ5 adic e5/5@
;;
- Deoarece prim-TZ/ i TV 7Q J 0 TV se adaug urm-TZ/ la urm 05 adic e5/5@
.e poate construi apoi urmtorul tabel8
id @ J - / e
urm -%/ 1alse 1alse 1alse 1alse true true
urm -%V/ 1alse 1alse 1alse 1alse true true
urm -T/ 1alse true 1alse 1alse true true
urm -TV/ 1alse true 1alse 1alse true true
urm -0/ 1alse true true 1alse true true
urm-% / K G e 5 / H urm-TV / K G @ 5 / 5 e H
urm-%V/ K G e 5 / H urm-0 / K G J 5 @5 / 5 e H
urm-T / K G @ 5 / 5 e H
A.2.A. C'ns&r)irea &a:el)l)i A!N
Dup cum s7a aratat deja5 tabelul de analiz5 W"5aX 6a conine8
- 1ie o producie care este 1olosit pentru e,pandarea neterminalului " din 6<r1ul sti6ei atunci c<nd
'n intrare apare simbolul a
- 1ie W"5aX este 6id5 adic starea -"5a/ nu poate apare pentru un ir de intrare corect$
Algoritm pentru construirea tabelului A53("
Jla intrare a6em o gramatic )5 iar la ieire se obine tabela pentru ".!N
1$ !entru 1iecare producie a gramaticii de 1orma "7Q se aplic paii 2 i +
2$ !entru simbolul a prim-/5 intrrile W"5aX de6in " 7Q
+$ Dac prim-/5 atunci pentru b urm-"/ se completeaz W"5bX cu producia "7Q $
Dac prim-/ i e urm-"/ atunci W"5eX 6a conine "7Q
3$ Intrrile rmase necompletate 'n urma pailor 2 i + reprezint intrri de eroare -6or 1i
6ide/$
Adic:
!entru 1iecare "7Q e,ecut8
!entru 1iecare a prim-"/ adaug "7Q la W"5aX
i1 prim-/ t9en
!entru 1iecare b urm-"/ adaug "7Q la W"5bX
Intrrile rmase necompletate 6or 1i 6ide i reprezint intrri de eroare$
Ideea de baz a algoritmului este 8 se 6a e,panda neterminalul " 'n irul dac a prim-/
sau dac K -e6entual KJQ / i a urm-"/ sau dac a K e urm-"/$
0olosind 1unciile prim i urm deja teterminate8
prim-%/KG id 5 - H
prim-%V/ KG @ 5 H
prim-T/ K G id 5 -H
prim-TV / K G J5 H
prim-0/ K G id5 - H
urm-% / K G e 5 / H
urm-%V / K G e 5 / H
urm-T / K G @ 5 / 5 e H
urm-TV / K G @ 5 / 5 e H
urm-0 / K G J 5 @5 / 5 e H
% 7Q T %Z
%V 7Q @T %V N
T7Q 0 TV
TV 7QJ0TVN
0 7Q -%/ N id
\om obine abela de ".!N construit pe baza regulilor enunate8
!i,:'l (e in&rare
;B
Ne&er,inal id @ J - / e
% %7QT%Z 7 7 %7QT%Z 7 7
%Z 7 %Z7Q@T%Z 7 7 %Z7Q %Z7Q
T T7Q0TZ 7 7 T7Q0TZ 7 7
TZ 7 TZ7Q TZ7QJ0TZ 7 TZ7Q TZ7Q
0 07Qid 7 7 07Q-%/ 7 7
W%5idX K %7QT%V 5 W%5-X K %7QT%V prin urmare UidV i U-U aparin lui prim-T/
A.2.D. Gra,a&ici JJ(1) (in(e-en(en&e (e c'n&ex&) analiza:ile c) A!N
:n principiu5 algoritmul de construire a tabelei se poate aplica pentru orice gramatic$ !entru
unele gramatici 'ns5 tabela poate a6ea intrri multiplu de1inite -mai multe producii pentru acelai
element al gramaticii/$
Dac gramatica este recursi6 la st<nga sau este ambigu5 atunci tabela 6a conine cel puin o
intrare multiplu de1init$
De e,emplu5 pentru instructiunea i18
PinstrQ 7Q i1 Pe,presieQ t9en PinstrQ PalternQ N a
PalternQ 7Q else P instrQ N
Pe,prQ 7Q b
Tabela de
".!N8
simbol terminal
Neterminal a b else i1 t9en e
PinstrQ PinstrQ7Qa 1
PalternQ 2 PalternQ7Q
Pe,prQ Pe,prQ7Qb
unde8
1K PinstrQ 7Q i1 Pe,prQ t9en PinstrQ PalternQ
2KPalternQ 7Q else PinstrQ
PalternQ 7Q
%lementul WPalternQ5 elseX este dublu de1init deoarece >rm-PalternQ/KGelse5eH$ Cauza este
ambiguitatea gramaticii mani1estat la alegerea produciei ce trebuie aplicat 'n momentul apariiei lui
else 'n intrare5 cunoscut ca problema atarii lui else$ !entru a ataa else cu cel mai apropiat t'en care
'l precede alegem producia PalternQ 7Q else PinstrQ$
De5ini2ie8 )ramaticile independente de conte,t care permit o analiz descendent 1r re6eniri
1olosindu7se e6entual de urmtoarele 2 simboluri din intrare se numesc gramatici LL-2/$
!rimul L semni1ic 1aptul c preluarea simbolului din intrare se 1ace de la st<nga la dreapta5
iar al doilea L 1aptul c la analiz se dorete reconstituirea unei deri6ri st<nga$ :n practic se utilizeaz
de obicei cazul c<nd 2K15 caz 'n care pentru analiz se 1olosete un singur simbol din intrare5 cel
curent$
Observa$ie: "plic<nd algoritmul de ".!N prezentat pentru o gramatic LL-1/5 nu rezult intrri
multiplu de1inite$
"plic<nd algoritmul de construire a tabelei pentru ".!N 'n cadrul gramaticii LL-1/ rezult o
singur tabel care 6a recunoate 1orme propoziionale corecte din gramatica L-)/ i doar pe acestea5
deci metoda este corect i complet$ Nici o gramatic ambigu sau recursi6 la st<nga nu poate 1i
LL-1/$
Considerm produciile " 7Q 1 N 2 N $ Nn dintr7o gramatic$
De5ini2ie8 O gramatic independent de conte,t este LL-1/ dac pentru orice neterminal al gramaticii
sunt 'ndeplinite urmtoarele dou condiii8
;A
prim-i/ prim-j/ K mulimea 6id5 oricare ar 1i i5j 'n inter6alul W15nX cu iPQj=
adic) lu/nd n considerare oricare dou pr&i drepte, nu se pot deriva din ambele iruri care
ncep cu acelai terminal, sau eventual
dac prim-i/ oricare ar 1i i 'n inter6alulW15nX5 atunci urm-"/prim-j/ este mulimea
6id5 unde 1PKjKPKn5 iPQj= cu alte cu6inte8 dac dintr7o anumit parte dreapt se poate
deri6a irul 6id5 atunci din oricare din celelalte pri drepte nu se pot deri6a iruri care s
'nceap cu un terminal$
Dac gramatica respect cele dou condiii5 atunci este LL-1/$
.e pune 'ntrebarea8 cum trebuie procedat dac la construirea tabelei de analiz apar intrri
multiplu de1inite$ !rima soluie este de a trans1orma gramatica prin eliminarea recursi6itii de st<nga
i a ambiguitii$ %,ist 'ns gramatici neambigue i nerecursi6e la st<nga -i1/ care nu sunt LL-1/$ :n
ast1el de cazuri se pot introduce reguli euristice pentru alegerea produciilor corecte 'n cazul intrrilor
multiplu de1inite$ :n e,emplul anterior s7a ales 'n mod arbitrar 6arianta WPalternQ5 elseX K PalternQ 7Q
else PinstrQ$
:n general nu e,ist reguli uni6ersale prin care intrrile multiplu de1inite din tabela se pot
reduce la o singur 6aloare 1r a a1ecta limbajul recunsocut de analiz$ :n concluzie5 principala
di1icultate 'n utilizarea ".!N const 'n scrierea gramaticii pentru limbajul surs ast1el 'nc<t s se poat
construi tabela de analiz$
Dei eliminarea recursi6itii de st<nga i 1actorizarea la st<nga sunt uor de realizat5 aceste
operaii complic at<t gramatica c<t i aplicarea gramaticii 'n traducere$ De asemenea gramatica
recunoscut pierde din acuratee$ Din punct de 6edere practic5 instruciunile sunt analizate prin metoda
".!N iar e,presiile 6or 1i analizate prin alte metode5 de obicei cele bazate pe precedena operatorilor$
A.2.E. 0e;enirea (in er'ri 7n caz)l A!N
"naliza sintactic 'ncearc o punere 'n coresponden a simbolurilor -terminale i
neterminale/ din sti6 cu simbolurile din intrare$ O eroare sintactic poate apare 'n urmtoarele dou
cazuri8
- simbolul terminal din 6<r1ul sti6ei nu coincide cu simbolul din intrare
- simbolul neterminal din 6<r1ul sti6ei 'mpreun cu simbolul din intrare selecteaz 'n tabela
de ".!N o intrare 6id
#e6enirea din eroare 'n modul panic8
!rincipial5 metoda se bazeaz pe eliminarea de simboluri din intrare p<n la apariia unui atom
dintr7o mulime de atomi de sincronizare$ Calitatea tratrii erorilor depinde de alegerea mulimii de
sincronizare$
)egulile pentru construirea mulimii atomilor de sincronizare sunt8
1$ ulimea atomilor de sincronizare pentru " este iniializat cu urm-"/5 aceasta 'nseamn c
se 6or elimina succesi6 din intrare simboluri p<n la apariia unui simbol din urm-"/5 'n continuare se
elimin " din 6<r1ul sti6ei i e,ist posibilitatea de a continua 'n mod normal analiza
2$ 0i,area mulimii atomilor de sincronizare pe urm-"/ nu este su1icient 'n cazul limbajelor
'n care U=V este terminator -C5!ascal/$ :n acest caz5 la atomii de sincronizare pentru neterminalele
corespunzatoare e,presiilor5 se adaug mulimea cu6intelor c9eie cu care 'ncep instruciunile$ "lt1el5
absena lui U=V poate duce la omiterea cu6intelor c9eie cu care 'ncepe instruciunea urmtoare5 ceea ce
'nseamn c o posibil re6enire din erori 6a 1i tardi6$
0iecare limbaj are o structur ierar9ic a construciilor potri6it creia se includ e,presiile 'n
instruciuni5 etc$ De aceea5 o soluie este ca la mulimea atomilor de sincronizare pentru construciile
in1erioare s se adauge simbolurile cu care 'ncep construciile superioare -de e,emplu pentru e,presii
se adaug terminalele cu care 'ncep instruciunile/$
+$ :n situaia 'n care 'n mulimea atomilor de sincronizare pentru neterminalul " se includ
simbolurile din prim-"/5 analiza s7ar putea relua c9iar cu " 'n 6<r1ul sti6ei - nu se mai e,trage " din
sti6/$
3$ dac neterminalul din 6<r1ul sti6ei poate genera irul 6id atunci producia din care deri6
se poate aplica implicit 'n caz de eroare iar prin e,pandarea neterminalului respecti6 la irul 6id el 6a 1i
;L
e,tras din sti6$ !roced<nd ast1el se 6a 'nt<rzia detectarea erorilor 1r a se omite cu6intele c9eie$ !rin
aceast regul se 6a reduce numrul de neterminale care trebuie considerate la tratarea erorilor$
4$ dac terminalul din 6<r1ul sti6ei nu coincide cu terminalul din intrare se elimin terminalul
din 6<r1ul sti6ei i se a1ieaz un mesaj de eroare$ !rin urmare5 mulimea atomilor de sincronizare
pentru terminale este 1ormat din toate celelalte terminale$
si,:'l (e in&rare
Ne&er,i-
nale
i( K * ( ) G
% %V7QT%V 7 7 %7QT%V 7 .inc
%V 7 %V7Qe T%V 7 7 %V 7Q %V 7Q
T T7Q0TV sinc 7 T7Q0TV sinc .inc
TV 7 TV 7Q TV7QJ0TV 7 TV 7Q TV 7Q
0 07QId sinc sinc 07Q-%/ sinc .inc
Intrrile de sincronizare au 1ost completate aplic<nd regula 1 pe baza simbolurilor din mulimea
urmtoare$
"naliza sintactic 'n caz de eroare decurge ast1el8
1$ 'n 6<r1ul sti6ei se a1l neterminalul "8
J se 6a cuta dac W"5aX este 6id5 atunci se 6a omite simbolul curent din intrare5 a
Jdac W"5aX conine atom de sincronizare atunci se 6a e,trage " din 6<r1ul sti6ei i a6ansm
'n intrare p<n c<nd simbolul curent este prezent 'n mulimea sinc
2$ dac 'n 6<r1ul sti6ei este un terminal care nu coincide cu simbolul de intrare curent5 atunci
se 6a omite simbolul din 6<r1ul sti6ei5 con1orm regulii 4
:n toate situaiile5 dup e1ectuarea operaiilor de mai sus se 6a relua analiza$
0ie irul de intrare / id J @ id
!&i;a Ln&rare c'ncl)zii
e% /idJ@ide W%5/XK6id KQerrorg
e% idJ@ide
e%V T idJ@ide
e%V TV0 idJ@ide
e%V TV id idJ@ide
e%V TV J@ide
e%V TV 0J J@ide
e%V TV 0 @ide W05@X KQ sinc KQ errorg
e%V TV @ide intrarea 'l conine pe @5 rm<ne intrare cu @
e%V @ide
e%V T@$$$ @ide
"naliza de mai sus a neglijat problema mesajelor de eroare5 care rm<ne totui important
pentru proiectarea compilatorului i trebuie i ea tratat$
>n alt mod de tratare a erorilor care se poate aplica este re6enirea la ni6el de propoziie$
:n acest caz intrrile 6ide din tabela de analiz se completeaz cu pointeri spre rutine de
tratare a erorilor$ "ceste rutine acioneaz de obicei asupra simbolului curent din intrare i 'n principiu
pot sc9imba simbolul curent din intrare cu altul5 'l terg sau insereaz un simbol nou -cerut de situaia
din sti6/ i emit 'n paralel i un mesaj de eroare$ .e pot concepe rutine de tratare care s acioneze i
asupra sti6ei5 cu precizarea c eliminarea sau inserarea unui simbol 'n sti6 stric procesul de deri6are
i poate s conduc la situaii 'n care irul 1inal nu corespunde nici unei porpoziii sau deri6ri din
limbaj$ De asemenea5 e,ist pericolul de a intra 'n ciclu in1init$ "cesta se poate e6ita cu certitudine
dac se adopt msura ca 'n urma oricrei aciuni de re6enire s se a6anseze cel puin un simbol 'n
intrare5 iar dac intrarea s7a epuizat5 atunci s se a6anseze 'n sti6$
BM
D. Analiza sin&ac&ic ascen(en&. rezen&are /eneral
C1M
.e 6a prezenta un tip general de analizor numit `cu deplasare i reducerea$ "cesta 'ncearc s
construiasc arborele sintactic pentru irul de intrare 'ncep<nd de la 1runze spre rdcin -ascendent/$
- !rocesul poate 1i pri6it ca o reducere a unui ir de terminale la simbolul de start al gramaticii$
- :n 1iecare pas al reducerii se caut 'n 1orma propoziional curent localizarea unui subir
care s corespund prii drepte a unei producii$ "cest subir se 'nlocuiete cu partea st<ng
a produciei respecti6e$ Dac subirul este corect ales5 la 1iecare pas se 6a parcurge 'n sens
in6ers o deri6are dreapta$
Exemplu 8 1ie gramatica8
. 7Qa"*e
"7Q"bcNb
*7Qd
!entru irul de intrare abbcde a6em urmtoarea parcurgere 'n sens in6ers a unei deri6ri dreapta8
abbcde 7Q a"bcde 7Q a"de 7Q a"*e 7Q .
#educerile corespund parcurgerii 'n sens in6ers a urmtoarei deri6ri drepte8
. 7Q a"*e 7Q a"de 7Q a"bcde 7Q abbcde
D.1. Ca-e&e
>n ca-& al unui ir este un subir care corespunde prii drepte a unei producii i a crui
'nlocuire cu neterminalele din partea st<ng a produciei reprezint un pas 'n parcurgerea 'n sens in6ers a
unei deri6ri dreapta$
Nu toate subirurile care sunt pri drepte ale unei producii "7Q i care pot 1i localizate ca
subiruri ale unei 1orme propoziionale sunt 'n acelasi timp i capete pentru c este posibil ca prin
reducerea lui la " procesul de reducere s se bloc9eze 1r s se poat 1ace reducerea la simbolul de start
al gramaticii$
Exemplu8 dac se aplic reducerea a"bcde 7Q a""cde procesul se 6a bloca$
#ezult c trebuie dat o (e5ini2ie ,ai ri/)r'as noiunii de capt8
.iind dat o form propozi$ional ++ un capt al su const:
- dintr%o produc$ie A%6 i
- dintr%o propozi$ie #n #n care poate fi localizat irul astfel #nc&t prin #nlocuirea cu A se
ob$ine forma propozi$ional anterioar a unei derivri dreapta a lui "
Exemplu8 .KJQ " KQ = captul este 1ormat din producia "7Q i din propoziia care urmeaz
lui $
Observa$ie8 irul 5 situat 'n dreapta captului conine numai terminale$
:n cazul 'n care gramatica este ambigu5 irul s7ar putea obine prin mai multe deri6ri
dreapta$ #ezult c el ar putea s conin mai multe capete -deci ambiguitatea e o problem/$
Dac gramatica nu este ambigu5 captul corespunztor unei anumite 1orme propoziionale este
unic$ )ra1ic5 procesul de reducere al unui capt se poate reprezenta ast1el8
.
a " * e
" * c
Captul reprezint cel mai din st<ng subarbore complet5 1ormat dintr7un nod i toi 1iii si$
!rintele -'n cazul nostru "/ este nodul cel mai de jos i cel mai din st<nga a6<nd toi 1iii prezeni 'n arbore
B1
sub 1orm de 1runze$ #educerea unui capt la partea st<ng a produciei respecti6e se numete 5as'narea
ca-&)l)i i const din 'ndeprtarea 1iilor lui " din arborele sintactic$
Exemplu8 1ie gramatica ambigu
% 7Q % @ %
% 7Q % J %
% 7Q -%/
% 7Q id
pentru irul de intrare8 id@ id J id
-1/ % KdQ % @ % KdQ % @ % J % KdQ % @ % J id+ KdQ % @ id2 J id+ KdQ id1 @ id2 J id+
1e observ c irurile situate n dreapta unui capt con&in exclusiv simboluri terminale.
Cramatica dat fiind ambigu exist i urmtoara derivare dreapta distinct de prima)
-2/ % KdQ % J % KdQ % J id+ KdQ % @ % J id+ KdQ % @ id2 J id+ KdQ id1 @ id2 J id+
:n e,emplul dat e,ist 2 capete5 corespunztoare primei i respecti6 celei de7a doua deri6ri
dreapta prezentate$ %,istena celor 2 deri6ri dreapta semni1ic prioriti relati6e di1erite ale operatorilor UJV
i U@V$ La primul model de deri6are este mai prioritar UJV$
D.2. $as'narea ca-e&el'r
0asonarea capetelor se poate considera i ca procesul de parcurgere 'n sens in6ers a unei deri6ri
dreapta$ .e pornete de la un ir de analizat$ Dac aparine limbajului descris de gramatica dat5
atunci el se poate obine dintr7un pas oarecare n al unei deri6ri dreapta 'nc necunsocute5 dar care are
urmtoarea 1orm8
. KdQ M KdQ 1 KdQ R KdQ n KdQ
#econstituirea 'n sens in6ers a acestei deri6ri const 'n localizarea 'n 1orma propoziional n a
unui capt n i 'nlocuirea lui cu partea st<ng a produciei$ "n 7Q n5 obin<ndu7se ast1el 1orma
propoziional n71$ "poi se continu procedeul cu n71 etc$ Dac 'n 1inal s7a ajuns la simbolul de start al
gramaticii5 'nseamn c procesul de analiz s7a 'nc9eiat cu succes$
Exemplu8 Considerm din nou gramatica din e,emplul precedent8
% 7Q % @ % N % 7Q % J % N % 7Q -%/ N % 7Q id
cu irul de intrare8 id1 @ id2 J id+
.ec6ena de reduceri prezentat 'n continuare reprezint in6ersul sec6enei din prima deri6are
-unde J este mai prioritar8 % KdQ % @ % KdQ % @ % J % KdQ % @ % J id+ KdQ % @ id2 J id+ KdQ id1 @ id2 J
id+/
1orma propoziional dreapta capt producie pentru reducere
id1 @ id2 J id+ id1 % 7Q id
% @ id2 J id+ id2 % 7Q id
% @ % J id+ id+ % 7Q id
% @ % J % % J % % 7Q % J %
% @ % % @ % % 7Q % @ %
D.3. L,-le,en&area c) s&i; a analizei sin&ac&ice (e &i- (e-lasare-re()cere
!entru implementarea analizei sintactice bazat pe 1asonarea capetelor trebuiesc rezol6ate dou
probleme8
1$ Localizarea subirului care urmeaz s 1ie redus 'n 1orma propoziional curent
2$ :n cazul 'n care gramatica are mai multe producii cu aceeai parte dreapt5 trebuie s decidem care
este producia ce se 6a aplica$
Ca structur de date de baz se poate utiliza o sti6 'n care se 6or deplasa simbolurile gramaticale
din tamponul de intrare i se 6or localiza capetele$
- Tamponul de intrare conine irul de analizat $
B2
- *aza sti6ei i respecti6 e,tremitatea dreapt a irului de intrare 6or 1i marcate printr7un simbol
special UeV$
- La 'nceput sti6a este goal5 conine doar simbolul UeV iar la intrare irul este e$
- La 1iecare pas al analizei5 analizorul deplaseaz 'n sti6 M sau mai multe simboluri de intrare5
p<n 'n momentul 'n care 'n 6<r1ul sti6ei apare un capt 5 apoi se reduce la partea st<ng a
produciei respecti6e i se continu ciclic aceste operaii5 1ie p<n c<nd sti6a conine doar
simbolul de start i intrarea este goal5 1ie p<n c<nd se detecteaz o eroare$
- :n con1iguraia 1inal5 sti6a 6a conine Ue.V iar 'n intrare 6om a6ea simbolul UeV$ Dac se
ajunge 'n aceast con1iguraie 1r eroare5 se 6a semnala terminarea cu succes a analizei$
Exemplu:
s&i;a in&rare ac&i)ne
e id1 @ id2 J id+ e deplasare
e id1 @ id2 J id+ e reducere %7Qid
e % @ id2 J id+ e deplasare
e % @ id2 J id+ e deplasare
e % @ id2 J id+ e reducere % 7Q id
e % @ % J id+ e deplasare
e % @ % J id+ e deplasare
e % @ % J id+ e reducere % 7Q id
e % @ % J % e reducere % 7Q % J %
e % @ % e reducere % 7Q % @ %
e % e succes
Din acest e,emplu rezult c analizorul e,ecut urmtoarele 3 aciuni
1 Deplasare8 simbolul de intrare curent este introdus 'n sti6
2 #educere8 se realizeaz 'n situaia 'n care e,tremitatea dreapt a unui capt se a1l 'n 6<r1ul sti6ei=
analizorul trebuie s localizeze e,tremitatea s st<ng5 s stabileasc neterminalul cu care trebuie
'nlocuit captul i s realizeze e1ecti6 reducerea lui$
+ "cceptare8 analizorul semnaleaz terminarea cu succes a analizei
3 %roare8 se apeleaz o rutin de eroare dac s7a detectat un caz de eroare
Observa$ie8 utilizarea sti6ei ajut la localizarea captului pentru c el 6a 1i situat 'ntotdeauna 'n 6ar1ul
sti6ei$
odalitatea concret a alegerii uneia dintre aciuni depinde de tipul concret de analiz5 care poate 1i de
mai multe 1eluri8
7 bazat pe precedena operatorilor
7 de tipul le1t7rig9t
D.?. re5ixe ;ia:ile
ulimea pre1i,elor 1ormelor propoziionale dreapta care pot s apar 'n sti6a unui analizor
sintactic cu deplasare i reducere se numesc pre1i,e 6iabile$
"lt1el spus5 un pre1i, 6iabil este un pre1i, al unei 1orme propoziionale dreapta care nu continu
dincolo de e,tremitatea dreapt a celui mai din dreapta capt al acelei 1orme propoziionale$
Consecina acestei de1iniii este aceea c 'ntotdeauna este posibil s se adauge simboluri
terminale la e,tremitatea unui pre1i, 6iabil pentru a obine o 1orm propoziional dreapta$
!e parcursul analizei sintactice nu 6a apare nici o eroare at<ta timp c<t poriunea de intrare 6zut
p<n la un anumit punct poate 1i redus la un pre1i, 6iabil$
D.@. C'n5lic&e 7n &i,-)l analizei sin&ac&ice c) (e-lasare 6i re()cere
B+
- %,ist gramatici independente de conte,t la care nu se poate aplica analiza sintactic cu
deplasare i reducere$ !entru o ast1el de gramatic5 analizorul poate ajunge 'ntr7o con1iguraie
'n care5 cunosc<nd 'ntreg coninutul sti6ei i urmtoarele simboluri din intrare5 nu se poate
decide dac trebuie e1ectuat o deplasare sau o reducere$ "cest tip de con1lict se numete
con1lict (e-lasare-re()cere$
- :n alte situaii analizorul nu poate decide ce reducere s e1ectueze dintre mai multe posibile$
%ste cazul con1lictelor re()cere-re()cere$
Observa$ie: 7 )ramaticile 'n care nu pot apare ast1el de con1licte se numesc gramatici L#$
7 Clasa gramaticilor pentru care pot s apar ast1el de con1licte nu se incadreaz 'n clasa
L#$
%,emplu8
)ramatica instruciunii i1 5 care este ambigu nu este L#$
PinstructiuneQ 7Q i1 Pe,prQ t9en PinstrQ N
i1 Pe,prQ t9en PinstrQ altce6a
sti6a intrare
i1 Pe,prQ t9en PinstrQ else R e
!entru con1iguraia dat5 nu se poate decide dac 6<r1ul sti6ei este un capt sau nu$ "6em deci un
con1lict deplasare7reducere5 'ntruc<t 'n 1uncie de ceea ce urmeaz 'n intare5 poate 1i corect s se reduc i1
Pe,prQ t9en PinstrQ la PinstrQ sau ar putea 1i corect s se deplaseze else din intrare 'n sti6 5 urmat de
cutarea unei alte PinstrQ5 pentru ramura de else$
Deoarece nu se poate lua decizia pe baza unui singur simbol de anticipare5 se spune c gramatica
nu este L#1$
:n general5 nici o gramatic ambigu -ca cea de sus/ nu poate s 1ie L#25 oricare ar 1i 2 NJ$
"nalizorul sintactic cu deplasare7reducere poate 1i uor adaptat pentru a analiza i gramatici
ambigue ca cea de mai sus prin decizia ca orice con1lict de tipul deplasare7reducere s se rezol6e 'n
1a6oarea deplasrii$ .e obser6 c lu<nd aceast decizie 'n situaia de mai sus5 analiza decurge corect$
O alt situaie pentru gramaticile non L# este atunci c<nd se localizeaz cu certitudine un capt5
dar coninutul sti6ei i simbolul curent din intrare nu sunt su1iciente pentru a determina care producie
trebuie utilizat pentru reducere -con1lict reducere7reducere/$
Exemplu: dispunem de un analizor le,ical care 1urnizeaz atomul le,ical id pentru orice
identi1icator5 indi1erent de utilizarea acestuia -cazul normal/$ !resupunem c 'n limbajul ales apelurile de
proceduri pe de o parte i re1erirea elementelor de tablou pe de alt parte5 au aceeai 1orm sintactic5 adic
un nume i argumentele 'ntre paranteze$ Deoarece din punct de 6edere semantic traducerea indicilor 'n
re1erine de tablou di1er substanial de traducerea argumentelor la apelurile de proceduri i 1uncii5 trebuie
s utilizm producii di1erite pentru a genera listele de indici i respecti6 listele de argumente5 ca 'n
gramatica urmtoare8
-1/ PinstrQ 7Q id -PlistaDparamQ/
-2/ PinstrQ 7Q Pe,presieQ 8KPe,presieQ
-+/ PlistaDparamQ 7Q PlistaDparamQ5PparametruQ
-3/ PlistaDparamQ 7Q PparametruQ
-4/ PparametruQ 7Q id
-;/ Pe,presieQ 7Q id -PlistaDe,prQ/
-B/ Pe,presieQ 7Q id
-A/ PlistaDe,prQ 7Q PlistaDe,prQ5Pe,presieQ
-L/ PlistaDe,prQ 7Q Pe,presieQ
Considerm o instruciune care 'ncepe cu a-i5j/ i presupunem c am ajuns 'n situaia 'n care
primii trei atomi au 1ost trans1erai 'n sti6$
sti6a intrare
R - id id /R e
B3
%ste e6ident c id din 6<r1ul sti6ei trebuie redus5 dar nu se tie care dintre producii trebuie
utilizat$
Dac UaV este procedura5 ar trebui aleas pentru reducere producia -4/5 iar dac a este element de
tablou5 trebuie aplicat producia -B/$
!entru a lua o decizie5 ar trebui consultat tabela de simboluri -dac acolo in1ormaiile sunt
completate/$
O soluie pur sintactic la aceast situaie const 'n modi1icarea analizorului le,ical ast1el 'nc<t s
1urnizeze un atom distinct -procid/ c<nd UaV este un nume de procedur$
Cu modi1icarea propus5 pentru cazul c<nd 'n situaia de mai sus este un apel de procedur5
coninutul sti6ei i al intrrii este urmtorul8
sti6a intrare
procid - id 5 id / R e
"st1el5 de6ine clar c reducerea lui id se 1ace prin -4/$
Observa$ie:
7 Decizia pri6ind reducerea este luat pe baza simbolului al treilea de sub 6<r1ul sti6ei
-procid/ care nici mcar nu particip la reducere$
7 #ezol6area con1lictelor reducere7reducere pe baza modi1icrilor de gramatic este metoda
general de rezol6are a acestei situaii
-1/ PinstrQ 7Q procid - PlistaDparamQ/
D.=. Analiza sin&ac&ic :aza& -e -rece(en2a '-era&'ril'r
"cest tip de analiz sintactic se poate aplica doar la o clas redus de gramatici5 dar este
important datorit rsp<ndirii ei i are a6antajul c analizorul se poate construi uor manual$
!rintre alte cerine eseniale5 gramatica la care se aplic acest tip de analiz5 trebuie s aib
urmatoarele dou proprietai8
1$ . nu aib producii 6ide
2$ :n nici o producie s nu e,iste o parte dreapt care s conin dou neterminale adiacente$
)ramaticile care respect condiia 2 se numesc /ra,a&ici (e '-era&'ri
% 7Q %"% N -%/ N 7% N id
unde " poate 1i8
" 7Q @ N 7 N J N I N c
Dac se substituie " atunci se obine
% 7Q % @ % N % ] % N % J % N % I % N % c % N -%/ N 7% N id
"cest mod de trans1ormare este general i se 6a urmri cu precdere$
O gramatic de operatori nu trebuie neaprat s 1ie o gramatic de e,presii$
etoda are i importante dezavanta2e
- sunt di1icil de prelucrat atomi care au 2 precedene di1erite -de e,$ semnul U7U/
- #elaia dintre analizor i gramatic nu este 'ntotdeauna biuni6oc= este posibil ca analizorul s
accepte iruri -consider<ndu7le corecte/5 care nu 1ac parte din limbajul gramaticii -deci nu se
semnaleaz toate erorile/$
- Clasa de gramatici acceptate este redus
Datorit simplitii ei5 aceast te9nic s7a utilizat 'n multe compilatoare e,istente pentru analiza
e,presiilor5 'n timp ce instruciunile limbajului i celelalte construcii de ni6el 'nalt sunt analizate prin alte
metode -de e,emplu cu descendeni recursi6i/$ %,ist totui i compilatoare bazate complet pe aceast
te9nic$
D.=.1. De5inirea rela2iei (e -rece(en2
:n analiza sintactica bazat pe precedena operatorilor se de1inesc + relaii de preceden disjuncte8
P5 K5 Q care se stabilesc 'ntre anumite perec9i de terminale ale gramaticii$ !e baza acestor relaii se
selecteaz captul 1ormei propoziionale 'n sti6a analizorului$ .emni1icaia lor este urmtoarea8
rela&ia se,ni5ica2ia
a P b a cedeaz precedena lui b
B4
a K b a are aceeai preceden cu b
a Q b a are preceden 1a de b
"ceste relaii se deosebesc 'n esen 1a de relaiile similare din algebr8
- au cu totul alt semantic dec<t precedena algebric
- este posibil ca 'ntre 2 terminale s nu e,iste nici o relaie de preceden
- este posibil ca 'ntre 2 terminale s e,iste 2 relaii de preceden
.tabilirea relaiei de preceden 'ntre terminale se poate 1ace pe 2 ci8
1$ Intuiti65 pornind de la semni1icaia algebric a operatorilor i in<nd cont de asociati6itatea lor8
JQ @5 @ P J
!rin introducerea acestor dou relaii se rezol6 i ambiguitatea gramaticii e,presiilor5 1r s mai 1ie
necesar trans1ormarea ei
2$ :n mod automat5 aplic<nd un algoritm adec6at= pentru aceast 6ariant trebuie eliminat 'n prealabil
ambiguitatea din gramatic ast1el 'nc<t ea s re1lecte corect asociati6itatea i precedena operatorilor$
D.=.2. 9&ilizarea rela2iil'r (e -rece(en2 a '-era&'ril'r
.copul introducerii relaiilor de preceden este acela de a determina captul 'n 1orma
propoziional dreapta curent$ "st1el5 simbolul N marc9eaz e,tremitatea st<ng a captului5 = interiorul
unui capt5 iar O marc9eaz e,tremitatea dreapt a captului$
!entru detalii5 considerm o 1orm propoziional dreapta a unei gramatici de operatori$ Deoarece
prile drepte ale produciilor nu conin dou neterminale adiacente5 rezult c 'n nici o 1orm
propoziional dreapt nu pot apare 2 neterminale adiacente$
La modul general5 o 1orm propoziional dreapta de acest 1el poate 1i notat ast1el8 M a1 1 an n
unde 1iecare i este 1ie , 1ie un singur neterminal i 1iecare ai este un singur terminal$
:ntr7o ast1el de 1orm propoziional dreapta5 se caut relaia de preceden 'ntre perec9i de
terminale 6ecine5 presupun<ndu7se c 'ntre ele e,ist o unic relaie de preceden$
%,tremitile irului de analizat5 se marc9eaz cu e i se introduc relaiile de preceden8 e Na
i aOe$
:n continuare5 se elimin neterminalele din ir iar 'n irul rmas -conin<nd numai terminale i e/
se introduc relaiile de preceden corecte5 N5=5O$
Captul se determin prin urmtorul procedeu8
1$ .e baleiaz irul cu relaia de preceden introdus din e,tremitatea s st<ng p<n la 'nt<lnirea
primului O= acesta 6a reprezenta marginea dreapt a captului$
2$ .e baleiaz irul 'napoi5 omi<nd e6entualele simboluri K p<n se 'nt<lnete primul marcaj P5 acesta 6a
1i marginea st<ng a captului$
+$ .e consider ca 1iind capt5 irul de simboluri gramaticale dintre cele 2 marcaje5 inclusi6 neterminalele
care apar ca incluse5 sau 'nconjoar terminalele dintre marcaje$ Considerarea neterminalelor
'nconjurtoare este necesar pentru a asigura c nu 6or apare dou neterminale adiacente 'n 1orma
propoziional urmtoare$
%,emplu8 se consider irul de intrare e id @ id J id e i matricea de relaii de preceden redus de mai jos8
id @ J e
id Q Q Q
@ P Q P Q
J P Q Q Q
e P P P
B;
:n tabel5 operatorul de adunare este asociati6 la st<nga5 'n timp ce operatorul de 'nmulire
asociati6 la dreapta
^irul iniial5 cu relaiile de preceden introduse este urmtorul8
e N d O @ N id O J N id O e e % @ % J % e
capt e N @ N J O e % 7Q % J %
e % @ id J id e e % @ % e
e N @ N id O J N id O e e N @ O e
e % @ % J id e e % e KQ s1arsit
e N @ N J N id O e
Observa$ie: deoarece neterminalele nu in1luieneaz analiza5 nu trebuie 1cut distincie 'ntre ele$
:n sti6a analizorului este su1icient s se in un singur marcaj reprezentati6 pentru orice 1el de
terminal pentru a marca doar locul din sti6 corespunzator acelui neterminal5 1olosit pentru a 'nregistra
atributele semantice corespunztoare neterminalului respecti6$
"parent5 din e,emplul de mai sus s7ar putea deduce c pentru determinarea captului ar 1i necesar
baleierea 'ntregii 1orme propoziionale sau5 'n orice caz5 a unei mari poriuni din ea$ "cest lucru nu este 'ns
necesar5 deoarece implementarea concret se 1ace tot pe baza mecanismului de analiz sintactic cu
deplasare i reducere5 iar relaiile de preceden sunt utile doar pentru a dirija aciunile analizorului
-deplasare sau reducere/$ "ciunile analizorului sunt cele cunoscute 8
1$ /eplasare8 c<t timp nu s7a gsit e,tremitatea dreapt a captului5 adic5 'ntre simbolul terminal cel mai
apropiat de 6<r1ul sti6ei i simbolul curent din intrare este 6alabil una din realaiile8 N sau =$
2$ )educere8 c<nd s7a gsit e,tremitatea dreapt a captului5 adic 'ntre terminalul cel mai propiat din
6<r1ul sti6ei i simbolul de intrare e,ist relaia O5 se baleiaz 'n sens in6ers sti6a p<n la 'nt<lnirea
primului marcaj P, dup care se 1ace reducere$
+$ Acceptare8 c<nd ambele simboluri care se compar - adic 6<r1ul sti6ei i simbolul curent din intrare/
sunt UeV
3$ Eroare8 dac se compar 2 simboluri 'ntre care nu e,ist relaie de preceden$
"ceste idei pri6ind mecanismul de analiz sintactic bazat pe precedena operatorilor sunt cuprinse 'n
urmtorul algoritm8
"lgoritmul primete la intrare irul > de analizat i matricea relaiilor de preceden$ Dac O este
corect5 se 6a obine la ieire un sc9elet al arborelui su sintactic5 'n caz contrar un mesaj de eroare5
datorit substituirii intermediare a neterminalului5 moti6 pentru care nodurile interioare 6or 1i
uni1orme$
sti6a intrare
e Oe
-1/ J se poziioneaz pointerul de intrare pe primul simbol din O
-2/ repeat 1ore6er
i1 Jat<t simbolul din 6<r1ul sti6ei c<t i simb$ curent de intrare sunt e t9en return
else
begin
J1ie UaV simbolul terminal cel mai apropiat de 6<r1ul sti6ei5
UbU simbolul curent din intrare
i1 -a N b/ or - aKb/ t9en
begin 7deplasare8
J introdu b 'n sti6
J a6anseaz cu o poziie pointerul de intrare
end
else i1 -a Ob/ t9en 7reducere8
repeat
J e,trage din sti6
until Jterminalul din 6<r1ul sti6ei este 'n relaie N cu terminalul cel mai
recent e,tras
BB
else Jeroare
end=
D.=.3. De()cerea in&)i&i; a rela2iei (e -rece(en2 (in as'cia&i;i&a&ea 6i -ri'ri&a&ea al/e:ric a
'-era&'ril'r
.ingura cerin care trebuie a6ut 'n 6edere este aceea ca relaia de preceden s conduc la
analiza corect a limbajului de1ninit de gramatic$
hin<nd cont de 1aptul c analiza sintactic bazat pe precedena operatorilor se aplic la gramatici
pentru e,presii5 sau gramatici similare cu acestea5 iar 'ntre operatorii din e,presii e,ist reguli de prioritate
i asociati6itate riguroase care rezol6 e6entualele ambiguiti5 aceste reguli pot reprezenta baza pentru
stabilirea relaiei de preceden$
!entru cazul operatorilor binari5 notai cu 5 15 2 relaiile de preceden pot 1i deduse ast1el8
1$ dac 1 este mai prioritar algebric dec<t 25 se introduc 'n tabel relaiile
1 O 2 i 2 N 1$
2$ dac 1 i 2 au prioritate algebric egal -inclusi6 c<nd reprezint acelai operator/ apar
urmtoarele 2 situaii8
a$ 1 i 2 sunt asociati6i la st<nga
1 O 2 i 2 O 1
b$ 1 i 2 sunt asociati6i la dreapta
1 N 2 i 2 N 1
+$ pentru orice operator e,ist urmtoarele relaii de preceden cu celelalte terminale8
id - i /
N id O /
id O / O
N - O e
- N e O e
!entru a asigura reducerea la % a lui id i a lui -%/5 'ntre terminalele care nu sunt operatori se
introduc urmtoarele relaii8
- K / e N - e id
- N - id O e / N e
- N id id O / / O /
Exemplu:
.e consider gramatica8
% 7Q % @ % N % ] % N % J % N % I % N % c % N - % / N id
Operatorii au urmtoarele proprieti8
c cel mai prioritar5 asociati6 la st<nga
J5I asociati6i la st<nga
@$7 cea mai mic prioritate5 asociati6i la st<nga
!e baza relaiilor de preceden de mai sus5 rezult urmtoarea matrice de precedene8
@ 7 J I c id - / e
BA
@ Q Q P P P P P Q Q
7 Q Q P P P P P Q Q
J Q Q Q Q P P P Q Q
I Q Q Q Q P P P Q Q
c Q Q Q Q P P P Q Q
id Q Q Q Q Q Q Q
- P P P P P P P K
/ Q Q Q Q Q Q Q
e P P P P P P P
-
BL