conditii l curs

22
2. Gramatici formale şi analiza sintactica În rezultatul analizei lexicale orice program iniţial se codifica cu ajutorul vectorilor sintactic şi semantic şi a tabelelor claselor de lexeme. Pentru efectuarea analizei sintactice, adică a procesului de identificare în program a structurilor mai complicate (expresii, instrucţiuni, funcţii etc.), se utilizează doar vectorul sintactic. Metodele de analiză sintactică sunt elaborate în baza teoriei gramaticilor şi limbajelor independente de context. Gramatica formală G = (V N ,V T , P, S) se numeşte gramatică independenă de context (g.i.c.), dacă tote producţiile ei au forma A, unde A V N , (V N V T ) . Simbolul neterminal S se numeşte simbol iniţial sau axiomă. Exemplu : G 1 = ({<expresie>, <term>, <factor>}, {+,, (, ), <identificator>}, P, <expresie>). În scopul simplificării, vom utiliza abreviaturile: E - pentru <expresie>, T - pentru <term>, F - pentru <factor> şi a - pentru <identificator>. Mulţimea producţiilor P se defineşte în modul următor: P = { 1. E T 2. E E+T 3. T F 4. T T*F 5. F a 6. F (E) } Dacă şi sunt şiruri peste vocabularul (V N V T )* , = 1 A 3 , = 1 2 3, iar A 2 este producţie din P, atunci vom spune că şirul derivează direct şirul şi vom nota aceasta prin . Şirurile 1 , 2 şi 3 pot fi şi vide. Astfel, pentru orice producţie A din P avem A. Şirul 0 derivează şirul n dacă există secvenţa 1 , 2 , …, n-1 pentru care i i+1 , i=0,1,…,n-1. Adică 0 1 2 n-1 n . Vom nota aceasta prin 0 * n . Secvenţa 0 , 1 , …, n se numeşte derivare .

Upload: gicu-ciobanu

Post on 28-Dec-2015

14 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Conditii l Curs

2. Gramatici formale şi analiza sintactica

În rezultatul analizei lexicale orice program iniţial se codifica cu ajutorul vectorilor sintactic şi semantic şi a tabelelor claselor de lexeme. Pentru efectuarea analizei sintactice, adică a procesului de identificare în program a structurilor mai complicate (expresii, instrucţiuni, funcţii etc.), se utilizează doar vectorul sintactic.Metodele de analiză sintactică sunt elaborate în baza teoriei gramaticilor şi limbajelor independente de context. Gramatica formală G = (VN,VT, P, S) se numeşte gramatică independenă de context (g.i.c.), dacă tote producţiile ei au forma A, unde A VN, (VNVT). Simbolul neterminal S se numeşte simbol iniţial sau axiomă.Exemplu: G1= ({<expresie>, <term>, <factor>}, {+,, (, ), <identificator>}, P, <expresie>).În scopul simplificării, vom utiliza abreviaturile: E - pentru <expresie>, T - pentru <term>, F - pentru <factor> şi a - pentru <identificator>. Mulţimea producţiilor P se defineşte în modul următor:P = { 1. E T2. E E+T3. T F4. T T*F5. F a6. F (E) }Dacă şi sunt şiruri peste vocabularul (VNVT)* , =1A3, =123, iar A2 este producţie din P, atunci vom spune că şirul derivează direct şirul şi vom nota aceasta prin . Şirurile 1, 2 şi 3 pot fi şi vide. Astfel, pentru orice producţie A din P avem A.

Şirul 0 derivează şirul n dacă există secvenţa 1, 2, …, n-1 pentru care

ii+1, i=0,1,…,n-1. Adică 012…n-1n. Vom nota aceasta prin 0 *

n. Secvenţa 0, 1, …, n se numeşte derivare.Derivarea se numeşte dreaptă (stângă), dacă la fiecare pas se substituie cel mai

din dreapta (stânga) simbol neterminal.Exemplu.E E+T E+T+T T+T+T F+T+T a+T+T. Putem scrie

E * a+T+T. Lungimea acestei derivări este 5, la obţinerea ei au fost aplicate producţiile: 2, 2, 1, 3, 5.

Şirul se numeşte formă sentenţială (sau formă propoziţională), dacă S* . De exemplu, a+T+T este formă sentenţială. Limbajul generat de o gramatică formală G se defineşte ca mulţimea tuturor

