Sunteți pe pagina 1din 116

Limbaje formale și proiectarea

compilatoarelor
Prelegeri – 30 ore
Seminare – 14 ore
Laborator –1 6 ore
examen
Tema 1:Automate cu stări finite (AFD)

• Lecția 1
1. Introducere. Limbaje formale.
Implementarea limbajelor.
2. Analizor lexical. Expresii regulate.
3. Componentele unui AFD. Proiectarea
4. Componentele unui AFN. Proiectarea.
Subiectul 1

Definiția 1. Limbajul reprezintă un sistem de semne, care


permite modelarea unor stări de lucruri ale lumii
înconjurătoare (lumea reala, realitatea).
Limbajele includ trei aspecte fundamentale:
1. Aspectul sintactic: sistem de reguli, care asigura
combinarea semnelor – gramatica limbajului.
2. Aspectul semantic: sistem de reguli, care fixează
raportul intre semn si lumea reala influențând sistemul
de reguli sintactice.
3. Aspectul pragmatic: sistem de reguli,care definește
contextul (modul) de utilizare a limbajului.
Explicație:
• Folosind sistemele de reguli enunțate mai sus agentul
(factorul activ: ființa umana, robot etc.) pot enunța anumite
clauze, propoziții privind starea de lucruri din lumea reală.

• Conținutul acestor enunțuri pot să corespundă stărilor de


lucruri referite și atunci ele sunt calificate ca fiind “adevărate”
sau pot fi în contradicție cu stările referite și calificate drept
“false”.
*
Limbajele pot fi: 1)naturale, 2)formale.
Subiectul 1
Explicație:
1) Limbajele naturale sunt bazate pe sisteme lingvistice, create
de evoluția speciei umane, de exemplu. Aceste sisteme sunt
bazate pe limbi scrise și vorbite. Entitățile elementare
(materiale) ale acestor sisteme sunt considerate morfemele
și, respectiv, fonemele. Ele stau la baza conceptului de
cuvânt
- element discret care formează obiectul regulilor sintactice
ale limbajului.

2) Limbajele formale sunt construite artificial pe baza


unui vocabular proiectat și orientat pe un
anume domeniu abstractat din lumea reală - W numit
si Univers.
*
Definiția 2. Totalitatea cuvintelor unui limbaj formează
vocabularul limbajului.
• Materialul folosit la articularea cuvintelor sunt caracterele –
entități materiale concrete. Numărul caracterelor utilizate este
finit, iar mulțimea de caractere este numită, de obicei, alfabet.
Pentru articularea cuvintelor pe baza alfabetului ales pentru
definirea vocabularului limbajului sunt necesare trei operații:
1. Concatenarea - alipirea caracterelor la dreapta sub forma unui
sir de caractere de lungime finita(numărul de caractere). Șirul de
caractere, obținut prin aplicarea repetata a operației de
concatenare uneori este numit și cuvânt. Prin extensiune,
concatenarea poate genera mulțimi de șiruri de caractere
(cuvinte). Operația de concatenare poate fi redefinită pentru
doua sau mai multe șiruri de caractere, de exemplu p∙q, sau pq.
2. Reuniunea mulțimilor șirurilor de caractere, care are sensul
obișnuit din teoria mulțimilor, de exemplu, P U Q sau P + Q, P|Q,
unde P si Q sunt mulțimi de șiruri de caractere.

.
Subiectul 1
3. Iterația Clenee – R*=R0+R1+ …+ Rn+…,unde R2=R∙R, R0={ε} –
mulțimea cu șirul vid etc. R* obținuta astfel este mulțimea
tuturor șirurilor de caractere cu lungime arbitrara. Lungimea
unui șir este numărul de caractere utilizate la formarea șirului.
Șirul vid ε are lungimea 0.
Definiția 3. Mulțimile șirurilor de caractere astfel produse sunt
numite mulțimi regulate.
Mulțimile regulate constituie baza limbajelor formale –
vocabularul lor.
Exemplu 1. Fie dată mulțimea M={0,1,2,3,4,5,6,7,8,9}. Să se
obțină iterația Clenee de gradele 0, 1, 2, 3. Este oare mulțimea M
o mulțime regulată.
2. Fie dată mulțimea N={0, 1, 2, a, b, c}. Să se proiecteze formula
pentru obținerea mulțimii Idn – mulțimea identificatorilor
peste mulțimea N.
Definiția 4. Un limbaj L conține următoarele componente:
1. Vocabularul – o mulțime regulată construita pe baza unui alfabet A
finit.
2. Sintaxa – un set finit, bine definit, de reguli sintactice.
3. Semantica –un set finit, bine definit, de reguli de interpretare
semantică.
4. Universul –o mulțime de submulțimi de valori care formează baza
regulilor de interpretare semantica.
Pe scurt definiția de mai sus poate fi simbolic scrisa astfel:
L=(V, SN, SM, U), unde V este vocabularul, SN- regulile
sintactice, SM – regulile semantice si U este universul de interpretare.
Definiția 4 definește atât limbajele naturale, cât și limbajele formale.
În continuare ne vor interesa doar limbajele de programare – o
subclasa a limbajelor formale.
*
Limbajele de programare sunt limbaje formale elaborate pentru
a construi descrieri formale ale algoritmilor, urmând să fie
executați la calculator. Conform definiției 4 pentru a defini un
limbaj de programare trebuie de precizat: vocabularul, regulile
sintactice, regulile semantice și universul.

Limbajele de programare sunt raportate la limbajul


calculatorului, deoarece există un decalaj conceptual (de
abstractizare) dintre universul unui limbaj de programare si
limbajul calculatorului.

Teză: Pentru a rula pe calculator algoritmii, bazați pe


limbajul de programare, trebuie reduși la limbajul
calculatorului. Acest proces se numește translatare.
Simbolic putem scrie:
M
L   M
,unde
L este limbajul – sursa, M reprezintă limbajul – mașină
(calculatorul). M super scris denotă faptul că procesul
de
translatare este scris în limbajul – mașină. Desigur, procesul
este mult abstractizat. A elabora un translator (proces de
translatare) în limbajul – mașină este mult prea dificil. Există
scheme eficiente de translatare cu implicarea mai multor
limbaje de programare, pentru care există deja translatoare.
Procesarea informației în procesul de translatare poate avea
loc în mai multe moduri: 1) compilare, 2) interpretare și 3)
implementare hibridă.
1) Procesul de compilare (compilatorul) produce, pe baza
algoritmului descris in limbajul de programare L (programul sursa) un nou
program – obiect, echivalent funcțional cu programul sursă. Programul –
obiect poate fi obținut direct în limbajul-mașină și ulterior executat pe
calculator.
2) Procesul de interpretare nu produce programul – obiect ca rezultat al
procesării programului sursa, ci execută programul – sursă în mod direct
pe calculator (UNIX, APL, LISP, JavaScript).
3) Procesul hibrid combină compilarea cu interpretarea (Perl, Java).

*
În fig. 1 este reprezentat schematic procesul de compilare. Sunt
reprezentate patru blocuri de procesare:

1. Analizorul lexical, care procesează lexemele (cuvintele) – elemente


ale vocabularului limbajului de programare.
2. Analizorul sintactic, care procesează frazele sentențiale ale limbajului
conform regulilor sintactice – gramaticii
Figura 1. Schema generală de compilare

Interfaţa
utilizatorului
Program
sursa

Analizor
lexical

Unitati
lexicale

Analizor Tabela
sintactic simboluri

Arbore
derivare
Analizor
semantic

Cod
intermediar

Cod
Generator
masina
cod
Subiectul 1

3. Analizorul semantic, care procesează semantica limbajului


conform regulilor semantice.
4. Generatorul de cod, care generează programul in limbajul
mașină echivalent funcțional programului – sursă.
Fiecare dintre blocurile enumerate mai sus vor fi prezentate
in cadrul cursului in ordinea, in care sunt etalate mai sus.

Sfârșitul subiectului 1
Subiectul 2

• Analizorul lexical (scaner) procesează lexemele limbajului-sursa. Lexemele


