Rezumat: Acest curs examinează tabelele de simboluri. Rassmatrivayutsya câteva modalități de bază de tabele de simboluri în compilator: un identificator de tabel, tabele care introduc, arbori binari, precum și punerea în aplicare a structurii blocului. De asemenea, oferă exemple de cod de program și de tabele și identificatori de simboluri grafice de interpretare.
În acest proces, stochează informația despre programul de compilator obiecte în tabelul de caractere speciale. De regulă, informațiile de pe fiecare site este format din două elemente principale: numele și descrierea obiectului obiectului. Informații despre obiectele din program trebuie să fie organizate astfel încât să se găsească era cât mai curând posibil, iar memoria necesară cât mai puțin posibil.
În plus, cerințele suplimentare pentru organizarea de informații pot fi parte a limbajului de programare. Numele pot avea un anumit domeniu de aplicare. De exemplu, intrările de câmp trebuie să fie unic în cadrul structurii (sau structuri de nivel), dar poate fi diferită de numele obiectului este de înregistrare (sau un alt nivel de înregistrare). În același timp, un nume de câmp poate fi deschis pentru aderare de către operator, iar apoi acesta poate fi un conflict de nume (sau ambiguitate în interpretarea numelui). În cazul în care limba are o structură de bloc, este necesar să se prevadă o metodă pentru stocarea de informații, în scopul de a, în primul rând, mecanismul de vizibilitate bloc de sprijin, și în al doilea rând - în mod eficient memoria liberă la ieșirea blocului. În unele limbi (de exemplu, Ada), în același timp (într-un bloc) poate fi vazut mai multe obiecte cu același nume, în cealaltă, această situație este inacceptabilă.
Ne uităm la unele dintre modalitățile de bază de tabele de simboluri în compilator: un identificator de tabel, tabele care introduc, arbori binari, precum și punerea în aplicare a structurii blocului.
tabela de simboluri
După cum sa menționat deja, informații despre obiectul poate fi, de obicei, împărțită în două părți: un nume (ID) și descrierea. Dacă identificatorul este limitată la lungimea (sau denumirea identificată de către primul identificator la un număr limitat de caractere), tabelul de caractere pot fi aranjate ca o matrice simplă de rânduri de lungime fixă, așa cum se arată în Fig. 7.1. Unele intrări pot fi utilizate, unele - sunt gratuite.
Este clar că, în primul rând, dimensiunea matrice trebuie să fie mai mic decât numărul de identificare, care pot să apară într-adevăr în program (altfel revarsarilor de masă); în al doilea rând, de regulă, dimensiunea numărul potențial de identificatori distincte substanțial mai mare a mesei.
opțiune - ca prim identificator de caractere este introdus în lungime matrice.
tabelul de aliniere
Una dintre cele mai eficiente modalități de organizare a tabelei de simboluri este un aranjament de masă (sau tabel hash). Caută în acest tabel poate fi re-organizat de plasare. Esența ei este după cum urmează.
Tabelul simbol este un fix N. dimensiune array Identificatorii pot fi stocate atât în tabela de simboluri și un identificatori tabel separat.
Să presupunem că vrem să găsim în tabelul ID-ul ID. Dacă un element al tabelului cu numărul H1 (id) este gol, înseamnă că nu există nici un identificator în tabel. Dacă este ocupat, aceasta nu înseamnă că identificatorul ID-ul în tabel este listat ca (în general vorbind) o mulțime de identificatori pot avea aceeași funcție de aliniere valoare. Pentru a determina dacă suntem identificatorul corect găsit compara cu intrare id tabel H1 (id). Dacă acestea sunt egale - identificatorul este găsit, dacă nu - trebuie să continuăm să caute mai departe.
Pentru a continua căutarea, utilizați h3 următorul aranjament funcția (h2), h4 (h3) etc. De obicei, hi = h2 pentru funcția i> = 2. Argumentul h2 este un număr întreg în intervalul [0, N - 1] și poate fi aranjate diferit. Aici sunt trei opțiuni.
- h2 (i) = (i + 1) N. mod Luați următorul (ciclic) matrice. Această opțiune este rău, deoarece „grupate“ elemente ocupate. formează porțiuni succesive și angajate în cadrul acestui domeniu de cercetare devine esențial liniară.
- h2 (i) = (i + k) N. mod unde k și N sunt prime între ele. Practic este întruchiparea anterioară, dar elementele nu se acumulează în celule consecutive, și „răspândirea“.
- h2 (i) = (a * i + c) mod N - "secvență pseudoaleatoare". Aici, c și N trebuie să fie prime între ele, b = a-1 este un multiplu de p pentru orice prim p. este un divizor de N. b multiplu de 4. Dacă N este un multiplu de 4 [6].
tabel de căutare de plasare poate fi descrisă prin următoarea funcție:
Funcția IdComp (H, Id) compară un element de tabel la intrarea identificatorul H și generează 0 dacă acestea sunt egale. vida (H) generează NULL. în cazul în care intrarea H este goală. Funcția de căutare atribuie parametrii Da indicatorul și următoarele valori, respectiv:
fals, NULL - dacă identificator dorit nu este găsit, masa este nici un spațiu, și
false, P - dacă ID-ul necesar nu este găsit, dar tabela conține o intrare liberă P.
Element Introducerea poate fi efectuată următoarele funcții în tabel: