Consideratii generale privind lexicul, sintaxa si semantica unui limbaj
de programare
Rezumat- se prezinta alfabetul unui limbaj de programare, vocabularul limbajului, traducerea programelor (translatoare), analiya textului sursa a unui program (analiza lexicala, sintactica si semantica).
Orice limbaj de programare are la baza un anumit alfabet. În majoritatea cazurilor setul de caractere este format din:
literele alfabetului englez (de la A la Z, de obicei si majusculele, si literele
mici, în total 52 de caractere);
- cifrele arabe (de la 0 la 9, în total 10 caractere);
unele caractere speciale (. , ; = < > # $ % + - * / " ' ( ) etc.) , a caror
semnificatie poate sa difere de la un limbaj la altul.
Pentru codificarea seturilor de caractere sunt u 515h71f tilizate urmatoarele standarde:
EBCDIC (Extended Binary Coded Decimal Interchenge Code), un cod pe 8
biti, introdus de IBM;
ASCII (American Standard Code for Information Interchange), introdus de
ANSI (American National Standard Institute), este un cod pe 7 biti si
permite codificarea a 128 de caractere (95 de caractere tiparibile si 33 de
caractere netiparibile, numite caractere de control). Ulterior, setul ASCII a
fost extins la o codificare pe 8 biti, fiind disponibile astfel 256 de caractere.
Primele 128 sunt din setul ASCII standard, iar urmatoarele 128 sunt coduri
de caractere tiparibile pentru caracterele unor alfabete nationale europene
(francez, spaniol, român etc.), o parte din literele alfabetului grecesc, unele
simboluri matematice , caractere speciale pentru desenat tabele etc.
Ordonarea caracterelor alfabetului se face pe baza codurilor numerice corespunzatoare caracterelor respective.
Pe baza caracterelor ce alcatuiesc alfabetul limbajului se alcatuiesc cuvintele care formeaza vocabularul limbajului si cu ajutorul carora se construiesc instructiunile limbajului. Exista doua categorii de cuvinte si anume:
1. cuvinte cheie - acestea au un înteles explicit într-un context precizat (de ex., in unele limbaje de programare cuvintele ce desemneaza instructiuni pot fi folosite si ca nume de variabile, neexistând restrictii; asemenea situatii nu sunt însa indicate deoarece pot ascunde erori în logica programului si îl fac mai greu de înteles);
2. cuvinte rezervate - acestea nu pot fi folosite decât în scopul pentru care au fost definite (de ex., în limbajul Visual Basic). Avantajele utilizarii acestei categorii de cuvinte sunt urmatoarele:
- programul devine mai usor de înteles;
- se mareste viteza de compilare (analiza lexicala, sintactica si semantica este mai
simpla la cautarea în tabele de simboluri);
- erorile sunt mai usor de depistat.
Pe de alta parte, în cadrul unui limbaj de programare se vor utiliza cuvinte ale limbajului (rezervate) si cuvinte definite de utilizator pentru a referi diverse elemente (variabile, fisiere, nume de proceduri, nume de functii, etc.).
si în cazul limbajelor de programare succesiunile de cuvinte construite dupa anumite reguli, formeaza propozitii, numite instructiuni. Sintaxa unui limbaj de programare reprezinta ansamblul de reguli prin care se determina daca o anumita instructiune este alcatuita corect sau nu. Sintaxa unui limbaj de programare poate fi descrisa în diverse moduri , unul dintre acestea fiind notatia BNF (Backus-Naur Form).
Notatia BNF (Backus-Naur Form) a fost utilizata prima data la descrierea sintaxei limbajului ALGOL (în cadrul raportului ALGOL60 aparut în 1963) si este numita dupa doi dintre autorii acestui raport. În cadrul BNF sunt folosite metasimboluri, simboluri terminale si simboluri neterminale.
Metasimboluri sunt simbolurile <, >, ˝ si ::= si ele fac parte din mecanismul de descriere a limbajului. Simbolul ˝ semnifica o alternativa, simbolul ::= inseamna "se defineste astfel".
Simbolurile terminale sunt cuvinte care apar acolo unde se specifica în productii (de ex., for, while, do, +, ; etc.).
Simbolurile neterminale sunt încadrate în < si > si sunt definite prin productii ale limbajului (de ex., <variabila>, <identificator>, <instructiune if> etc.).
Exemplu: n limbajul Visual Basic sintaxa unui identificator se descrie în BNF astfel: <identificator>::=<litera>˝<identificator><cifra>˝<identificator><litera>
unde
<litera>::=a˝b˝...˝z˝A˝B˝...˝Z
<cifra>::=0˝1˝2˝...˝9
Conform acestei productii, identificatorul are 3 definitii alternative: un identificator este fie o <litera>, fie un <identificator> urmat de o <cifra> sau o <litera> (definitie recursiva). Semnificatia acestei definitii este urmatoarea: un identificator poate sa contina o singura litera, sau o litera urmata de oricâte litere si/sau cifre. Conform acestei definitii, sunt corecte sintactic urmatorii identificatori: a, t1, sec12a1.
Descrierea sintaxei instructiunii conditionale IF.EndIf din limbajul Visual Basic în notatie BNF este:
<instructiune If>::= If < conditie > Then
< instructiuni 1 >
Else
< instructiuni 2 >
EndIf
2.2. Traducerea programelor (translatoare)
Translatorul este un program ce traduce un program sursa scris într-un anumit limbaj de programare întru-un program echivalent dintr-un alt limbaj, acest nou program numindu-se program destinatie.
Translatoarele se clasifica astfel:
- compilatoare - pentru acestea programul destinatie se numeste program obiect sau cod obiect, fiind apropiat de codul masinii;
- asambloare - sunt compilatoarele limbajelor de asamblare;
În aceste doua cazuri traducerea de obicei este urmata de editarea de legaturi, înainte de executia propriu-zisa a programului. În aceasta faza codul executabil se constituie prin legarea codului obiect rezultat din traducere cu alte module obiect (rezultate ale unor compilari anterioare sau cele existente în biblioteci).
- interpretoare - realizeaza executia instructiune cu instructiune a programului sursa.
- preprocesoare - traduc programe sursa din limbaje de nivel înalt în programe destinatie tot în limbaje de nivel înalt;
- cross-compilatoare sau cross-asambloare - genereaza pe un calculator "gazda" un cod obiect pentru un alt calculator-obiect (care, de ex., are memorie mica si nu poate implementa programul de traducere);
- compilatoare incrementale - combinatie compilator-interpretor, ce foloseste secvente din programul sursa cu o anumita independenta sintactica si semantica pentru a le executa interpretativ.
2.3. Analiza textului sursa a unui program
Analiza textului sursa consta din: analiza lexicala, analiza sintactica si analiza semantica
Analiza lexicala
Analiza lexicala realizeaza o prima parcurgere a programului sursa, considerat ca un sir de carctere si grupeaza aceste caractere în subsiruri numite atomi lexicali: cuvinte cheie sau rezervate, operatori, constante, identificatori, separatori. Operatiile pe care le realizeaza analizorul lexical sunt urmatoarele:
- detecteaza în programul sursa subsiruri ce respecta regulile de formare a
atomilor lexicali;
- clasifica aceste subsiruri (identifica clasa la care apartin aceste subsiruri);
- traduce subsirurile în atomi lexicali;
- memoreaza atomii în tabela de simboluri.
Analiza sintactica
În aceasta faza în sirul atomilor lexicali se identifica structuri sintactice: expresii, liste, instructiuni, proceduri etc. si se genereaza, în cazul în care sirul de intrare este corect sintactic, o descriere structurala a acestuia, semantic echivalenta - arborele sintactic (de derivare) sau, în caz contrar, un mesaj de eroare. Arborele sintactic descrie relatiile dintre structuri (separare, incluziune etc.).
Analiza semantica.
Analiza semantica foloseste arborele sintactic, creat în faza de analiza sintactica, pentru a extrage informatii privind aparitiile în programul sursa a obiectelor purtatoare de date (tipuri de date, variabile, proceduri, functii) si a verifica consistenta utilizarii lor. Odata cu parcurgerea arborelui sintactic are loc si generarea codului intermediar. Acesta reprezinta un sir de instructiuni simple, cu format fix, în care codurile operatiilor sunt asemanatoare cu codurile masina corespunzatoare, ordinea operatiilor respecta ordinea executiei (conform aparitiei lor în programul sursa) iar operanzii sunt reprezentati sub forma variabilelor din programul sursa (nu sub forma de registri sau adrese de memorie). În practica, analiza semantica se desfasoara în paralel cu cea sintactica, prin asocierea actiunilor analizorului sintactic cu actiuni referitoare la anumite structuri de date ce reprezinta atribute ale componentelor sintactice.
Generarea codului obiect
Generarea codului obiect presupune alocarea locatiilor de memorie si a registrilor unitatii centrale pentru variabilele programului si înlocuirea codurilor de operatii din codul intermediar cu cele masina.
Componente de baza (lexicala, sintactica, semantica) sunt asistate pe tot parcursul compilarii de urmatoarele doua module:
Modulul de tratare a erorilor - o colectie de proceduri care sunt activate ori de câte ori este detectata o eroare în timpul operatiilor de analiza. Dupa faza de analiza în care apar, erorile pot fi lexicale, sintactice sau de semantica. Procedurile de tratare a erorilor afiseaza mesaje de diagnostic relativ la eroare si iau decizii privind modul de continuare a traducerii (se continua , ignorând elementul ce contine eroare, se încearca corectarea erorii sau se intrerupe traducerea).
Modulul de gestiune a tabelelor - o coletie de proceduri care creaza si actualizeaza baza de date a compilatorului. Aceasta contine informatii proprii compilatorului (generate la implementare si constituite din mecanismele de descriere a analizei lexicale, sintactice si semantice) si informatii ce apartin programului sursa ce se traduce (identificatorii, constantele, cuvintele cheie), memorate în tabela de simboluri. Gestionarea tabelei de simboluri se face în functie de modul de reprezentare al acesteia, caracterul general al tabelei, tipul limbajului din care se traduce programul sursa, conventiile alese pentru reprezentarea atributelor în ea s.a. De obicei, în faza de analiza lexicala, la întâlnirea unui nume nou, acesta este întrodus în tabela de simboluri, retinându-se si adresa intrarii. Orice referire ulterioara la acest nume actualizeaza informatia din tabela corespunzatoare acestui nume, verificandu-se si consistenta utilizarii acestuia (în cadrul analizei semantice). La generarea codului, atributele numelui determina lungimea zonei de memorie alocata acestuia. Atributele numelui pot servi si în faza de tratare a erorilor
Probleme rezolvate
Alfabetul unui limbaj de programare este constituit din:
a) literele alfabetului limbii române
b) cifrele de la 0 la 9
c) literele alfabetului limbii engleze
d) semne speciale
e) cuvinte cheie
raspuns corect b), c), d)
Plecând de la alfabet se construiesc:
a) instructiunile limbajului
b) cuvintele limbajului
c) programe
d) vocabularul limbajului
raspuns corect d)
Vocabularul limbajului poate contine:
a) cuvinte rezervate
b) cuvinte utilizator
c) proceduri
d) cuvinte cheie
e) functii
f) expresii
raspuns corect a), b), d)
Analiza lexicala, sintactica si semantica a unui program sursa se realizeaza în faza:
a) de executie
b) de compilare
c) de editare de legaturi
d) de implementare
e) de scriere a programului.
O instructiune a limbajului este:
a) orice succesiune de cuvinte din vocabular
b) o succesiune de cuvinte din vocabular, construita dupa anumite reguli sintactice
c) orice propozitie din limba engleza
Notatia BNF este:
a) o metoda de reprezentare a unui program
b) o modalitate de descriere a sintaxei unui limbaj de programare
c) o metoda de descriere a unui algoritm
Enumerati principalele tipuri de translatoare si functiile acestora.
Un program scris într-un limbaj de programare se numeste:
a) program obiect
b) program sursa
c) program destinatie
d) program executabil
|