limbajului formează vocabularul limbajului. Ele sunt divizate pe clase –
tokenuri – niște coduri interne ale compilatorului.
Exemple de tokenuri: identificator, constantă, operații-aritmetice,
relații,cuvinte-cheie etc.
Exemple de lexeme: max1, -23.1E-3, +, >=, THEN etc.
*
La nivel lexical analizorul interpretează lexemele ca pe niște șiruri de
caractere de lungime finită generate pe baza unui alfabet. Sunt trei
scopuri ale analizei:
1. Identificarea lexemului în șirurile analizate.
2. Determinarea clasei lexemul – tokenul.
3. Stocarea informației în Tabela de simboluri.
Soluționarea sarcinilor propuse mai sus se face pe baza Expresiilor lingvistice
regulate și a Teoriei automatelor cu stări finite (ASF)
• Expresiile regulate permit descrierea lexemelor care
formează limbajul de programare. Baza expresiilor regulate
sunt mulțimile regulate definite anterior.
Definiția 5. Fie dat un alfabet Σ, meta – simbolurile: Ø, ε, •, |,* ,
(, ) peste care se definește expresia regulată E astfel:
1. Expresia E este atom peste Σ dacă este un caracter din
Σ U {ε,Ø} sau este (E’) , unde E’ este expresie regulată.
2. Expresia E este factor, dacă este atom sau este E’*, unde
E’ este factor peste Σ.
3. Expresia E este termen, dacă este factor sau este E’ •
E’’, unde E’ este termen, iar E’’ este factor peste Σ.
4. Expresia E este expresie regulată este termen sau E’|E’’
, unde E’ – expresie regulată, iar E’’ este termen peste Σ.
Explicație: Ø, •, ε
Caracterul Ø={ }, iar ε – caracterul vid. Caracterul • poate fi omis.
Definiția 6. Limbajul L(E) definit de expresia regulată E este:
1. L(a)={a}, L(ε)={ε}, L(Ø)= Ø.
2. L((E))= L(E)
3. L(E*)= L(E)*
4. L(E’ • E’)= L(E’)L(E’’)
5. L(E’|E’’) = L(E’) U L(E’’)
Exemplu. Să se prezinte ostensiv limbajele: L((1234)*), L((1|2)*).
• Folosind nume pentru expresiile regulate se poate scrie:
<cifra>→ 0|1|2|3|4|5|6|7|8|9
<cifre>→ <cifra ><cifra>*
Subiectul 3
• Automate cu stări finite deterministe (AFD).
AFD reprezintă un model matematic al unui dispozitiv, care poate identifica
șirurile finite de caractere ca fiind corecte sau incorecte conforme unor reguli
precis formulate. Se mai poate afirma, că mulțimea de șiruri identificate de
AFD ca fiind corecte, adică acceptate, formează un limbaj. Mai mult, conform
Definiției 4, elementele acestui limbaj au un caracter regulat (mulțime
regulată,expresie regulată)
Definiția 7. AFD este definit de următoarele componente:
1. A – mulțimea finită a caracterelor formatoare de șiruri finite –alfabetul.
2. S – mulțimea finită de stări.
3. s0 – starea inițială a automatului.
4. F - o submulțime finită a S, care accepta șirul analizat.
5. δ – o funcție bidimensionala de tranziție dintr-o stare in alta:
δ:SxA→S
Subiectul 2
• Exemplul 1. Fie dat alfabetul {a, b}. Să se verifice dacă șirul propus la intrarea
AFD conține 2 intrări consecutive ale lui b.
• intrare AFD Accept-”1”
• abba
• Respins - “0”

Forma grafică a AFD reprezintă o tabelă:

a b

1 1 2 1

2 E 1 0

E E E 0
• AFD poate fi proiectat sub doua forme:
1. Acceptor - automatul analizează șirul propus pana la sfârșit, chiar dacă
la un moment devine, clar că analiza de mai departe nu are sens - șirul e
respins.
2. Procesor - automatul analizează șirul pană la prima eroare depistată.
În exemplul 1 AFD este acceptor.
Exemplul 2. Să se proiecteze același AFD ca in exemplul 1, dar fiind sub forma
de procesor.

a b ―|
1 1 2 A
2 R 1 R
În exemplul 2 se folosește semnul “―|”, care denota sfârșitul șirului propus.
Acest simbol nu aparține alfabetului A. Conform tabelei de tranziție este
tratat ca simbol. Contradicția se rezolva prin admiterea șirului vid. Șirul vid nu
are reprezentare grafica. Pentru a putea vorbi despre șirul vid se prezintă
definiția: ε= .
NOTA. A nu se confunda mulțimea vida { } cu ε. Putem,chiar, scrie
astfel: {ε} șirul vid
{} {ε}

a b a b
S S S 0 S T T 1
T T T 0
Subiectul 3

• Exemplul 3. Sa se construiască un AFD care ar identifica cuvintele SON si


SOLAR.
A S L N O R
1 {S1,S2} 0
S1 O1,O2 0
O1 N 0
N 1
D 0
O2 L 0
L A 0
A R 0
R 1
• Exemplul 3 este remarcabil prin faptul, ca valoarea tranziției AFD nu este
univoca. Poate exista o submulțime de stări ca rezultat al tranziției și, deci,
tranziția este non - deterministă. Automatul se numește cu stări finite
non - determinist (AFN).
Definiția 5. Un automat AFD pentru care : 1) există o submulțime de stări
inițiale si 2) funcția de tranziție se definește astfel: δ: S x A→2 S se numește
automat cu stări finite non - determinist (AFN).
Șirul de caractere este acceptat de către AFN, daca exista măcar un șir finit
de stări care accepta șirul propus automatului.
Automatul non – determinist nu are nimic cu probabilitatea. Este folosit ca
un mijloc de minimizare a numărului de stări utilizate la construirea
automatului. Reieșind din definiția funcției de tranziție: daca AFN are n stări,
atunci AFD are 2n stări.
Teorema 1. Pentru orice AFN exista un AFD care accepta aceleași șiruri de
caractere (fără demonstrare).
Subiectul 4

• Pentru a înțelege cum are loc procesul de construire a AFD pe baza


automatului AFN trebuie de analizat formula de tranziție:
δD(S,x)={s|s  δN(t,x) și t  S}
Exemplu 4. Construirea AFD pe baza AFN: AFN →AFD
A S L N O R
1 {s1,s2} 0
{s1,s2} {o1,o2 } 0
{o1,o2} L N 0
N 1
L A 0
A R 0
R 1

Sfârșitul Lecției 1
Tema 1

• Lecția 2. 1. Echivalența AFD. Verificarea


echivalenței stărilor.
2. Automate: reduse (reduced),
minimale.
3. Implementarea automatelor
cu stări finite
3.1. Reprezentarea șirurilor
de intrare AFD.
3.2. Reprezentarea stărilor
AFD.
3.3. Construirea unui
AFD pe baza unei
expresii regulate.
4. Meto
dele
de
identi
ficare
a
cuvint
elor.
Subiectul 1.
• Mulțimea S a stărilor finite ale unui AFD reprezintă o variantă de
structurare a universului U al limbajului formal L. Entitățile reale
(materiale) peste care se definește această structurare formează
mulțimea A* de șiruri finite de caractere. Aici, A este alfabetul
limbajului L, iar A* L

Aserțiunea 1. Prin redefinirea mulțimii S de stări fiecare AFD poate


fi modificat astfel încât să accepte aceleași șiruri finite. Acest AFD
modificat se va numi echivalent cu cel AFD inițial.

Aserțiunea 2. Pentru orice AFDi exista un alt AFDi’ , care acceptă


aceeași submulțime Li de șiruri finite de caractere dar cu un număr
de stări Ns 1’≤ Ns1 .
Pot fi construite mai multe AFD echivalente cu cel dat, dar ne va
interesa doar acelea care au un număr de stări ≤ decât AFD inițial.
Subiectul 1

Definiția 7. Starea s a AFD este echivalenta cu starea q, dacă


automatul, “demarând” analiza șirurilor de caractere propuse
în stările s și q, respectiv, acceptă aceeași mulțime de șiruri.

Aserțiunea 3. Doua automate AFD1 și AFD2 sunt echivalente


atunci și numai atunci când sunt echivalente stările lor
inițiale.

Definiția 8. Doua stări s1 si s2 se numesc non-echivalente,


dacă există un șir d, care este acceptat de o stare și
este respins de alta. În acest caz șirul d este numit șir
discriminant.
Exemplul 5. Fie date doua tabele de tranziție:

0 1 0 1
P P Q 0 A A C 0
Q R P 1 B B C 0
R P R 0 C B A 1

Să se demonstreze că stările inițiale P si A sunt non-echivalente.


Aserțiunea 4. Echivalența stărilor este reflexivă, simetrică și tranzitivă.
Algoritmul verificării echivalenței stărilor .
Aserțiunea 5. Stările s1 si s2 sunt echivalente atunci și numai atunci
când:
1. Ambele stări acceptă sau resping în același timp – similaritate.
2. Ambele stări tranzitează stări echivalente – consecutivitate.
• Algoritmul stărilor echivalente presupune verificarea
condițiilor 1) si 2) din Aserțiunea 5: două câte două
pentru fiecare dintre simbolurile de intrare.
Tabela de intrare: Tabela de echivalență:

0 1
0 1
0 0 3 0
1 2 5 0 0,1 0,2 3,5
0,2 0,2 3,7
2 2 7 0
3,5 6,6 5,7
3 6 7 0
3,7 6,6 3,7
4 1 6 1
5,7 6 3,5
5 6 5 0
6 6 3 1
7 6 3 0
• Stările echivalente sunt: (0,1);(0,2);(3,5); (3,7); (5,7) -0,1,2 si
3,5,7
• Notam: 0,1,2 – X si 3,5,7 – Y
• Ca rezultat obținem un AFD echivalent celui inițial, dar cu
mai puține stări:
0 1
X X Y 0
Y 6 Y 0
4 X 6 1
6 6 B 1