formelor sentenţiale peste vocabularul ,adică L(G)={x | S* x, x VT*}. Pentru gramatica din exemplul de mai sus. este mulţimea expresiilor aritmetice,alcătuite din identificatori, paranteze şi operaţii “+”, “ ”. Dacă , atunci se numeşte frază . Cea mai din stînga frază a unei forme sentenţiale se numeşte capăt (handle). De menţionat că orice frază este de fapt partea dreaptă a unei producţii.

Page 2: Conditii l Curs

Orice derivare poate fi reprezentată sub forma unui arbore sintactic sau de

derivare .În figura 1 prezentăm arborele sintactic pentru derivare E * F+T*a. E

E + T

T T * F

F a

Fig.1. Arborele sintactic pentru derivarea E * F+T*aAvînd derivarea unei forme sentenţiale întotdeuna putem construi arborele ei sintactic şi invers. Dacă pentru o formă sentenţială putem construi doi sau mai mulţi arbori sintactici distincţi (sau derivări dreapta(stînga) distincte), atunci gramatica se numeşte ambiguă. Din cele expuse mai sus este clar cum pot fi construite şiruri corecte ale limbajului utilizînd definiţia gramaticii formale şi cum pentru aceste şiruri se pot construi derivările şi arborii sintactici. Analizorul sintactic rezolvă problema inversă. Fiind dat un şir arbitrar, analizorul construieşte derivarea posibilă(arborele) pentru acest şir, dacă ea există.Există două strategii diferite pentru organizarea analizei sintactice: descendentă şi ascendentă. Aceste strategii se deosebesc doar prin metoda de construire a arborelui sintactic - de sus în jos, sau invers. În cazul strategiei descendente ne deplasăm în jos de la nodul arborelui marcat cu simbolul axiomei (rădăcina) construind noi noduri şi arce, care le leagă. Acest proces continuă pînă la construirea arborelui final, corespunzător şirului analizat. În procesul de construire a acestui arbore sunt posibile construcţii greşite. În acest caz se distrug unele noduri şi arce şi se încearcă alte variante de construcţie. Dacă încercînd toate variantele posibile nici unul nu ne permite să construim arborele sintactic final, concludem că acest şir este sintactic incorect.

În cazul strategiei ascendente se porneşte de la nodurile arborelui corespunzătoare simbolurilor terminale ale şirului, care trebuie să fie noduri terminale (frunze) ale arborelui sintactic. Deplasîndu-ne în sus spre rădăcină(axiomă) pas cu pas se construiesc noduri şi arce noi. Sunt posibile deasemenea construcţii greşite şi reveniri la construcţiile precedente.

Un algoritm de analiză sintactică este considerat efectiv, dacă permite construirea arborelui fără reveniri. S-au elaborat mai multe metode efective de analiză sintactică atât pentru strategia descendentă (gramatici LL(k)), cât şi pentru cea ascendentă (gramatici LR(k), de precedenţă).

3.Gramatici de precedenţă simplă

Page 3: Conditii l Curs

Metoda precedenţei simple a fost propusă de către Wirth şi Weber şi presupune că între oricare două simboluri X1 şi X2 ale formei sentenţiale sunt posibile relaţii de precedenţă:

1) X1<X2, dacă simbolul X2 este primul simbol al unei forme sentenţiale;2) X1>X2, dacă X1 este ultimul simbol al unei forme sentenţiale;3) X1=X2, dacă X1 şi X2 aparţin aceleiaşi fraze.

De menţionat că ordinea simbolurilor X1 şi X2 este importantă; relaţiile <, >, =, nu sunt reflexive, din faptul că X1>X2 (sau X1=X2), nu rezultă că X2<X1 (sau X2=X1).

Dacă pentru orice pereche ordonată de simboluri X1 şi X2 există cel mult o relaţie de precedenţă, atunci este simplu de evidenţiat fraza: cea mai din stânga secvenţă de simboluri Xi, Xi+1,…,Xj, Xj+1, legate prin relaţiile Xi<Xi+1=Xi+2 =…=Xj>Xj+1.

Relaţiile de precedenţă pot fi reprezentate sub forma unei matrici, dimensiunea căreia este NN, unde N=card(VNVT{$})

Să considerăm gramatica independentă de contextG2=(VN ,VT, P, S), VN ={S ,L}, VT ={a, [, ]},P={S(LSaL(La)Laa)}Limbajul L(G2) conţine şirurile (aa), ((aa)a), (((aa)a)a), ((((aa)a)a)a),….Pentru această gramatică în fig.3 este reprezentată matricea relaţiilor de precedenţă. Semnul $ se foloseşte în calitate de marcher pentru începutul şi sfîrşitul şirului.

