interpretacija programa leksi ka...
TRANSCRIPT
Interpretacija programaLeksička analiza
Krunoslav Puljić
Leksička analiza
• Prvi korak u radu jezičnog procesora– Prvi korak analize
• Leksički analizator:– Prima niz znakova izvornog programa– Vraća niz leksičkih jedinki
• Niz leksičkih jedinki se prosljeđuje sintaksnom analizatoru
• Ponekad se leksička i sintaksna analiza odvijaju zajedno
Zadaci leksičkog analizatora:
1. Slijedno čita tekst izvornog programa znak po znak2. Stvara učinkovit zapis znakova izvornog programa3. Odbacuje znakove koji se ne koriste u daljnjim
koracima4. Grupira znakove u leksičke jedinke5. Određuje klase leksičkim jedinkama6. Provjerava leksička pravila7. Pronalazi pogreške i određuje im mjesto u izvornom
programu8. Zapisuje parametre leksičkih jedinki u tablicu
znakova9. Čuva tekstualnu strukturu izvornog programa
1. Slijedno čitanje izvornog teksta
• Jedini korak koji izravno pristupa znakovima izvornog programa
• Koriste se ulazno izlazne naredbe nekog višeg programskog jezika– read, scanf, cin...
2. Stvaranje učinkovitog zapisa
• Kodiranje znakova izvornog programa– Npr. ASCII kod
• U leksičkoj analizi nije potrebno razlikovati sve znakove, nego samo grupe znakova– Jedinstveni kod definiramo za cijelu grupu znakova
• Primjer: ako su u nizu znakova isključivo znamenke, onda je leksička jedinka u klasi cjelobrojnih konstanti
3. Odbacivanje suvišnih znakova
• Odbacuju se znakovi koji se ne koriste u daljnjim fazama rada jezičnog procesora
• Izbacuju se npr.– Komentari– Znakovi koji određuju tekstualnu strukturu programa
• Bjeline• Tabulatori• Znak novog reda (LF)• Znak vraćanja na početak reda (CR)
4. Grupiranje znakova u leksičke jedinke
• Leksičke jedinke zapisuju se na dva načina:– Odvajanjem pomoću prekidnih znakova– Slobodnim zapisom
• Uz prekidne znakove postupak grupiranja je znatno pojednostavljen– Tijekom grupiranja traže se prekidni znakovi– Svi znakovi između dva susjedna prekidna znaka čine
leksičku jedinku– Prekidni znakovi su bjeline, operatori, interpunkcija, itd.
4. Grupiranje znakova u leksičke jedinke
• Slobodan način zapisa ne traži odvajanje jedinki prekidnim znakovima– Zato grupiranje nije moguće provesti na temelju pronalaženja
prekidnih znakova
• Algoritmi grupiranja i određivanja klasa ujedinjuju se u jedinstvenu cjelinu:– Čitanjem znak po znak nastoji se odrediti klasa leksičke jedinke– Ako je pročitanom nizu znakova moguće odrediti klasu, onda se niz
znakova grupira u leksičku jedinku– Ako nije moguće odrediti klasu, čita se idući znak– Čitanje znakova se nastavlja sve dok se niz znakova ne svrsta u
jednu od klasa
• Znakovi se ponekad mogu grupirati na više različitih načina, što uzrokuje nejednoznačnost
5. Određivanje klase leksičkim jedinkama
• Središnji algoritam leksičkog analizatora• Za sve klase leksičkih jedinki definiraju se
pravila koja određuju pripadnost niza znakova pojedinoj klasi
• Primjer: klasa identifikatora– ako su u nizu znakova slova i znamenke
• ako je krajnje lijevi znak slovo– onda je leksička jedinka u klasi identifikatora
• Primjena konačnih automata– Leksička pravila većine programskih jezika
omogućuju primjenu konačnih automata za razvrstavanje leksičkih jedinki u klase
6. Provjeravanje leksičkih pravila
• Leksički analizator provjerava da li leksička jedinka zadovoljava pravila klase u koju je svrstana
• Za opis pravila klasa koriste se regularni izrazi
7. Pronalaženje pogrešaka
• Ako nije moguće leksičku jedinku svrstati u jednu od klasa, leksički analizator ispisuje pogrešku– Određuje se mjesto pogreške u izvornom programu– Opisuje se pogreška
• Određivanje mjesta i opisa pogreške nije jednostavan postupak
8. Zapisivanje parametara u tablicu znakova
• Leksički analizator stvara zapise u tablici znakova za sve leksičke jedinke izvornog programa
• Tablica znakova je osnovna podatkovna struktura leksičkog analizatora– Tu se sprema leksička jedinka u obliku u kojem je
zapisana u izvornom programu– Spremaju se i razni parametri leksičkih jedinki
• Npr. tip konstante
9. Čuvanje tekstualne strukture izvornog programa
• Nakon leksičke analize nestaje tekstualna struktura izvornog programa– Izostavljene su bjeline, tabulatori, prijelazi u novi
redak, itd.
• Najjednostavniji način čuvanja tekstualne strukture jest brojanje znakova novog reda– Tako se određuje i redak izvornog programa u kojem
je nastala pogreška
• Danas je uobičajeno da se izvorni program u potpunosti sačuva i da se u njemu označe pogreške
Prilagodba zapisa znakova
• Prethodi leksičkoj analizi• Niz znakova izvornog programa prevodi se
iz standardnog koda (npr. ASCII) u kod koji je posebno prilagođen leksičkoj analizi
Primjer: Prilagodba zapisa znakova
A 41
B 42
... ...
Z 5A
00 01 (Slovo, A)
00 02 (Slovo, B)
... ...
00 1A (Slovo, Z)
0 30
1 31
... ...
9 39
* 2A
+ 2B
... ...
01 00 (Znamenka, 0)
01 01 (Znamenka, 1)
... ...
01 09 (Znamenka, 9)
02 0A (Operator, *)
02 0B (Operator, +)
... ...
Prilagodba zapisa
znakova
Znak ASCII Klasa Vrijednost Mnemonik
Osnovne klase leksičkih jedinki
• Leksičke jedinke – nizovi znakova izvornog programa
• Primjeri osnovnih klasa:– Ključne riječi
• Npr. ako, onda, inače
– Operatori• Zbrajanje, oduzimanje, množenje, dijeljenje
– Specijalni znakovi• Npr. zagrade, zarez, točka
– Identifikatori• Npr. imena varijabli, polja, potprograma
– Konstante• Npr. cjelobrojne, znakovne, tekstualne
Leksička jedinka
Klasa jedinke
Kodni znak
Mnemonik1 Kodni znak
Mnemonik2 PraviloReg.izr.
) Specijal ) (28) ) Z (5A) KROS )
; Specijal ; (3B) ; Z (5A) KROS ;
+ Operator + (2B) + Z (5A) KROS +
= Operator = (3D) = Z (5A) KROS =
345 Konstant B (42) KON B (42) KON brojka brojka*
23 Konstant B (42) KON B (42) KON
Cijena Identifik I (49) IDN I (49) IDN slovo (slovo + brojka)*Količina Identifik I (49) IDN I (49) IDN
ako Ključna a (61) ako Z (5A) KROS ako
onda Ključna o (6F) onda Z (5A) KROS onda
inače Ključna i (69) inače Z (5A) KROS inače
Osnovne klase leksičkih jedinki
• Leksički analizator generira niz leksičkih jedinki koje prosljeđuje sintaksnom analizatoru– Taj niz kodnih znakova naziva se niz uniformnih
znakova
• Postoje dva pristupa kodiranju uniformnih znakova– U prethodnoj tablici su označeni s Mnemonik1 i
Mnemonik2– Oba jednako kodiraju identifikatore i konstante– Razlikuju se po kodiranju ključnih riječi, operatora i
specijalnih znakova
Osnovne klase leksičkih jedinki
• Za potrebe sintaksne analize– Nije potrebno razlikovati pojedine identifikatore i
konstante• Zato leksički analizator odredi jednistveni kod uniformnog
znaka za konstante i posebno za identifikatore
– Jest potrebno razlikovati ključne riječi, operatore i specijalne znakove
• Zato leksički analizator uvodi:– Različite uniformne znakove za različite leksičke jedinke u tim
klasama – Mnemonik1– Isti uniformni znak (KROS) i kazaljku na tablicu znakova –
Mnemonik2
Primjer izvornog programaIzracunajCijenu()
{
ako (Kolicina >20)
Cijena = 1000;
inace
Cijena = 1200;
NovaCijena = Cijena;
}
CR LF TAB TAB Cijena = 1000 ;
• obratite pažnju na razmake
IzracunajCijenu ( ) CR LF { CR LF TAB ako ( Kolicina > 20 )
CR LF TAB inace
CR LF TAB TAB Cijena = 1200;
CR LF TAB NovaCijena = Cijena;
CR LF }
Mnemonik1IzracunajCijenu()
{
ako (Kolicina > 20)
Cijena = 1000;
inace
Cijena = 1200;
NovaCijena = Cijena;
}
IzracunajCijenu ( ) CR LF { CR LF TAB ako ( Kolicina > 20 )
49 28 29 7B 61 28 49 3E 42 29
I ( ) { a ( I > B )
IDN ( ) { ako ( IDN > KON )
...
Hex
ASC
Mn1
Mnemonik2IzracunajCijenu()
{
ako (Kolicina > 20)
Cijena = 1000;
inace
Cijena = 1200;
NovaCijena = Cijena;
}
IzracunajCijenu ( ) CR LF { CR LF TAB ako ( Kolicina > 20 )
49 60 5A 41 5A 42 5A 43 5A 00 5A 41 49 61
I Z A Z B Z C Z null Z A I a
IDN,I.C. KROS,( KROS,) KROS,{ KROS,ako KROS,( IDN,Kol.
...
Hex
ASC
Mn2
00 ako
01 onda
02 inace
... ...
20 >
21 =
... ...
40 ;
41 (
42 )
43 {
44 }
... ...
60 IzracunajCijenu
61 Kolicina
... ...
75 20
Tablica znakova
Pomak
Leksička jedinka
Podatkovna struktura L.A.
• Podatkovnu strukturu leksičkog analizatora čine:– Izvorni program– Tablica uniformnih znakova– Tablica znakova
• Tablica znakova se razlaže na:– Tablica identifikatora– Tablica konstanti– Tablica ključnih riječi, operatora i specijalnih
znakova
Tablica uniformnih znakova
• Osnovna tablica• Znakovi su zapisani onim redoslijedom
kojim su leksičke jedinke zadane u izvornom programu– Zato da bi poredak bio dostupan i ostalim
dijelovima jezičnog procesora koji nemaju pristup izvornom kodu
Podatkovna struktura L.A.
• Leksički analizator odredi klasu leksičke jedinke• Zapiše uniformni znak u tablicu uniformnih
znakova• Započne pretraživanje tablice znakova
– Ako je leksička jedinka identifikator, pretražuje se tablica identifikatora
• Ako je traženi identifikator već zapisan u tablici identifikatora onda se u tablicu uniformnih znakova zapisuje kazaljka koja pokazuje na mjesto pronađenog zapisa
• Ako traženi identifikator nije u tablici identifikatora, onda se stvara novi zapis te se u tablicu uniformnih znakova zapisuje kazaljka koja pokazuje na mjesto novostvorenog zapisa
Podatkovna struktura L.A.
• ...– Ako je leksička jedinka konstanta, pretražuje
se tablica konstanti• Rad s tablicom konstanti analogan je radu s
tablicom identifikatora• Ako imamo različite vrste konstanti, u tablicu
konstanti zapisuje se i podatak o vrsti konstante– Cjelobrojna, znakovna, tekstualna, itd.
Podatkovna struktura L.A.
• Tablice identifikatora i konstanti se mijenjaju tijekom rada jezičnog procesora
• Podaci u tablici ključnih riječi, operatora i specijalnih znakova se ne mijenjaju tijekom rada jezičnog procesora
Osnovne operacije nad tablicom znakova:
• Traženje zapisa• Dodavanje novog zapisa• Izbor postupka izrade tablice ovisi o
učestalosti operacija traženja i dodavanja– Linearna lista (vektor)– Uređena lista– Binarno stablo traženja– Raspršeno adresiranje (hash tablica)
Linearna lista (vektor)
• Najjednostavniji način gradnje tablice znakova• Pretraživanje – lista se pretražuje slijedno od kraja liste,
sve dok se ne pronađe traženi zapis ili dok se ne dođe do početka liste– Složenost je O(n) gdje je n duljina liste– Prosječno se pretraži (n+1)/2 zapisa
• Dodavanje zapisa – novi zapis se jednostavno ubaci na kraj liste– Složenost je O(1)
• Prednost: jednostavnost i brzina dodavanja zapisa• Nedostatak: sporost traženja zapisa
Uređena lista
• Linearna lista u kojoj su podaci sortirani• Pretraživanje – binarno
– Složenost je O(log2 n)• Dodavanje zapisa – novi zapis treba ubaciti na
pravo mjesto, pa se u prosjeku n/2 zapisa treba premjestiti– Složenost je O(n)
• Prednost: brzo traženje zapisa• Nedostatak: sporo dodavanje zapisa• Pogodna je za tablicu ključnih riječi, operatora i
specijalnih znakova koja se ne mijenja tijekom rada jezičnog procesora
Binarno stablo traženja
• U čvoru i su svi lijevo od njega manji, a svi desno su veći od i– Red Black Tree
• Prednost: brzo pretraživanje složenosti O(log2 n)• Nedostatak: skupo dodavanje zapisa uslijed
preslagivanja stabla– Bitno je da je visina stabla što manja– Želimo izbjeći da stablo izgleda poput uređene liste
Raspršeno adresiranje
• Poznato i kao Hash tablica– Podaci se spremaju u pretince tablice– Adresa pretinca se dobije kao vrijednost hash
funkcije koja leksičkoj jedinki pridružuje pretinac
– Postoje zatvoreno i otvoreno hash-iranje
• Dobar izbor hash funkcije u idealnom slučaju vodi na složenost O(1) i za pretraživanje i za dodavanje zapisa
Dinamika izvođenja L.A.
• Suradnja leksičkog i sintaksnog analizatora ostavaruje se na dva načina:– Putem poziva potprograma
• Leksički analizator je potprogram sintaksnog• Sintaksni analizator poziva leksički kada mu zatreba novi
uniformni znak• Leksički analizator čita znakove izvornog programa sve dok ne
odredi klasu leksičke jedinke, nakon čega sintaksnom analizatoru vraća uniformni znak
– Razmjenom čitave tablice uniformnih znakova• Leksički analizator je zasebni program koji generira cijelu
tablicu uniformnih znakova i pohrani je u datoteku, te završava s radom
• Sintaksni analizator se pokreće kasnije, te čita uniformne znakove iz datoteke
Literatura
• Siniša Srbljić: Jezični procesori 1 [JP1]• Siniša Srbljić: Jezični procesori 2 [JP2]