Sfârșitul subiectului 1
Subiectul 2

Definiția 9. AFD – automatul se numește redus, dacă:


1. Nu conține stări echivalente.
2. Nu conține stări inaccesibile din starea sa inițiala.
Exemplul 6. Sa se demonstreze ca automatul AFD de mai jos este
redus, verificând condițiile 1) si 2) din definiția 9.

a b
1 3 4 1
3 2 1 0
4 3 3 1
. 2 4 2 0
Algoritmul de minimizare a AFD.
Algoritmul presupune partiția stărilor AFD în blocuri care conțin numai
stările echivalente
Fie dat AFD cu tabela sa de tranziție:

x y
1 6 3 0
2 7 3 0
3 1 5 0
4 6 6 0
5 7 3 1
6 4 1 1
7 4 2 1
1. Partiția 0
P0=({1,2,3,4},{5,6,7})
2. Partiția 1
P1=({1,2},{3,4},{5,6,7})
3. Partiția 2.
P2=(…..
4. Partiția 3.
P3=({1,2},{3},{4},{5}, {6,7})
Am obținut ultima partiție, care nu poate fi supusa unei noi partajări.
Notăm: {1,2} –A, {3}-B, {4}-C, {5}- D, {6,7}-E.
AFD redus și minimal va fi:

x y
A E B 0
B A D 0
C C E 0
D E B 1
E C A 1
Exemplul 7. Să se obțină același AFD minimal prin Algoritmul stărilor
echivalente.
Sfârșitul subiectului 2
Subiectul 3.3
Definiția 10. Interpretarea I a unui cuvânt w exprimată de șirul (u1, k1),
(u2, k2),…, (um ,km), este interpretare drept-orientată, dacă are loc
relația:
|ui|= max{ |c| și v L(E1|…|Ek)∩ Pref(u1u2,…,um )}, unde Pref este

mulțimea tuturor prefixelor cuvântului w.
Definiția 11. Un analizor lexical este un program care recunoaște
Limbajul L și generează pentru fiecare cuvânt analizat w o singură
interpretare drept orientată.
Planul de elaborare a unui analizor lexical
1. Se construiește un AFN astfel ca L(E) = L(A).
2. Se minimizează automatul obținut în p.1.
3. Se elaborează un program care realizează automatul construit.
Sfârșit: Lecția 2
Subiectul 4
Tema 2: Gramatici. Gramaticile cu context
independent (CF). Automate cu stivă.
• Lecția 3
1. Gramatici formale și limbaje formale.
1.1 Gramatici cu context independent (GCF).
1.2 Derivarea pentru GCF. Arbori de derivare.
2. Mulțimi regulate și gramaticile liniare CF.
3. Automate cu stivă (ASD).
3.1 Componentele funcționale ale unui ASD.
3.2 Definiția unui ASD extins. Translatarea.
Subiectul 1.

• Gramaticile sunt o modalitate de a descrie mulțimi de șiruri de


caractere. Sunt anumite similitudini între gramatici și expresii
regulate, Însă maniera în care descriu șirurile de caractere se
deosebește. Acest fapt permite exploatarea complementarității
acestor formalisme. Definiție generală. Gramatica în sens uzual
desemnează un set bine - definit de reguli (numite și reguli
gramaticale) care permite scrierea corectă a unor fraze lingvistice.
Limbajul, în care sunt formulate aceste reguli, ține de metalimbaj:
limbajul (poate fi și formalizat) utilizat pentru descrierea altui limbaj
( limbajul obiect). Pentru a înlătura confuziile posibile, adică unde este
vorba de metalimbaj și când se insistă pe limbajul - obiect, va fi
prezentată o notație specială.
Subiectul 1
Exemple. Metalimbaj: Limbaj:
<propoziție> ------------
<subiect> ------------
<predicat> arborează
<substantiv> drapel
<substantiv> președinte
<obiect> -------------
<adjectiv> tricolor
Regulile in metalimbaj:
1. <propoziție> → <subiect> <predicat> <obiect>
2. <subiect> → <substantiv>
<adjectiv> 2’. <subiect> → <substantiv>
3. <obiect> → <substantiv> <adjectiv>
4. <predicat> → arborează
5. <substantiv> → președintele
6. <adjectiv> → tricolor
7. <substantiv> →drapel
Derivarea: <propoziție> => <subiect> <predicat> <obiect>
Subiectul 2
(Continuare)
• <subiect> <predicat> <obiect>  <substantiv> <predicat> <obiect> 
Președintele <predicat> <obiect> 
Președintele arborează <substantiv> <adjectiv> 
Președintele arborează drapelul <adjectiv> 
Președintele arborează drapelul tricolor
Arbore: <propoziție>

<subiect> <predicat> <obiect>

<substantiv> arborează <substantiv> <adjectiv>

Președintele drapelul tricolor


Arbore de derivare de stânga
Definiția 12. O gramatică G este definită de componentele sale:
1. Mulțimea finită N a non-terminalelor.
2. Mulțimea finită T a terminalelor.
3. Mulțimea finită R de reguli de forma <A> →α, unde A N, iar α-

șir din terminale și non-terminale sau este șirul vid – ε.
4. Axioma - un non-terminal cu care începe orice derivare
corectă. Gramaticile definite astfel sunt supranumite și
sentenționale cu context independent - CF (Context Free).
Definiția 13. Relația de derivare cu o gramatică G notată => G*
reprezintă un proces (lanț) cu caracter deductiv, care începe cu
axioma. Pașii procesului deductiv se obțin prin aplicarea de reguli din
mulțimea R: de fiecare data un singur non - terminal este înlocuit cu
partea dreapta a regulii ce are în stânga acest non-terminal. Procesul
ia sfârșit, când toate non-terminalele au fost eliminate.
Un singur pas al procesului deductiv este desemnat cu => G. Dacă
gramatica nu conține ε – reguli (partea lor dreaptă e vidă), atunci
procesul se notează - =>G+. Când nu există confuzie indexul G este
omis.
Definiția 14. Mulțimea L a tuturor șirurilor terminale obținute prin
derivare este supranumita limbaj formal generat de gramatica G cu
context independent (GCF). Se notează astfel:
L(G)={t|S=>G * t, t  T*, S –axioma gramaticii}
Exemplul 10. Fie data gramatica G cu axioma S:
1. <S>→a<A><B>c
2. <S>→ε
3. <A>→c<S><B>
4. <A>→<A>b
5. <B>→b<B>
6. <B>→a
Să se obțină:
1. Să se deducă șirul “acabac” folosind derivarea de stânga, apoi cea
de dreapta.
2. Sa se construiască arborele de derivare de stânga, apoi cel de
dreapta.
3. Sa se analizeze variantele de obținere a unor șiruri terminale prin
derivare.
Nota. La derivarea de stânga (dreapta) regula se aplică permanent
la non- terminalul poziționat extrem-stânga (dreapta) a formei de
derivare – o instanțiere a procesului de derivare.
Concluzie
1. Fiecare arbore de derivare are o singura derivare de stânga și o
singura derivare de dreapta.
2. Fiecare șir terminal obținut prin derivare poate avea unul sau mai
mulți arbori de derivare.
Definiția 16. Gramatica care asigura unicitatea arborelui de derivare
pentru orice șir terminal e numită gramatica univocă.

Sfârșitul subiectului 2
Descrierea mulțimilor regulate utilizând gramaticile
• Metodele de descriere a mulțimilor regulate de șiruri finite de
caractere (AFD, AFN etc.) pot fi interpretate în termenii unor
gramatici CF. Interpretarea vizează forma regulilor gramaticilor CF,
anume:
Aserțiunea 7. Orice mulțime regulată de șiruri finite de caractere
poate fi descrisa de o gramatica CF G cu regulile de forma <A> → t<B>
sau <A> →ε și invers, unde simbolul t este terminal. Acest tip de
gramatică se numește gramatică automată (GA).

Demonstrație. Fie data o mulțime regulată M descrisă de un AFD. Vom


construi gramatica CF corespunzătoare astfel:
1. Mulțimea terminala T a gramaticii G va fi mulțimea de intrare a
AFD.
Subiectul 2. (continuare)

2. Mulțimea non-terminalelor gramaticii G va fi mulțimea de stări


a AFD.
3. Axioma gramaticii G va fi starea inițială a AFD.
4. Tranziția din starea A in B la citirea t va avea în G regula
<A> → t<B>.
5. Daca S este starea de acceptare, atunci in G va fi inclusă regula
<S> →ε

Metoda de construire a gramaticii G permite definiția unei


corespondențe one-to-one între tranzițiile ASD și derivările
corespunzătoare ale G.
Subiectul 3

Exemplul 11. Fie dat un AFD cu tabela de tranziție:

i d ―|
W S S 0
S S S 1

Sa se construiască gramatica G corespunzătoare, conform p.1-5 de mai


sus:
1. T={i,d} –terminalele.
2. N={W, S} – non-terminalele, axioma –W.
3. Regulile: W→i<S>, W→ d<S>, <S>→d<S>, <S>→i<S>, <S>→ε.

Să se obțină derivările și arborii de derivare.


Gramaticile liniare de dreapta (GLD).
Aceste gramatici descriu mulțimile regulate ca și gramaticile automate. Mai
mult, GLD pot fi reduse printr-o procedura algoritmică efectivă la GA.
Definiția 16. Gramatica CF o vom numi gramatică liniară de dreapta
(GLD),daca regulile gramaticii au forma:
<A>→ γ<B> sau <A>→ε, unde γ este un șir terminal.
Procedura de reducere a GLD la GA. Procedura are pașii următorii:
1. Regulile de forma <A>→ γ vor fi înlocuite cu:
<A>→ γ<Epsilon>
<Epsilon> → ε
2. Regulile de forma <A>→t1…tn<B> vor fi înlocuite cu:
<A>→t1<t2…tnB>

<ti…tnB>→ti<ti+1…tnB>

<tnB>→tn<B>
3. Regulile <A>→<B> și <B>→t vor fi înlocuite cu:
<A>→t
4. Regulile de forma <A>→<A> vor fi eliminate.
Exemplul 12. Fie data gramatica LD:
<A> →ab<B>
<B>→bc<B>
<B>→b<A>
<B>→c<A>
<A>→ε
Sa se obțină GA echivalentă și să se construiască AFD respectiv.
Exemplul 13. Se dă un fragment de program:
… Real var, …, var …..
1. Să se elaboreze gramatica CF care ar descrie lista de variabile.
2. Sa se construiască AFD care ar accepta fragmentul prezentat.
Proceduri de eliminare a non-terminalelor nefuncționale intr-o GFC.
Non-terminalele nefuncționale sunt clasificate astfel:
1. Non-terminale sterile: <A>→b<B>; <B>→<A>d –{A,B}
2. Non-terminale inaccesibile: <A>→b<B>;<B>→c;<C>→d -{C}
3. Non-terminale inutile: Sterile U Inaccesibile – {A,B} U {C}={A,B,C}
4. Non-terminale productive:<A>→b<B>;<B>→c -{A,B}.
• Procedura de eliminare a non-terminalelor sterile se bazează
pe aserțiunea:
Aserțiunea 9. Daca simbolurile non-terminale din dreapta regulii sunt
productive, atunci și simbolul din stânga regulii este productiv.
Procedura 1:
1. Sa se formeze lista L1 a tuturor non-terminalelor din stânga care nu au
non-terminale în dreapta regulilor.
2. Daca exista un non-terminal din stânga regulilor, pentru care partea
dreapta conține numai non-terminale din lista L1, atunci non-terminalul
este inclus și el în lista.
3. Daca lista L1 rămâne intactă la executarea p.2, atunci procesul ia sfârșit.
• Procedura de eliminare a non-terminalelor inaccesibile este bazata pe
aserțiunea:
Aserțiunea 9. Dacă non-terminalul din stânga regulii este accesibil, atunci
sunt accesibile toate non-terminalele din dreapta regulii gramaticii.
Procedura 2:
1. În lista L2, inițial vidă, este inclusă axioma gramaticii.
2. Dacă există o regulă cu partea stânga în listă, atunci toate non-
terminalele din dreapta acestei reguli sunt adăugate la lista L 2.
3. Daca la repetarea p.2 la lista L2 nu mai sunt adăugate noi simboluri,
atunci lista L2 conține toate non-terminalele accesibile.
Procedura 3.
1. Pentru a elimina non - terminalele non-productive eliminăm regulile cu
non-terminalele care nu se conțin in lista L1.
2. Pentru a eliminăm non-terminalele inaccesibile eliminăm regulile cu non-
terminalele care nu se conțin în lista L2
Exemplul 18. Se dă
gramatica: <A> → a<A>
< c
A <B>→b<C>
> <C>→a<B>
→ <D>→abc
Să se elimine regulile ce conțin non-terminale sterile și inaccesibile.
Exemplul 19. Se dă gramatica:
<E>→<E>+<T>
<E>→<T>
<T>→<T>*<F>
<T>→<F>
<F>→<P>
<P>→(<E>)
<P>→I
1. Sa se analizeze expresia aritmetica construind arborele de derivare:
a+b*c + (e+d)*f
2. Sa se verifice prezența non-terminalelor sterile și inaccesibile.

Sfârșitul subiectului 3
Subiectul 4

Automatul cu stivă determinist


• Limbajele formale regulate (LFR) pot fi pe deplin descrise de AFD (AFN):
mulțimile șirurilor de caractere finite (LFR) sunt acceptate sau respinse de un
AFD. AFD folosește cu acest scop o memorie finită și fixată (nu poate fi
extinsă sau restrânsă în procesul de recunoaștere a limbajului). Memoria
unui AFD este formată de stările definite. Un limbaj de programare are o
structură mai complexa decât un LFR. De exemplu, folosirea perechilor de
paranteze nu poate fi procesata de un AFD: numărul de stări utilizate nu este
predictibil, ci depinde de numărul de paranteze deschise și închise, deci, este
variabil. Pentru gestionarea unor astfel de fenomene se propune un nou tip
de automat – automatul cu stivă determinist (ASD).
Definiția 18. Un ASD constă din:
1. Mulțimea finită de caractere - alfabetul A, care conține marcatorul: ―|
2. Mulțimea finită de caractere pentru memoria extensibila – stiva M cu
semnul Δ – marchează începutul stivei.
• Comentariu la definiția 18: Schema grafică a unui ASD
Intrarea – șirul de procesat (A)
1 0 0 0 1 1 1 0 0 ―|

Control D
C
A
s B
A
Starea
Δ

Ieșirea Output Stiva


Subiectul 4 (continuarea definiției 18)

3. Mulțimea finită de stări S cu starea inițiala - s0.


4. Funcția de tranziție –δ:A x M x S →(a,m,s) – Unitatea
de Control (UC)
• În dependență de informația procesată UC asigură tranziția
pe baza:
1. Stării unității de control.
2. Simbolului din vârful stivei.
3. Simbolul de intrare analizat.
Tranziția rezidă în efectuarea unor operații asupra stărilor, stivei
și a simbolului de intrare analizat.
Subiectul 1

Definiția 18. Tranziția este definită de următoarele clase de operații:


A. Operația cu starea:
State (s) – tranziția în starea s (starea s devine curentă).
B. Operațiile cu stiva:
Push down (u) - împinge în stivă simbolul u.
Pop up - extrage simbolul superior din stivă (conținutul stivei se
modifică).
SKIP: stiva rămâne intactă (neschimbată). Operația nu are imagine.
C. Operații cu șirul de intrare (analizat):
Shift - se analizează următorul simbol de intrare.
Hold - simbolul analizat rămâne simbol curent.

(continuare)
Exemplul 20. Sunt date:
1) A={(,),―|} –simbolurile de intrare, unde ( și ) sunt parantezele
rotunde, iar ―| - sfârșitul șirului analizat.
2) M={X, Δ} – simbolurile stivei, Δ este simbolul inferior, sfârșitul
stivei, care nu poate fi eliminat din stivă cu operația Pop up.
3) S={s} –mulțimea stărilor (o singura stare; ea și este inițială).
4) Inițial, stiva conține doar simbolul Δ.
Se cere: Sa se construiască un ASD, care verifică corectitudinea
intrărilor de paranteze în șirul propus spre analiză (fiecare
paranteza “(“ trebuie să aibă corespondenta sa – paranteza “)”).
test: ( ( ()()) () () ) – sa se testeze pentru șirul propus.
(continuare)
Subiectul 4
Rezolvare: Tabela de tranziție