Să examinăm în continuare şirul $((aa)a)$. Să inserăm între simbolurile adiacente relaţiile respective de precedenţă:

$<(<(<a=a =)>a=)>$Fraza, după cum am menţionat mai sus, va fi <a=a=)>. Aşa cum gramatica conţine producţia 4. Laa), putem reveni la penultima formă sentenţială, în care simbolul neterminal L a fost substituit cu şirul aa).Obţinem $((La)$. Inserăm din nou relaţiile de pecedenţă între simbolurile şirului:

$<(<(=L=a=)>$.

De data aceasta fraza va fi:< (=L=a=) >.Aplicând producţia 3. L→(La) şi reducând şirul (La) la simbolul L şi obţinem o nouă formă sentenţială: $ (L $.Continuăm şă inserăm relaţiile între simbolurile şirului:$ <(=L > $.Noua frază este (L şi, aplicând producţia 1. S→(L, în rezultatul reducerii obţinem $ S $.În aşa mod, urmărind în ordine inversă toate reducerile efectuate, obţinem derivarea dreaptăS ( L ((La) ((aa)a)a şirului iniţial. Aceasta ne demonstrează, că acest şir este sintactic corect, adică aparţine limbajului L(G2).Pe de altă parte, pentru şirul $ (a) $ obţinem:

Page 4: Conditii l Curs

$ < (<a=) > $. Fraza evidenţiată este a). Intrucât nu avem nici o producţie partea dreaptă a căreia să fie a), concludem, că acest şir nu aparţine limbajului L(G2).Analogic, dacă încercăm să analizăm şirul $ (a)(a) $ observăm, că între simbolurile ) şi ( nu este nici o relaţie de precedenţă. Concluzia este aceiaşi – acest şir este eronat, nu aparţine limbajului L(G2). Acest exemplu ne permite să formulăm următoarea concluzie: pătrăţelele necompletate ale matricei indică că simbolurile respective nu pot apărea alături în nici o formă sentenţială şi deci toate aceste cazuri vor fi interpretate ca erori. Definiţie. Gramatica independentă de context G se numeşte gramatică de precedenţă simplă, dacănu conţine -producţii;

nu permite derivări A+

A;este unic invertibilă, adică nu conţine producţii cu părţi drepte identice.

§ 4. Construirea relaţiilorde precedenţă simplă

Pentru a construi matricea de precedenţă sunt necesare unele construcţii preliminare. Pentru orice simbol neterminal U construim mulţimile PRIM(U) şi ULTIM(U).Simbolul A(VN VT) aparţine mulţimii PRIM(U), dacă din U este posibilă

derivarea U* AAdică poate fi derivat un şir, care începe cu simbolul A. Respectiv,

ULTIM(U), dacă este posibilă derivarea U* A.

Algoritmul de construire a mulţimilor PRIM şi ULTIM:

1.PR(A):=0; UL(A):=0; Pentru toţi .2.PRIM(A):=PR(A);ULTIM(A):=UL(A); pentru toţi .3.Pentru toate producţiile

din P: PR(A):=PR(A){X1}; UL(A):=UL(A) {Xk}.4.Dacă există pentru care PR(A) PRIM(A) UL(A) ULTIM(A), atunci salt la 2.5.Stop.

Rezultatul unei iteraţii a algoritmului este prezentată în figura 4. Rezultatul final – în figura 5.

U PRIM(U)

ULTIM(U)

Page 5: Conditii l Curs

ETF

T,EF,Ta,(

TFa,)

Fig. 4

U PRIM(U) ULTIM(U)E T,E,F,a,( T,F,a,)T F,T,a,( F,a,)F A,( a,)Fig. 5

În continuare vom construi matricea relaţiilor de precedenţă. Vom nota prin X1

, X2 simboluri arbitrare din VNVT, iar prin şiruri arbitrare, posibil vide.

Algoritmul de consruire a relaţiilor de precedenţă1.Dacă U1X1X22 este producţie din P, atunci X1X2

2. Dacă U1X1Y2 este producţie din P , YVN, atunci X1<X2 pentru toţi X2PRIM(Y).3. a) Dacă U1YX22 este producţie din P, YVN, X2 VT, atunci X1>X2 pentru toţi X1ULTIM(Y).3. b) Dacă U1YZ2 este producţie din P, YVN, Z VN, atunci X1>X2 pentru toţi X1ULTIM(Y), X2PRIM(Z)VT.

Aplicînd acest algoritm construim matricea relaţiilor de precedenţă pentru gramaticile G2 (fig. 3) şi G1(fig. 6).

S L a ( ) $SL =a = = >( = <) > >$ < <Fig. 3.

E T M + * ( ) a $E = =T > = >M > > >+ <= < < <* = < <( <= < < < <) > > >A > > >$Fig. 6.

Gramatica G nu este de precedenţă simplă, deoarece apar ambigiutăţi la definirea relaţiilor dintre simbolurile (, E şi +, T. Pentru aceste simboluri se obţine ( = E, + = T, dar şi C < E, + < T.

Page 6: Conditii l Curs

Acest fapt este o consecinţă a fatului, că metoda relaţiilor de precedenţă simplă utilizează un context minimal pentru evidenţierea frazei: se examinează doar două simboluri vecine din forma sentenţială. Frecvent aceste ambiguităţi pot fi eliminate efectuînd transformări echivalente asupra gramaticii. Iată doar cîteva transformări care ar putea elimina ambiguităţile ce apar în rezultatul construirii matricii relaţiilor de precedenţă. 1. În rezultatul construirii relaţiilor de precedenţă obţinem şi . Aceasta se datoreaza:existenţei producţiilor , (se genereaza ) , şiexistenţei producţiilor j=1,2,…,s, si (se genereaza )În acest caz întroducem un simbol neterminal nou , , si producţiile

, Producţiile le substituim cu . Daca în P avem producţii de forma , atunci le substituim prin

În rezultatul acestor transformări gramatica modificata ramîne echivalentă gramaticii iniţiale , iar relaţia în noua gramatica nu mai apare.

2.Cazul si se examineaza în mod analogic .3. Dacă simbolurile X1 şi X2 satisfac relaţiile X1<X2 şi X1>X2 , atunci gramatica conţine producţiile:Ui X1Zii, X2PRIM(Zi) i=1,2,….,r (generează X1 <X2 ) şi producţiileVjjYjX2j , X2VT sau/şiVjjYjWjj , X1 ULTIM(Yj),X2PRIM(Wj)∩VT , j=1,2,…,t.

Pentru a elimina ambiguitate X1<X2, X1>X2 introducem simboluri neterminale noi Ai şi producţii AiiX1, I=1,2,…,r. Substituim producţiile UiiX1Ziβi prin UiAiZiβi

i=1,2,…, r. Dacă gramatica conţinea producţii BiXi ,atunci le substituim prin BAi , i=1,2,…,r.Aceste transformări echivalenteasupra gramaticii elimină relaţia X1<X2.

Dacă în rezultatul transformărilor mai apar ambiguităţi, repetăm aceste transformări. Apare întrebarea: cu ajutorul acestor transformări este posibilă transformarea oricărei gramatici.

independente de context într-o gramatică de precedenţă?Răspunsul la această întrebare este negativ. Cu toate acestea, pentru

majoritatea limbajelor de programare se poate construi o gramatică independentă de context, de precedenţă simplă.

Să aplicăm transformările expuse mai sus la eliminarea ambiguităţilor gramaticii G1.Relaţiile (E şi (<E se obţin din producţiile F(E), deoarece EPRIM (E). Întroducem un simbol neterminal nou T1 şi producţia T1E). Producţia F(E) o substituim prin F(T1.

Page 7: Conditii l Curs

Relaţiile + = T şi + < T se obţin din producţia EET, deoarece T PRIM (E). Întroducem un simbol neterminal nou T2 şi producţia T2T, iar producţia EET o substituim prin ET2. În rezultatul acestor transformări obţinem o gramatică nouă G3, echivalentă cu G1 . Producţiile gramaticii G3 sunt:

{ 1. E→T2 5. T→T*F 2. E→E+T 6. F→a 3. T2→T 7. F→(T1

4. T→F 8. T1→E) }

Mulţimile PRIM şi ULTIM pentru G3 sunt reprezentate în fig. 7, iar

U PRIM(U) ULTIM(U)E T2,E,T,F,a,( T2,T,F,a,T1,)T F,T,a,( F,a,T1,)F a,( a,T1,)T1 E,T2,T,F,a,( )T2 T,F,a,( T,F,a,T1,)

Fig. 7Matricea relaţiilor de precedenţă în figura 8.

E T F T1 T2 + * ( ) a $E = =T > = > >F > > > >T1 > > > >T2 > > >+ < < = <* = < <( < < < = < < <) > > > >a > > > >$ < < < < < <Fig. 8

Exemplele propuse mai jos reprezintă gramatici independente de context care generează limbaje simple sau fragmente ale limbajelor cunoscute de programare. Daca unele construcţii sintactice în gramatică nu sunt definite, ele trebuie interpretate ca simboluri terminale. ()1. Numărul real în limbajul ALGOL-60 se defineşte ca o secvenţă de cifre precedată

de”+” sau “-“ (“+” nu este obligatoriu). În faţa oricărei cifre sau după ultima cifră se poate insera punctul zecimal, care separă partea întreagă de cea fracţionară. După o aşa consecutivitate sau fără ea poate urma litera “E” urmată de un număr întreg cu sau fără semn care reprezintă exponentul zecimal. < program > < secvenţă de numere >

Page 8: Conditii l Curs

< secvenţă de numere> < număr > < număr> < separator> < secvenţă de numere>< separator> + <blanc> < separator> < separator> <blanc>

Utilizând abreviaturile R pentru <program>, L - < secvenţă de numere>, S - <separator>, n - <număr>, b - <blanc>, fragmentul de mai sus se transcrie în felul următor:

G = (VN ,VT, P, R), VN ={R, L, S}, VT ={n, b, +},P={ R LL nL n S LS + S b S S S b

( )2. Constanta zecimală în limbajul PL/ I poate fi un număr întreg, cu punct zecimal

sau flotant. Numărul cu punct zecimal reprezintă o secvenţă arbitrară de cifre cu punct zecimal.

Numărul flotant se defineşte ca un număr întreg sau cu punct zecimal, urmat de litera “E” şi coeficientul exponenţial. Coeficientul exponenţial este un număr întreg cu sau fără semn. Semnul “+” nu este obligatoriu.

Textele propuse spre analizare se definesc cu ajutorul producţiilor:

< program > < secvenţă de numere >< secvenţă de numere> < număr >< număr> < separator> < secvenţă de numere>< separator> + < separator> < separator> < număr> < număr întreg>< număr cu punct zecimal>< număr flotant>.

( )3. Constantele binare în limbajul de programare PL/I se definesc ca numere întregi,

de precizie fixă sau flotante. Numărul întreg este o secvenţă arbitrară de cifre binare (0,1), urmată de litera B. Numărul de precizie fixă este o secvenţă arbitrară de cifre binare cu punct zecimal. La sfîrşitul numărului zecimal se scrie litera B. Numărul flotant binar se defineşte ca un număr binar întreg sau flotant, urmat de litera E şi coeficientul exponenţial. Coeficientul exponenţial este o secvenţă arbitrară de cifre zecimale cu semn. Semnul “+” nu este obligatoriu. La sfîrşitul numărului flotant de asemenea se scrie litera B.

Programele propuse spre analizare se definesc cu ajutorul următoarelor producţii:

< programa > < secvenţă de numere binare > < secvenţă de numere binare > < număr binar > < număr binar >< separator> < secvenţă de numere binare >

< număr binar > < număr întreg >< număr de precizie fixă > < număr flotant >< separator> + < separator>__ __< separator>

Page 9: Conditii l Curs

( )4. În limbajul PL/I pentru descierea variabilelor se utilizează şabloanul. Şablonul zecimal se defineşte prin variabilele simbolurilor 9, V, Z, luate în ghilimele, înaintea cărora se scrie cuvântul PICTURE. Oricarărui din simbolurile 9 şi Z îi poate preceda un număr întreg cuprins în paranteze (secvenţa de simboluri 9). Simbolul V (corespunde punctului zecimal) se poate manifesta doar o singură dată înaintea sau în urma variabilei 9. Simbolul Z ce înseamnă anularea zerourilor nesemnificative, se poate manifesta doar înaintea şi la sfârşitul rândului. La sfârşitul rândului se utilizează doar în acel caz când rândul conţine V.<progam> <secvenţa de descrieri> ;<secvenţa de descrieri> <descrierea> | <descrierea>, <secvenţa de descrieri><descrierea> <identificator> PICTURE <rând>

( )5.În limbajul PL/I se poate de folosit variabile de tipul şirul simbolurilor şi şirul biţilor. Şirul simbolurilor este o secvenţă arbitrară de simboluri, luată în apostrof. În interiorul şirului apostroful se reprezintă prin două apostrofuri consecuteve. Şirul biţilor este o secvenţă arbitrară 0 sau 1, luată în apostrof. La sfîrşitul sirului de biţi se scrie litera B.

< programa > < secvenţă de şiruri > < secvenţă de şiruri > < şir >

< şir >< separator> < secvenţa de şiruri > < şir> < şir de simboluri >

< şir de biţi > < separator>

< separator >< separator >

( )6. Să considerăm un limbaj simplu de programare TURINGOL, care descrie programe pentru maşina Turing. Identificatorul este o secvenţă de litere.Un program TURINGOL se defineşte cu ajutorul producţiilor:

<program> → <descriere>; <listă de instrucţiuni> <listă de instrucţiuni> → <listă de instrucţiuni> < instrucţiune>│ <instrucţiune>

<instrucţiune> → <instrucţiune nemarcată> <eticheta><instrucţiune nemarcată><instrucţiune nemarcată>→;BEGIN <listă de instrucţiuni >END; IF THE TAPE SYMBOL IS <identificator >THEN <instrucţiune >; GO TO <identificator >;PRINT <identificator >; MOVE <direcţie > ONE SQUARE;<direcţie >→LEFTRIGHT<instrucţiune marcată>→ <identificator >:<instrucţiune nemarcată><descriere>→THE TAPE ALPHABET IS <identificator > <descriere>,<identificator >.cuvintele rezervate, delimitatorii şi identificatorii se separă prin unul sau mai multe blancuri.

Page 10: Conditii l Curs

( )7. Identificatorul in limbajul FORTRAN se defineşte ca o secvenţă din litere şi

cifre, care începe în mod obligatoriu cu o literă. Lungimea identificatorului nu trebuie să depăşească 6 simboluri. Constantele sunt numere întregi, reale şi cu precizie dublă. Numerele reale se scriu în forma obişnuită cu punct zecimal. Aceste numere pot fi urmate de un exponent care are forma E <semn>< număr întreg>. Semnul poate fi omis. Numărul de precizie dublă se deosebeşte de cel real doar prin prezenţa obligatorie a exponentului, indicat prin litera D în loc de E. Textele propuse spre analizare se definesc cu ajutorul producţiilor:

<program> → <listă de instrucţiuni><listă de instrucţiuni> → <instrucţiune> <instrucţiune> <listă de instrucţiuni><instrucţiune> → <identificator> = <expresie> <etichetă>:<identificator>= <expresie><etichetă> → <număr întreg><expresie> →<număr> (<expresie>) <identificator> <expresie> <operaţie> <expresie> <operaţie> → + / * **

De menţionat că eticheta poate ocupa poziţiile 1-5 în rînd, iar instrucţiunea – 7-72, rândurile având lungimea maximală 80 de simboluri. Spaţiile libere se ignorează.

( )8. În limbajul MINI −BASIC [6] numărul poate fi definit prin două metode :a) sub forma unei secvenţe arbitrare de cifre zecimale (cu sau fără punct), care

poate fi precedată de un semn;b) sub forma unei secvenţe arbitrare de cifre zecimale (cu sau fără punct), care poate

fi precedată de un semn şi urmată de un simbol E şi încă o secvenţă arbitrară de cifre zecimale (coieficientul exponenţial), care poate fi deasemenea precedată de un semn.Identificatorul se notează cu o literă sau cu o literă, urmată de o cifră. Spaţiile se

ignorează.<program> → <secvenţa de instrucţiuni>;<secvenţa de instrucţiuni> → <etichetă> <instrucţiune>; <etichetă> <instrucţiune>; secvenţa de instrucţiuni<instrucţiune> → LET <identificator> = <expresie><expresie> → <identificator> <expresie> <semn de operaţie> <expresie> (<expresie>) <semn de operaţie> → + /Etichetă este o secvenţă arbitrară de cifre.

Page 11: Conditii l Curs

(2 persoane) 9.Se examinează un limbaj simplu de programare, obţinut din limbajul

ALGOL-68. <program>::=BEGIN <consecutivitate de descrieri> ; <consecutivitate de instrucţiuni>END<consecutivitate de descrieri> ::=<descriere> | <descriere>, <consecutivitate de descrieri><descriere>::=<tip><listă de identificatori><tip>::=BOOL | INT | REF <tip><listă de identificatori>::=<identificator > | <identificator>, <listă de identificatori><instrucţiune>::=<instrucţiune de atribuire> | <instrucţiune IF> | <instrucţiune WHILE><consecutivitate de instrucţiuni> ::=<instrucţiune> | <instrucţiune>; <consecutivitate de instrucţiuni> <instrucţiune de atribuire>::=<identificator>:=<expresie>< instrucţiune IF>::= IF <expresie> THEN <consecutivitate de instrucţiuni> FI |

IF<expresie> THEN <consecutivitate de instrucţiuni > ELSE <consecutivitate de instrucţiuni> FI

<instrucţiune WHILE>::=WHILE<expresie> DO <consecutivitate de instrucţiuni> END<expresie> ::=<identificator> | <constantă> | ( <expresie> ) |

<expresie> + <expresie> | <expresie> =<expresie> | <expresie> ≠<expresie>

<constantă>::=<numar întreg>Numarul întreg se defineşte ca o consecutivitate de cifre fără semn, iar

identificatorul – o consecutivitate arbitrara din litere si cifre , care începe cu o literă . Folosirea spaţiilor – ca în Pascal.

()10. Comentariul în limbajul PL/I este o secvenţă arbitrară de simboluri, cuprinsă între / * şi */. Identificatorul este o secvenţă arbitrară de litere, cifre, separatori ( _ ), care începe cu o literă. Lungimea identificatorului nu trebuie să depăşească 31 simboluri.Textele propuse spre analizare se definesc cu ajutorul producţiilor:< program > (< listă de identificatori >) < listă de identificatori > < identificator > | < identificator > < separator > < listă de identificatori >< separator >, | < separator > < comentariu > | < comentariu > < separator>.

()11. Conform principiilor de bază ale limbajului LISP, definim un limbaj de programare simplu care include în sine construcţii asemănătoare S-expresiilor

Page 12: Conditii l Curs

limbajului LISP. Construcţiile de bază ale limbajului sunt atomii şi listele. Atomul poate fi identificator sau număr întreg.<program> <S-expresie><S-expresie> (<numele funcţiei> <lista argumentelor>)<numele funcţiei> <identificator><lista argumentelor> <argument> | <argument> <lista argumentelor><argument> <S-expresie> | <atom> | <lista><lista> (<listă de elemente>) <listă de elemente> <element> | <element> <listă de elemente><element> <atom> | <S-expresie> | <lista>

Atomii se separă prin unul sau mai multe blancuri. Identificatorii şi numerele se definesc ca şi în limbajul Pascal.

(2 persoane Dohotaru Daniela, Diadiora Alexandru)12. În limbajul PASCAL construcţia {<orice secvenţă de simboluri care nu conţine “{“}, se numeşte comentariu şi poate fi inserată între oricare doi identificatori, numere sau simboluri speciale. Identificatorul este o secvenţă de cifre sau litere care începe obligatoriu cu o literă. Numerele în PASCAL pot fi întregi sau reale şi se definesc în modul următor:<număr real fără semn> <numşr întreg fără semn><.>< numşr întreg fără semn > | <mumăr întreg fără semn >< . ><număr întreg fără semn > E <semn> < număr întreg fără semn > | < număr întreg fără semn >< . >< întreg fără semn > E < număr întreg fără semn > | < număr întreg fără semn > E < număr întreg fără semn> | < număr întreg fără semn > E < semn> < număr întreg fără semn ><semn> + | - Numărul întreg fără semn este o secvenţă din una sau mai multe cifre. Secvenţa de simboluri arbitrare cuprinsă între simbolurile ‘ şi ‘ (apostrof) se numeşte şir de caratere. Dacă acest şir trebuie să conţină simbolul “apostrof”, atunci el apare în şir dublat, adică ‘’. Programul se defineşte în modul următor:<program> <secvenţă de lexeme><secvenţă de lexeme> <lexemă> | <lexemă><separator><secvenţă de lexeme><lexemă> <număr întreg fără semn>|

<număr real fără semn >| <identificator>

<separator> + | - | _<separator> | <separator> _ | <comentariu><separator> | <separator><comentariu>

()13. Şablonul simbolic în limbajul PL/I este o construcţie de tip PICTURE’şir de caractere’. ‘Şirul de caractere’ – o consecutivitate arbitrară a simbolurilor A, 9, X. Fiecare simbol poate fi precedat de un coeficient de repetare, care este o constantă întreagă zecimală fără semn, inclusă în paranteze rotunde. Identificatorul este o

Page 13: Conditii l Curs

secvenţă arbitrară de litere, cifre, separatori ( _ ), care începe cu o literă. Lungimea identificatorului nu trebuie să depăşească 31 simboluri.

Textele propuse spre analizare se definesc cu ajutorul următoarelor producţii:

<program>::= PROCEDURE <listă de instrucţiuni> END;<listă de instrucţiuni>::=<instrucţiune> | <instrucţiune> ; <listă de instrucţiuni><instrucţiune>::= DECLARE <identificator> <şablon>

(2 persoane)14. Următorul limbaj reprezintă un fragment al unui editor de texte utilizat în

unele dintre primele interfeţe interactive “om+calculator”. Acest editor era utilizat la editarea, depanarea şi executarea programelor şi poate fi definit prin următoarea gramatică:<instrucţiune de editare>::=CORR_ ENTER_ <listă de editare>_ END _ ENTER<listă de editare>::= <element de editare> | <element de editare> <listă de editare><element de editare>::= INSERT_ <număr întreg>_ ENTER | INSERT_ <număr întreg> * _ ENTER | INSERT_ ENTER | DELETE_ <număr întreg>_ ENTER | DELETE_ <număr întreg> , <număr întreg>_ ENTER |

REPLACE ENTER| GET_ <număr întreg>_ENTER | GET C’<text>’, <număr întreg>_ ENTER

Cuvintele utilizate: CORR, ENTER, INSERT, DELETE, REPLACE, GET, C, E. Numărul întreg – un număr întreg zecimal, conţinînd nu mai mult de 8 cifre. Textul – o consecutivitate arbitrară de simboluri.

()15.Următoarea gramatică generează expresii corecte în forma poloneză.

<program> <număr> <program> <variabilă><program> <program> <program> <operaţie><operaţie>::= + <operaţie>::= -<operaţie>::= * <operaţie>::= /

(2 persoane)16. Fragmentul de program definit mai jos generează instructiuni corecte pentru descrierea variabilelor in limbajul PL/1.

<instructiune de descriere> DECLARE <lista descrierilor> <lista descrierilor> <descriere>

Page 14: Conditii l Curs

<lista descrierilor> <descriere> , <lista descrierilor><descriere> <identificator><descriere> (<lista descrierilor>)<descriere> <identificator><dimensiune><descriere> (<lista descrierilor>)<dimensiune><descriere> <identificator><lista atributelor><descriere> (<lista descrierilor>)<lista atributelor><descriere> <identificator><dimensiune><lista atributelor><descriere> (<lista descrierilor>)<dimensiune><lista atributelor><dimensiune> (<lista limitelor>)<lista limitelor> <expresie><lista limitelor> <expresie>:<expresie><lista limitelor> <expresie>, <lista limitelor><lista limitelor> <expresie>:<expresie>, <lista limitelor><lista atributelor> <atribut><lista atributelor> <atribut><lista atributelor>

(2 persoane)17. Fragmentul de program definit mai jos generează instructiuni iterative pentru limbajul de programare PL/1.

<instrucţiunea DO> do; <instrucţiunea DO> do while (<expresie>) <instrucţiunea DO> do <variabila> = <lista specificaţiilor> <lista specifiaicaţiilor> <specifiaicaţie><lista specfiaicaţiilor> <lista specificaţiilor> , <specificaţie><specificaţie> <expresie><specificaţie> <expresie> to <expresie><specificaţie> <expresie> by <expresie><specificaţie> <expresie> by <expresie> to <expresie><specificaţie> <expresie> to <expresie> by <expresie><specificaţie> <expresie> while ( <expresie> )<specificaţie> <expresie> to <expresie> while ( <expresie> )<specificaţie> <expresie> by <expresie> while ( <expresie> )<specificaţie> <expresie> by <expresie> to <expresie> while ( <expresie> )<specificaţie> <expresie> to <expresie> by <expresie> while ( <expresie> )

() 18. Constantele numerice în limbajul Pascal le notăm prin < număr întreg fără semn> şi < număr real fără semn >.

Programele propuse spre analizare se definesc cu ajutorul următoarelor producţii:

< program > < secvenţă de numere> < secvenţă de numere > < număr > < secvenţă de numere > < număr >< separator> < secvenţă de numere >

< număr > < număr întreg fără semn>< număr > < număr real fără semn >< separator> +

Page 15: Conditii l Curs

< separator> < separator><blanc> < separator> <blanc>< separator>