Vhod: program izvornega jezika
Izhod: zaporedje leksikalnih simbolov
Leksikalni simbol
Lastnosti:
- vrsta - različne funkcije (določene z izvornim jezikom): ime, konstanta, simbol, …
- znakovna predstavitev
- položaj v izvorni datoteki: št. vrstice + odmik v vrstici (npr. za izpis napak)
Primer leksikalnih simbolov v C programu
int main() { for (int i=0; i<10; i++) printf("%d\n", i+1); return 0; }Vzeti simboli:
int,main,(,),{,for, …,i,++, …,0,;,}
Leksikalni simboli:INT,ID(main),LeftParentesis,RightParentesis,LeftBrace,FOR, …Ključne besede imajo svoje simbole (npr.
FOR,RETURN), npr.maininprintfpa sta dogovora / konstrukta
Leksikalna analiza
Tipično ignorira/izpusti:
- belo besedilo (whitespaces) - presledki, tabulatorji, nove vrstice
- komentarje
Pravilo najdaljšega ujemanja: na vsakem koraku iz vhodnega niza vzame najdaljši možen ujemajoč leksikalni simbol
Obravnava napak:
- prekinemo analizo in vrnemo napako
- prenesemo napako naprej sintaksnemu analizatorju za ukrepanje/popravljanje napake
Numerične konstante so nepredznačene - + in - sta ločena leksikalna simbola
Implementacija
Regularni izrazi
Primeri:
- ime (spremenljivke/funkcije):
[a-zA-Z_][a-zA-Z0-9_]* - ključna beseda
for:for - belo besedilo:
[␣\t\n]+ - cela števila:
[+-]?[0-9]+
Končni avtomati
Implementacija regularnih izrazov:
- Posamično:

- Nedeterministični končni avtomat:

- Deterministični končni avtomat:

Leksikalna orodja
Podamo opis želenega leksikalnega analizatorja, ki ga orodje generira-implementira
Primeri: ANTLR (Java), LEX/JAX (C/…)