( ) ―|
X Push(X) Pop R
Shift Shift
Δ Push(X) R A
Shift
ASD construit are o singură stare, care nu este arătată.
Pentru exemplificare pot fi etalate configurațiile:
stiva starea intrarea
1: Δ s ( ()) ―|
2: ΔX s ()) ―|
3: ΔXX s )) ―|
4:ΔX s ) ―|
5:Δ s ―|
Exemplul 21. Sa se construiască un ASD, care ar accepta șiruri din mulțimea:
{1n0n |n>0}.
Sunt date:
1) A={0, 1, ―|}
2) M={Δ, U, V}
3) S= {s1,s2}, inițiala - s1
Rezolvare:
Starea s1 Starea s2
0 1 ―| 0 1 ―|
U State(s2) State(s1) R U State(s2) R R
Pop Push(U) Pop
Shift Shift Shift
Δ R State(s1) R Δ R R A
Push(U)
Shift
Extensiunea operațiilor pentru ASD
1) Prima extensiunea ține de lucrul cu stiva – operația substituției multiple:
Subst(α) :extrage simbolul superior din stivă și împinge șirul α, format din
elementele M în stivă.
Folosind operația Subst putem rescrie soluția din exemplul 21:

Tabela cu operația extinsă


0 1 ―|
V Pop Subst(UV) R
Hold Shift
U Pop R R
Shift
Δ R Push(UV) A
Shift
Nota. Soluția nu utilizează a doua stare s2
Subiectul 1
2) Automatul ASD poate funcționa și în regim de translatare. Cu acest scop
se atașează la Unitatea de Control un suport de ieșire (output) pe care se
va scrie traducerea (interpretarea) șirului analizat (vezi schema). Operația de
translatare este:
Output(α): scrie pe suportul de ieșire simbolurile șirului α.
Exemplul 22. Sa se translateze șirurile mulțimii A+, unde A={0, 1}, în șirurile
mulțimii {1m0n} și m, n sunt numărul de 1 respectiv 0 din șirul translatat.
Tabela de translatare

