Sunteți pe pagina 1din 5

APLICAŢII ale metodei ALGEBREI INIŢIALE

Virgil Emil Căzănescu

January 13, 2005

1 Arbori de derivare
Un arbore de derivare ı̂ntr-o gramatică independentă de context are următoarele proprietăţi:
1. are noduri etichetate cu terminale sau neterminale;
2. este local ordonat: succesorii fiecărui nod sunt ı̂ntr-o ordine totală;
3. pentru orice nod, dacă este etichetat cu un terminal atunci nu are succesor, iar dacă este etichetat
cu un neterminal n, atunci acesta şi cuvântul format de etichetele succesorilor formează o producţie
(n, s1 s2 . . . sk−1 sk ) ∈ P .

s1 s2 s k-1 s
k

1.1 O gramatică pentru expresii


Definim o gramatică independentă de context pentru expresiile construite cu variabilele x, y şi z,
cu operaţiile binare de adunare şi ı̂nmulţire şi cu paranteze. Gramatica trebuie constrită respectand
urmatoarele condiţii privind expresiile:
1. ı̂nmulţirile se fac ı̂naintea adunărilor
2. adunările se fac de la stânga la dreapta
3. ı̂nmulţirile de la dreapta la stânga.
Mulţimea terminalelor este {x, y, z, (, ), +, ∗}. Fie N = {V, F, T, E, P } mulţimea neterminalelor. Semnificaţia
lor este următoarea:

V reprezintă variabilele
F de la factor, reprezintă cele mai “mici” elemente folosite ı̂n construcţia expresiilor
T de la termen, reprezintă un produs de factori
E de la expresie, reprezintă o sumă de termeni
P de la program.

Continuăm cu mulţimea regulilor(producţiilor) gramaticii:

0. P → E 1. V → x 2. V → y 3. V → z 4. F → V
5. F → (E) 6. T → F 7. T → F ∗ T 8. E → T 9. E → E + T

Observaţi producţiile 7 şi 9 pentru a vedea cum se precizează ordinea de execuţie a operaţiilor de acelaşi
fel. Neterminalul din membrul stâng se află ı̂n dreapta, respectiv ı̂n stânga semnului operaţiei.

1
1.2 Un exemplu
Să se construiască arborele de derivare pentru expresia x + y ∗ (x + y) ∗ z + z.

E + T

E + T F

T F * T V

F V F * T z

V y ( E ) F

x E + T V

T F z

F V

V y

x
Pentru a reface expresia, arborele se parcurge ı̂n inordine.
Dacă veţi incerca să construiţi alt arbore de derivare pentru aceeaşi expresie veţi constata ca acest lucru
nu este posibil. Prin urmare modul de construcţie al expresiei va impune o anumită ordine ı̂n evaluarea
acesteia.
Folosind numerele care denumesc producţiile ca nume ale operaţiilor din algebra arborilor de derivare

2
arborele de mai sus este

A = 0(9[9{a, 7(4[2], 7[ 5{9(a,6[4(2)])},b ]) },b])

unde a = 8(6[4(1)]) şi b = 6(4(3)).


0

9 6

8 7 4

6 4 7 3

4 2 5 6

1 9 4

8 6 3

6 4

4 2

2 Compilare
Un compilator care va produce un program pentru evaluarea expresiilor si tipărirea rezultatului evalării
va fi modelat printr-un morfism.
Vom pune ı̂n evidenţă elementele care apar ı̂n programele obţinute prin compilare. R este un registru
din memorie. P este un pointer către primul loc liber al stivei utilizate ı̂n timpul evaluării.
Presupunem că limbajul de asamblare include următoarele instrucţiuni:

3
inc P operator de incrementare a poziţiei primului loc liber din stivă
dec P operator de decrementare a poziţiei primului loc liber din stivă
Ad R adună valoarea din vârful stivei prin conţinutul lui R şi depune rezultatul ı̂n R
Mu R inmulţeşte valoarea din vârful stivei prin conţinutul lui R şi depune rezultatul ı̂n R
ld R valoarea din vârful stivei este depusă ı̂n R
st R valoarea din R este depusă ı̂n vârful stivei
print tipăreşte valoarea din vârful stivei

Semantica unei expresii va fi programul care evaluează expresia si imprima rezultatul evaluării. Pentru
definirea acesteia se va folosi metoda semanticii algebrei iniţiale.
Toate cele 5 suporturi ale algebrei semantice, corespunzătoare neterminalelor, sunt identice şi coincid
cu mulţimea bucăţilor de program(şiruri de instrucţiuni separate prin ;). Astfel de bucăţi de programe
vorfi notete cu litere greceşti.
Cele 10 operaţii ale algebrei semantice, corespunzătoare producţiilor sunt:

1S = st x ; inc P
2S = st y ; inc P
3S = st z ; inc P
4S (α) = α
5S (α) = α
6S (α) = α
7S (α,β) = α ; β ; dec P ; ld R ; dec P ; Mu R ; st R ; inc P
8S (α) = α
9S (α,β) = α ; β ; dec P ; ld R ; dec P ; Ad R ; st R ; inc P
0S (α) = α ; dec P ; print

Notăm cu S algebra semantică de mai sus, cu A algebra arborilor de derivare şi cu C : A −→ S unicul
morfism de algebre existent. Morfismul C este modelarea algebrică a compilatorului.
Conform metodei semanticii algebrei iniţiale rezultă că C(A) este programul care evaluează şi tipăreşte
rezultatul pentru expresia x + y ∗ (x + y) ∗ z + z.

2.1 Program
Prezentăm calculele care dovedesc afirmaţia de mai sus.

C(a) = 8S (6S [4S (1S )]) = 1S şi C(b) = 6S (4S (3S )) = 3S

Notând c = 7[ 5{9(a,6[4(2)])},b ]
C(c) = 7S [ 5S {9S (1S ,6S [4S (2S )])},3S ] = 7S [ 9S (1S ,2S ),3S ] =
9S (1S ,2S ),3S ; dec P ; ld R ; dec P ; Mu R ; st R ; inc P =
1S ; 2S ; dec P ; ld R ; dec P ; Ad R ; st R ; inc P ; 3S ; dec P ; ld R ; dec P ; Mu R ; st R ; inc P =
st x ; inc P; st y ; inc P ; dec P ; ld R ; dec P ; Ad R ; st R ; inc P ; st z ; inc P; dec P ; ld R ; dec P ;
Mu R ; st R ; inc P

Deoarece A = 0(9[9{a, 7(4[2], c) },b]) deducem


C(A) = 0S (9S [9S {1S , 7S (2S ,C(c)) },3S ]) = 0S (9S [9S {1S , 7S (2S ,C(c)) },3S ]) =
9S [9S {1S , 7S (2S ,C(c)) },3S ] ; dec P ; print =
9S {1S , 7S (2S ,C(c)) } ; 3S ; dec P ; ld R ; dec P ; Ad R ; st R ; inc P ; dec P ; print =
1S ; 7S (2S ,C(c)) ; dec P ; ld R ; dec P ; Ad R ; st R ; inc P ; 3S ; dec P ; ld R ; dec P ; Ad R ; st R ;
inc P ; dec P ; print =
1S ; 2S ; C(c) ; dec P ; ld R ; dec P ; Mu R ; st R ; inc P ; dec P ; ld R ; dec P ; Ad R ; st R ; inc P ;
3S ; dec P ; ld R ; dec P ; Ad R ; st R ; inc P ; dec P ; print =

4
st x ; inc P ; st y ; inc P ; st x ; inc P ; st y ; inc P ; dec P ; ld R ; dec P ; Ad R ; st R ; inc P ; st z ;
inc P ; dec P ; ld R ; dec P ; Mu R ; st R ; inc P ; dec P ; ld R ; dec P ; Mu R ; st R ; inc P ; dec P ; ld R
; dec P ; Ad R ; st R ; inc P ; st z ; inc P ; dec P ; ld R ; dec P ; Ad R ; st R ; inc P ; dec P ; print

2.2 Optimizare cod


Se obsrvă că programul de mai sus poate fi simplificat. Eliminând instrucţiunile “inc P ; dec P” al
căror efect cumulat este nul obţinem programul

st x ; inc P ; st y ; inc P ; st x ; inc P; st y ; ld R ; dec P ; Ad R ; st R ; inc P ; st z ; ld R ; dec P ;


Mu R ; st R ; ld R ; dec P ; Mu R ; st R ; ld R ; dec P ; Ad R ; st R ; inc P ; st z ; ld R ; dec P ; Ad R ;
st R ; print

Mai observăm că grupul de instrucţiuni “st R ; ld R ; dec P” are acelaşi efect ca instruci̧unea “dec P”
ceea ce conduce la programul

st x ; inc P ; st y ; inc P ; st x ; inc P; st y ; ld R ; dec P ; Ad R ; st R ; inc P ; st z ; ld R ; dec P ;


Mu R ; dec P ; Mu R ; dec P ; Ad R ; st R ; inc P ; st z ; ld R ; dec P ; Ad R ; st R ; print