0 1 ―|
Z Push(Z) Output(1) Pop
Shift Shift Output(0)
Hold
Δ Push(Z) Output(1) A
Shift Shift
Tema 2
• Lecția 1. Procesarea sintactic
4. orientată a limbajelor CF.
1.1 Translatarea LCF.
Formularea problemei.
2. Gramatici de
translatare.
Translatarea
sintactic
orientata.
3. Derivarea unui limbaj
descris de o gramatică
CF
cu
un
ASD
.
4. Translat
area
sintacti
c
orienta
tă cu
un ASD.
Subiectul 1

Formularea problemei. Fie data expresia aritmetica: a+b*c și se cere a


fi calculată valoarea ei numerică. Pentru aceasta trebuie să știm:
1) valorile lui a, b, c pe care le vom nota {a}, {b}, {c}, respectiv.
2) cum sunt executate operațiile + si *. “Procedurile “ le vom nota {+} și
{*}, respectiv.
3) luând în considerare p.1 si p.2 precum și prioritățile lui + și * putem
transcrie expresia astfel: a{a}+b{b}*c{c}{*}{+}.
4)simbolurile incluse în expresie { și } sunt acțiunile din mulțimea A.
5) scriem intr-un sir numai acțiunile obținem: {a}{b}{c}{*}{+}.
Această expresie ne sugerează ce trebuie sa facem pentru a calcula
expresia:
a+b*c.
6) in p.5 omitem { și } și atunci obținem: abc*+ ―scrierea postfixă
poloneză (SPP) .
Subiectul 2
Definiția 20. Gramatica CF de translatare (GCFT) include componentele:
1. Mulțimea de simboluri terminale T’.
2. Mulțimea de acțiuni T’’.
3. Mulțimea de simboluri non-terminale N.
4. Axioma S.
5. Mulțimea de reguli de forma <A>→α, unde α este un sir format din
terminale, non-terminale și acțiuni.
Exemplul 21. Fie dată gramatica de translatare:
<E>→<E>+<T>{+}
<E>→<T>
<T>→<T>*<P>{*}
<T>→<P>
<P>→(<E>)
<P>→a{a}
<P>→b{b}
<P>→c{c}
Să se construiască derivarea pentru expresia: a +(a+b)*c.
Rezolvare:
<E>  <E>+<T> {+}  <T>+<T>{+}  <P>+<T>{+}  a{a}+<T>{+} 
a{a}+<T>*<P>{*}{+}  a{a}+<P>*<P>{*}{+} 
a{a}+(<E>)*<P>{*}{+}  a{a}+(<E>+<T>{+})*<P>{*}{+} 
a{a}+(<T>+<T>{+})* <P>{*}  a{a}+(<P>+<T>{+})*<P>{*}{+} 
*

{+}
a{a}+(a{a}+b{b}{+})*<P>{*}{+} 
a{a}+(a{a}+b{b}{+})*c{c}{*}{+}
Facem următoarele:
1. Pentru a obține translatarea extragem din rezultatul derivării acțiunile
respectând ordinea apariției: {a}{a}{b}{+}{c}{*}{+} ― rezultatul traducerii.
2. Omitem { și } și obținem : aab+c*+ ― scrierea postfixă ― asa gândim!
3. Rezultatul obținut poate fi interpretat ca semantica expresiei a+(a+b)*c
Sintaxa deri var e  Semantica
Subiectul 3

Procesul de derivare bazat pe o gramatica CF ne sugerează posibilitatea de


a “automatiza” acest proces folosind ASD. Raționamentul principal în acest
sens este:
Aserțiunea 10. Formele sentențiale conțin toată informația necesara luării
deciziei: care dintre reguli trebuie aplicată pentru continuarea derivării.
Decizia este luata pe baza: 1) non-terminalului curent (de stânga sau de
dreapta) al formei, 2) simbolului de intrare analizat, 3) stării procesului însuși.
În acest scop (“automatizarea”) poate fi folosit un ASD.
Definiția 22. Automatul SD destinat derivării șirurilor finite de caractere
conform unei gramatici GCF include:
1. Mulțimea de intrare A, care coincide cu mulțimea T de terminale a G.
2. Mulțimea simbolurilor M stiva, care conține non-terminale, terminale ale
G.
3. Simbolul special Δ al stivei, care marchează prima poziție a stivei.
4. Mulțimea finita de stări S cu starea inițială - s0.
5. Funcția de tranziție –δ:A x M x S →(a,m,s) – Unitatea de Control (UC)
Exemplul 26. Fie data gramatica CF:
1. <S> → d<S><A>
2. <S>→b<A>c
3. <A>→d<A>
4. <A>→c
Fie derivarea <S>  d<S><A>  db<A>c<A  dbccdc
>
1. Δ<S> dbccdc
2. Δ<A><S> bccdc
3. Δ<A>c<A> ccdc
4. Δ<A>c cdc
5. Δ<A> dc
6. Δ<A> c
7. Δ ―|
Tabela de tranziție a ASD

d b c ―|
<S> Subst(<A><S>) Subst(c<A>) R R
Shift Shift
<A> Subst(<A>) R Pop R
Shift Shift
c R R Pop R
Shift
Δ R R R A

Sfârșitul subiectului 3
Subiectul 4
Construirea unui ASD pe baza unei gramatici CF poate fi prezentată sub forma
unei proceduri efective.
Procedura 1. (GCF ASD).
1. Mulțimea terminală T (GCF) Mulțimea Input ASD+”―|”
2. Mulțimea N (GCF) + (T\ terminale –prima – poziție) Mulțimea Stiva +”Δ”
3. Reguli GCF forma: <A>→aα Subst(α inv
), Shift

<A>→a  Pop, Shift
 Pop, Shift, dacă stiva:a –input:a
4.  stiva:Δ – input:―|, atunci - A
5. Celulele tabelei ASD care nu au fost completate  , atunci – R
Exemplul 27. 1) Fie data gramatica:
<A>→ab<B>
<A>→b<B>b<A>
<B> →a
<B>→b<B>
2) Să se construiască tabela ASD aplicând regulile 1-5 Procedura 1.
Tabela

a b ―|
<A> #1 #2 R
<B> #3 #4 R
b R Pop, R
Shift
Δ R R A

#1 Subst (<B>b), Shift


#2 Subst(<A>b<B>), Shift
#3 Pop, Shift
#4 Subst(<B>), Shift
3) Să se construiască configurațiile ASD pentru șirul derivat.
• Procedura 1 ASD) de mai sus poate fi extinsă și pentru gramaticile
(GCF
CF de translatare (GCFt).
Procedura 2 (GCFt  ASDt).
1. Mulțimea terminală T (GCFt) Mulțimea Input ASDt+”―|”
2. Mulțimea N (GCF) + (T\ terminale 1- poziție)+ Mulțimea Stiva +”Δ”
Mulțimea (A\ acțiuni 1-poziție)
3. Reguli GCF forma: <A>→{ξ}a{ϕ}α Out(ξϕ), Subst(αinv), Shift
<A>→{ξ}a{ϕ} Out(ξϕ), Pop, Shift
4. Pop, Shift, daca stiva:a –input:a
5. stiva:Δ – input:―|, atunci - A
6. stiva:{x}, atunci- Out(x), Pop,Hold
7. Celulele tabelei ASD care nu au fost completate ,atunci – R
• Exemplul 28. 1) Fie data gramatica de translare:
<A> →{w}a{v}<S>{x}<B>
<S> → {z}
<B>→<T>c
<T>→b{y}
2) Sa se construiască tabela ASDt folosind regulile 1-7 Procedura 2.
Tabela si referințele
a b c ―|
<A> #1 R R R
<S> R #2 R R Referintele
<B> R #3 R R #1 Out(w,v),Subst(<B>{x}<S>),Shift
<T> R #4 R R #2 Out(z), Pop, Hold
c R R #5 R #3 Subst(c<T>), Hold
Δ R R R A #4 Out(y), Pop, Shift
{x} Out(X), Pop, Hold #5 Pop, Shift
3) Să se obțină configurațiile ASDt pentru un sir derivat de stânga.
4) Care este traducerea șirului derivat.
Sfârșitul subiectului 4

Sfârșitul Temei 2
Tema 3: Metode descendente de procesare a
LCF. Gramaticile LL(1).
• Lecția 5.

1. Metode descendente de procesare a LCF.


1.1 S-gramatici. Proiectarea ASD pentru s-
gramatici.
1.2.Q-gramatici. Proiectarea ASD pentru q-
gramatici.
2. Gramaticile LL(1). Proiectarea ASD pentru
LL(1).
3. Metode descendente pentru gramatici.
Subiectul 1

Metode descendente de procesare.


• Metodele descendente (top-down) de procesare construiesc
analizorul sintactic pe baza gramaticii LF, generând arborii de
derivare a șirurilor analizate de la rădăcina (axioma gramaticii) spre
frunze (leaves)- șirurile terminale.
• Toate gramaticile de până acum au fost procesate prin metode
descendente.
• Ideea metodelor de procesare prezentate constă (la etapa finală)
în construirea unui ASD pe baza gramaticii procesate. Anume, ASD
construit și va efectua analiza sintactica a fragmentului de LCF.
• Pentru realizarea acestei idei sunt necesare restricții la forma
regulilor gramaticilor utilizate.
• Analiza sintactica descendentă se va face numai cu automate cu
stivă deterministe.
S-gramaticile.
Definiția 23. Gramatica CF este o s-gramatica dacă:
1. Partea dreapta a fiecărei reguli începe cu un terminal.
2. Părțile drepte ale regulilor cu același non-terminal în stânga încep cu
terminale diferite.
Exemplul 29. Gramatica prezentată:
<A>→a<P>f<P>
<A>→b<S>
<P>→c<S>
<P>→e
<S>→m
este o s-gramatică.
Practic, toate gramaticile folosite pentru exemplificare până acum au fost
s - gramatici, de aceea rămân valabile tehnicile prezentate anterior.
Metodele descendente asigură proiectarea efectivă a ASD
Q-gramatici.
Definiția 24. S-gramaticile care conțin și epsilon- reguli se numesc q- gramatici.
Exemplul 30.1) Fie data q-gramatica:
<A>→a<P><A>
<P>→c<P><A>
<P>→ε
<A>→f
2) Să se construiască un ASD care acceptă șirurile de terminale generate de q-
gramatica dată.
Rezolvare.
a c f ―| Referinte
<A> #1 R #2 R #1 Subst(<A><P>),Shift
<P> #4 #3 #4 R #2 Pop, Shift
Δ R R R A #3 Subst(<A><P>), Shift
#4 Pop, Hold
Subiect 2
• Folosind Exemplul 31 vom genera configurațiile ASD pentru șirul aacff:
• Δ<A> aacff # <A>→a<P><A>
• Δ<A><P> acff # <P>→ε
• Δ<A> acff #<A>→a<P><A>
• Δ<A><P> cff # <P>→c<P><A>
• Δ<A><A><P> ff #<P>→ε
• Δ<A><A> ff #<A>→f
• Δ<A> f #<A>→f
• Δ ―|

Comentariu.
Subiectul 2
Analiza soluției pentru Exemplul 31.
• Reieșind din analiza soluție aplicația regulii <P>→ε este condiționată de
terminalele imediat următoare ocurenței non-terminalului <P>, deci, a și f.
Vom introduce mulțimea terminalelor imediat următoare pentru fiecare
epsilon - regulă a gramaticii:
FOLLOW(<P>→ε)={a,f}
Pentru a raționaliza algoritmul proiectării ASD vom mai introduce mulțimea:
SELECT(<P>→c<P><A>)={c}
Daca extindem pentru toată gramatica analizată vom avea:
SELECT(<A>→a<P><A>)={a}
SELECT(<P>→c<P><A>)={c}
SELECT(<P>→ε)=FOLLOW(<P>→ε)={a,f}
SELECT(<A>→f)={f}
Pe baza acestor mulțimi putem construi ASD corespunzător pentru analiza
descendentă.
Condiția existenței unui ASD pentru gramaticile de tip S si Q.
1. Părțile de dreapta a gramaticilor reprezintă ε sau încep cu un terminal.
2. Mulțimile SELECT pentru regulile cu aceeași parte stângă nu
se intersectează.
Exemplul 32. 1) Fie dată gramatica:
<A>→a<B>
<A>→b
<B>→c<A>a
<B>→ε
2) Să se determine tipul gramaticii.
3) Să se construiască pentru gramatică mulțimile FOLLOW și SELECT
4) Să se construiască ASD pentru derivarea descendentă.
Subiectul 3
• Fie data gramatica:
1.<A> →a<S><B>
2. <S> →ε
3. <B>→<T>c
4. <T>→b
Gramatica nu este nici de tipul S, nici de tipul Q. Pentru a demonstra acest
lucru vom construi mulțimile FOLLOW si SELECT:
• SELECT(1)={a}
• SELECT(2)=FOLLOW(2)=……..{b} ?
• SELECT(3)= …..{b} ?
• SELECT(4)={b}
Soluția poate fi intuită pentru 2 și 3: <A> a<S><B> a<S><T>c 
 
a<S>bc, deci, FOLLOW(2)={b}
În mod analogic se calculează SELECT(3).
Exemplul 33. Să se construiască pentru gramatica de mai sus ASD de derivare.
• Prin urmare se cere introducerea unei mulțimi care ar gestiona primele
terminale de la începutul părții drepte a regulii:
• FIRST(<T>c)={b}
• Restul mulțimilor se rescriu astfel:
• SELECT(1)={a}
• SELECT(2)={b}
• SELECT(3)=FIRST(<T>c)={b}
• SELECT(4)={b}
Definiția 25. Șirul secvențial α (terminale și non-terminale) al unei gramatici
cu epsilon-reguli se numește nul, daca există derivarea: … α *ε
Exemplul 34. Fie dată gramatica:
1.<A>→<B>
2. <B>→c<S>d
3.<B>→ε
4.<S>→d
Derivarea <A>  <B>  ε este una nulă
1) Să se construiască mulțimile pentru regulile gramaticii:
SELECT(1)=FIRST(<B>) ={---|}
SELECT(2)= FIRST(c<S>d)={c}
SELECT(3)= FIRST(ε) U FOLLOW(<B>)={ } U {―|}= {―|}
SELECT(4)=FIRST(d)= {d}
2) Să se construiască ASD care asigura derivarea pentru gramatica de mai sus.
Definiția 26. Gramatica CF se numește gramatică de tipul LL(1) a.n.a.c
mulțimile SELECT pentru regulile gramaticii nu se intersectează.
Exemplul 35. Fie data gramatica:
1.<E>→<T><Elist>
2. <Elist>→+<T><Elist>
3.<Elist>→ε
4. <T>→<P><Tlist>
5. <Tlist>→*<P><Tlist>
6. <Tlist>→ε
7. <P>→(<E>)
8. <P>→I
2) Să se derive expresia: a+(a +b)*c
3) Să se determine tipul gramaticii.
4) Să se construiască mulțimile SELECT, FOLLOW și FIRST pentru regulile gr.
5) Să se construiască un ASD pentru această gramatică.
6) Sa se transforme gramatica într-o gramatica de translatare.
7) Sa se construiască un ASDt care translatează expresia gramaticii.
SELECT(1)= FIRST(<T><Elist>)={id, (}
SELECT(2)= FIRST(+<T><Elist>)= {+} <E>→<T><Elist>
<Elist>→+<T><Elist>
SELECT(3) = FOLLOW(<Elist>) = {) , ―|} <Elist>→ε
SELECT(4) = FIRST(<P><Tlist>) = {id,(} <T>→<P><Tlist>
<Tlist>→*<P><Tlist>
SELECT(5) = FIRST(*<P><Tlist>)=….. <Tlist>→ε 7. <P>→(<E>) 8. <P>→I
SELECT(6) = FOLLOW(<Tlist>)= {+, ), ―|}
SELECT(7) = FIRST((<E>))= {(}
SELECT(8) = FIRST(I)={id}
Metoda coboririi recursive.
Ideea metodei: 1) Gramatica trebuie sa fie de tipul LL(1).
2) Se modelează funcționarea ASD cu ajutorul unui limbaj de nivel înalt, care
permite executarea recursivă a procedurilor.
3) Fiecărui non-terminal din gramatică i se pune in corespondență o
procedură.
4) Apelarea procedurilor se face pe bază recursivă.
Exemplul 37. Fie data gramatica:
1. <S>→ a<A><S>
2. <S>→b
3. <A>→c<A><S>b
4. <A>→ε
• Schema interacțiunii procedurilor

Main program Procedure ProcS Procedure ProcA


Set Input=simbol(1) Caz
a din: Caz
R1 a din:
R4
ProcS; b R2 b R4
Dacă Input-| atunci c Respins c R3
Respins; -| Respins
Acceptat; -| Respins

1. <S>→ a<A><S> R1: Shift;


R3: Shift;
2. <S>→b ProcA;
ProcA;
3. <A>→c<A><S>b ProcS; ProcS;
4. <A>→ε Return;
Dacă Input b atunci
R2: Shift;
Respins;
Return;
Shift;
Return;
R4:Return;
Subiect 3
1. Să se construiască un ASD conform metodei tradiționale.
2. Să se verifice corectitudinea ASD construit.
3. Să se proiecteze un program care modelează ASD.
4. Să se verifice corectitudinea programului elaborat.
Tema 4: Metodele ascendente de procesare a LCF
• Lecția 6

1.Metode ascendente de procesare .Concepte.


1.1 Conceptul de “baza”(handle).
1.2 Conceptul de “deplasare” (shift).
1.3 Conceptul de “identificare”.
1.4 Conceptul de “reducere”
2.Metode de tipul “deplasare-identificare”
3. Metode de tipul “deplasare-reducere.
4. Formularea problemei. Mașina virtuala de cod intermediar.
5. Generarea de cod sub forma de tetrade și de triade
6. Generarea de cod pentru un arbore sintactic
Subiectul 1
• Ideea generală:1) Se dă o gramatică G CF pentru care există derivarea de
dreapta definită univoc.
2) Se dă un șir terminal (o mulțime de șiruri finite). Simbolurile șirurului sunt
conforme alfabetului terminal T al gramaticii G.
3) Să se reconstituie derivarea de dreapta a șirului analizat (daca există) și să
se genereze răspuns negativ dacă o astfel de derivare nu există.
4) Reconstituirea se face de “jos in sus” (bottom-up), adică se începe cu
Analiza șirului terminal, apoi nivel cu nivel se reproduce arborele de
derivare. Astfel de metode de analiză se numesc metode ascendente.
Exemplul 37. Fie dată gramatica
Abordarea I Abordarea II
1. <S>→ <A>b<S> 1. <S>→ (<A>b<S>)
2 . <S>→b 2. <S>→(b)
3. <A>→ <S>a<A> 3. <A>→(<S>a<A>)
4. < A>→a 4.< A>→(a)
1) Să se obțină un șir terminal al gramaticii prin derivarea de dreapta:
<S>  (<A>b<S>) (<A>b(b))   ((<S>a(a))b(b)) 
((<S>a<A>)b(b))
(((b)a(a))b(b))
2) Reconstituirea se face de la stânga la dreapta în ordine inversă:
(((b)a(a))b(b)) 2  4 ((<S>a<A>)b( 3
((<S>a(a))b(b)) b))
(<A>b(b)) 2 (<A>b<S>) <S>
1
Concluzie: Am parcurs “bottom – up” toate nivelurile arborelui și am ajuns la
rădăcină - <S>. Reconstituirea a reușit.
Definiția 30. Fragmentele șirurilor intermediare din derivarea de reconstituire
evidențiate prin subliniere le vom numi baze (handle).
Remarcă. Bazele reprezintă partea dreapta a regulilor gramaticii.
Definiția 31. Procesul de înlocuire a bazei cu partea stânga a regulii
gramaticale respective se va numi reducere (reduce).
Remarcă. Am efectuat mai sus reducerile: Reduce(1), Reduce(2), Reduce(3),
Reduce(4). Numerele reprezintă numărul regulii din gramatică.
Subiectul 1
Pentru algoritmizarea reconstituirii descrise mai sus vom utiliza un tip nou de ASD.
Definiția 32. ASD(I) este un ASD definit pentru metodele ascendente cu
următoarele modificări:
Operații: 1) Shift( deplasare) transferă câte un simbol din Input → stivă
2) Reduce(i) înlocuiește simbolurile din vârful stivei (numărul de simboluri
înlocuite depinde de numărul i al regulii gramaticii).
3) Proceduri – fragmente de cod care gestionează ASD(I).
4) Operația Shift din ASD este înlocuită cu operația Advance în ASD(I)
Exemplul 38. Să construiască un ASD(I), care ar modela procesul descris în Ex.
( a b ) ―|
29.
<S> Shift Shift Shift Shift Iden2
<A> Shift Shift Shift Shift Iden2
( Shift Shift Shift Shift Iden2
) Iden1 Iden1 Iden1 Iden1 Iden1
b Shift Shift Shift Shift iden2
a Shift Shift Shift Shift Iden2
Δ Shift Shift Shift Shift Iden2
Subiectul 1
(continuare din slide-ul precedent)
Iden1: Vârful stivei: Acțiunea:
(<A>b<S>) Reduce(1)
(b) Reduce(2)
(<S>a<A>) Reduce(3)
(a) Reduce(4)
Else Respins
Iden2: Δ<S> Acceptat
Else Respins
Shift: Push(simbol), Advance
Reduce(1): Pop, Pop, Pop,Pop, Pop,
Push(<S>) Reduce(2): Pop,Pop,Pop,
Push(<S>) Reduce(3): Pop,Pop,Pop, Pop, Pop,
Push(<A>) Reduce(4): Pop, Pop, Pop,
Push(<A>)
Remarcă. Un astfel de proces asigurat de ASD(I) este supranumit “Deplasare -
Identificare”
Exemplu
• Să se proiecteze ASD pentru gramatica:

1. <S>→(a<A><B>c)
2. A>→(c<S><B>)
3. <A>→(<B>b)
4. <B>→(b<B>)
5. <B>→(d)
Să se proiecteze ASD pentru gramatica:
1. A> →(ab<B>)
2. <B>→(bc<B>)
3. <B>→(fb<A>)
4. <B>→(c<A>)
5. <A>→(a)
Subiectul 1
Abordarea II
Ideea abordării: Pentru Abordarea I era caracteristic:
1. Operația Push este executată până nu este împins în stivă “)”. În aceasta
stare (cu “)” în vârful stivei) este apelată procedura de identificare a bazei
Iden1.
2. Procedura Iden1 verifică simbolurile din vârful stivei și, la rândul său,
apelează una dintre procedurile de reducere Reduce(1), Reduce(2) ,….
Dezavantaj: Complexitatea procedurilor de reducere.
Pentru Abordarea II este caracteristic:
1. Extinderea alfabetului stivei, care ar permite memorarea de informație
suplimentară în stivă.
2. Pe baza analizei informației suplimentare se ia decizia, dacă în vârful
stivei se află o anumită bază.
Pentru a asigura informația necesară abordării sunt create 2 tabele:
1. Tabela de codificare a informației pentru luarea deciziei de reducere
din vârful stivei.
2. Tabela de “împingere” a informației în stivă – Push-tabela.
Ambele tabele sunt gramatic-orientate. Pentru a prezenta tabelele
menționate vom apela la gramatica din Ex. 37:
1. <S>→ (<A>b<S>)
2. <S>→(b)
3. <A>→(<S>a<A>)
4. <A>→(a)
Explicație. În gramatica prezentată informația deținuta de non-terminalele
<S> și <A> diferă de la o regulă la alta. De exemplu, <S> de la sfârșitul regulii
1 indică penultimul simbol al bazei respective, iar același <S> din regula 3
referă al doilea simbol al bazei. În primul caz în stivă este așteptat simbolul “)”
pentru sfârșitul bazei primei reguli, iar în cazul secund este așteptat simbolul
“a”. Ambele cazuri necesită interpretări diferite.
Tabela de codificare
Simbol gramatica Simbol stiva Șirul codat
b b1 (b
b2 (<A>b
a a1 (<S>a
a2 (a
( (1 (
) )1 (<A>b<S>)
)2 (b)
)3 (<S>a<A>)
)4 (a)
<S> <S>1 (<A>b<S>
<S>2 (<S>
<S>3 Δ<S>
<A> <A>1 (<A>
<A>2 (<S>a<A>
Δ Δ
Push - tabela asigură codificarea informației în stivă astfel:
1. Automatul analizează simbolul de intrare.
2. Pe baza Tabelei de codificare și a Push-tabelei se ia decizia ce va fi
“împins” în stivă.
a b ( ) <S> <A>
1. <S >→ ( <A> b <S> ) a1 (1 <A>2
3 1 1 1 1 1 a2 (1 )4
2. <S>→(1 b2 )2 b1 (1 <S>1
3. <A>→(1 <S>2 a1 <A>2 )3 b2 (1 )2
4. <A>→(1 a2 )4 (1 a2 b2 (1 <S>2 <A>1
<S>1 (1 )1
<S>2 a1 (1
<S>3 (1
<A>1 (1
<A>2 (1 )3
Δ (1 <S>3
Subiectul 1: Tabela automatului
Push-table ( a b ) ―|
a1 Shift Shift Shift Shift R
a2 Shift Shift Shift Shift R
a b ( ) <S> <A>
a1 (1 <A> b1 Shift Shift Shift Shift R
2
b2 Shift Shift Shift Shift R
a2 (1 )4
(1 Shift Shift Shift Shift R
b1 (1
)1 Reduce(1) Reduce(1) Reduce(1) Reduce(1) Reduce(1)
b2 (1 )2
(1 a2 b1 (1 <S> <A> )2 Reduce(2) Reduce(2) Reduce(2) Reduce(2) Reduce(2)
2 1

<S> (1 )1 )3 Reduce(3) Reduce(3) Reduce(3) Reduce(3) Reduce(3)


1

<S> a1 (1 )4 Reduce(4) Reduce(4) Reduce(4) Reduce(4) Reduce(4)


2

<S> (1 Shift Shift Shift Shift R


<S>1
3

<A> (1 <S> <S>2 Shift Shift Shift Shift R


1 1 <S>3 Shift Shift Shift Shift A
<A> (1 )3 Shift Shift Shift Shift R
<A>1
2

Δ (1 <S> <A>2 Shift Shift Shift Shift R


3 Δ Shift Shift Shift Shift R
Subiectul 3
(continuarea slide -ului precedent)
Shift: PushTab(simbol); Advance;
Reduce(1): Pop;Pop;Pop;Pop;Pop;PushTab(<S>);
Reduce(2): Pop;Pop;Pop;PushTab(<S>);
Reduce(3): Pop; Pop;Pop;Pop;Pop;PushTab(<A>);
Reduce(4): Pop;Pop;Pop;PushTab(<A>);
Stiva: Δ.
Exemplul 39. Pentru gr. din Ex. 37 să se obțină configurațiile automatului de
mai sus.
Definiția 33. ASD(II) este un ASD definit pentru metodele ascendente cu
următoarele modificări:
Operații: 1) Shift( deplasare) transferă câte un simbol pe baza Push-Tabelei
din Input → stivă. Altfel, simbolul din Input este transformat conform tabelei
Push-Tabela.
2) Pop, Advance au semnificația obișnuita.
3) Reduce (p) are semnificația de mai sus. Ea nu mai are calificativul ‘Respins’
și ‘Acceptat’.
Definiția 34. Metodele ascendente de procesare a șirurilor finite de
simboluri, care se bazează pe ASD(II) se numesc metode de tipul “deplasare -
reducere”.
Observație. Metodele ascendente asigură procesarea gramaticilor de
translatare. Pentru asta acțiunile trebuie incluse în operațiile Reduce(p).
Exemplul 40. Să se transcrie Tabela ASD(II) (obținută anterior) astfel ca să
fie asigurată translatarea șirului (((b)a(a))(b)) conform gramaticii de
translatare:
1. <S>→ (<A><S>){x}
2. <S>→(b){z}
3. <A>→(<S>a<A>){x}{y}
4. <A>→(a)
Sfârșitul subiectului 1
Subiectul 2
• Metodele ascendente de procesare a șirurilor de caractere bazate pe ASD(I)
necesita procedee eficiente de evidențiere a bazelor (handles).
Subiectul 1 din Prelegerea 6 conține o astfel de abordare: parțile drepte ale
gramaticilor utilizate sunt incluse in paranteze( “(“ si “)”).
Dezavantaj: 1.In acest caz șirurile derivate abunda de paranteze ce creează o
serie de probleme.
2. Baza nu poate fi analizata si, deci, eficientizarea tabelei este imposibila.
In anumite condiții putem , însa, renunța la aceste paranteze fără a periclita
eficiența procesării șirurilor finite de caractere.
Fie data gramatica:
1. <S>→b<A><S><B>
2. <S>→b<A>
3. <A>→d<S>ca
4. <A>→e
5. <B>→c<A>a
6. <B>→c
Gramatica prezentata nu are paranteze pentru evidențierea bazei, dar baza
poate fi lesne evidențiata cu ajutorul mulțimilor FIRST si FOLLOW. Aceste
mulțimi, aici, joaca rolul de paranteze.
Calcularea mulțimilor FIRST si FOLLOW se va face analizând procesul de
de derivare a șirurilor bazat pe gramatica data:

1. <S>→b<A><S><B>
2. <S>→b<A>
3. <A>→d<S>ca
4. <A>→e
5. <B>→c<A>a
FIRST 6. <B>→c FOLLOW
<S>={b, <S>} <S>={c, ―|}
<A>={d, e,<A>} <A>={a,b,c, ―|}
<B>={c,<B>} <B>={c, ―|}
a={a} a={a,b,c, ―|}
b={b} b={d,e}
c={c} c={a,c,d,e, ―|}
d={d} d={b}
e={e} e={a,b,c, ―|}
Subiectul 2
Pentru a gestiona informatia continuta in FIRST si FOLLOW se invoca doua
principii: principiul “impingerii” in stiva si principiul reducerii bazei. Le vom
formula in continuare.

Sfârșitul subiectului 2.
Exemplul 33. Pentru tabela ASD(I) sa se precizeze procedurile Ident si Shift.

Exemplul 34. Pentru gramatica:


1. <S>→(b<A><S><B>)
2. <S>→(b<A>)
3. <A>→(d<S>ca)
4. <A>→(e)
5. <B>→(c<A>a)
6. <B>→(c)
1) Sa se construiasca ASD(I) corespunzator.
2) Sa se construiasca ASD(II) respectiv.
Subiectul 4

• Vom aborda doar generarea codurilor pentru expresiile aritmetice.


Generarea de coduri se face pe baza unei mașini virtuale (MV), care este
emulata pe calculator. Acest fapt este condiționat de:
1. Asigurarea unui mediu multilingual pe calculator.
2. Optimizarea codul obținut în rezultatul translatării.
3. Extinderea limbajului de programare realizat pe calculator.
Schema funcționala a MV
Acumulator
Registre Memoria

……….. …………
Lista comenzilor Mașinii Virtuale
Load C - încarcarea celulei C în Acumulator (ACC)
Store C memorarea ACC în celula C
Add C sumarea ACC cu conținutul celulei C. Rezultat- ACC
Sub C scăderea din ACC a conținutului C. Rezultat - ACC
Mult C înmulțirea ACC cu C. Rezultat -ACC
Div C împărtirea ACC la C. Rezultat - ACC
Chs schimbarea semnului ACC
…….
BC transferul de control la comanda din C.

Remarca. 1. Generarea comenzii se efectueaza cu procedura:


Gen (‘Add’, ‘C’)
2. Acumulatorul va fi modelat de variabilă globala ACC. ACC=‘ ‘ – liber.
3. Incarcarea acumulatorului se efectueaza cu procedura:
GetACC(X,Y)
Logica procedurii:
Conditia: Actiunea:
ACC=‘ ‘ Gen(‘Load’, X)
ACC=Y X Y
ACC<>X Gen(‘Store’, ACC)
Gen (‘Load’, X)
ACC=X
• Tetrada este o structura de forma:
Td(i).Op, Td(i).Oper1, Td(i).Oper2, Td(i).Rezult
Op – operatia, Oper1- operandul stang, Oper2 – operandul drept,
Rezult – rezultatul.
Exemplul 37. Sa se proiecteze un algoritm care ar genera pentru MV definită
mai sus codurile tetradice pentru expresia: a*b+c.
Precizare: Tetrada Codurile ACC
(*, a ,b , T1) Load a
Mult b T1
(+, T1, c, T2) Add c T2
T1 si T2 sunt variabile temporare.
Sfarsitul subiectului 4

.
Subiectul 3
• Triadele sunt asemanatoare tetradelor, dar stocarea rezultatelor este
modelata de doua stive: StivaR si StivaT.
StiveR contine referintele la triadele procesate iar StivaT contine rezultatele
triadelor.
Exemplu. Triada Codurile Stive ACC
(1) (*, a, b) Load a
Mult b (1) T1 T1
(2) (+, (1), c) Add c (2) T2 T2
Dupa inlocuire, sugerata de sageata, T1 nu mai are rost si stiva este
reconsiderata.
Exemplul 38. Sa se modeleze generarea de coduri pentru orice expresie
aritmetica intr-un mediu de programare.
Sfarsitul subiectului 3
Subiectul 5
• Expresiile aritmetice pot fi reprezentate sub forma unui arbore binar. In
acest caz generarea codurilor poate fo efectuata cu ajutorul unor tehnici
recursive.
Exemplu. Expresia a*b+c poate fi tratata ca un arbore:
+ (1) (*, a, b)
* c (2) (+, (1), c)
a b
In acest caz (1) reprezinta un subarbore. Ca rezultat putem enumera cazurile:
Oper1 Oper2
ACC Var
ACC Subarbore
Var ACC
Var Var
Var Subarbore
…. …….
Exemplul 39. Folosind tehnicile recursive sa se proiecteze un set de proceduri
care modeleaza generarea de coduri pentru MV, cand expresia aritmetica este
reprezentata sub forma unui arbore binar. Sa se analizeze operatiile: +, -,*,/.
Sfarsitul subiectului 5.

Sfârșitul cursului

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