Lex ukratko Uvod Lex je alat za izgradnju

  • Slides: 17
Download presentation
Lex – ukratko

Lex – ukratko

Uvod • Lex je alat za izgradnju skenera ili leksičkog analizatora • Dizajnirali ga

Uvod • Lex je alat za izgradnju skenera ili leksičkog analizatora • Dizajnirali ga Lesk i Schmit (1975) • Poboljšana verzija FLex, Poaxon • Lex radi: – – Na osnovu specifikacije generiše NKA prevodi u ekvivalentan DKA Minimizuje broj stanja u DKA Generiše kod u jeziku C koji implementira automat

Kako Lex radi? § • • Specifikacija skenera u Lex-u • • Regularni izrazi

Kako Lex radi? § • • Specifikacija skenera u Lex-u • • Regularni izrazi za tokene C kod za akcije Fajl sa specifikacijom ima ekstenziju. l Lex generiše fajl lex. yy. c koji sadrži izvorni kod skenera Fajl lex. yy. c definiše funkciju yylex() koja prepoznaje jedan token Potrebno je kompajlirati lex. yy. c i linkovati sa lex bibliotekom

Kako Lex radi? § Prethodno nabrojani koraci su 1. flex my. File. l /*kreira

Kako Lex radi? § Prethodno nabrojani koraci su 1. flex my. File. l /*kreira lex. yy. c sa C kodom za skener*/ 2. gcc –o skener lex. yy. c –lfl /*kompajlira skener, linkuje sa (f)lex bibliotekom*/ 3. skener /*pokreće skener*/

Tokeni § § Identifikator možemo da predstavimo regularnim izrazom (letter)(letter|digit)* Odgovarajući DKA je start:

Tokeni § § Identifikator možemo da predstavimo regularnim izrazom (letter)(letter|digit)* Odgovarajući DKA je start: goto state 0: read c if c = letter goto state 1 goto state 0 state 1: read c if c = letter goto state 1 if c = digit goto state 1 goto state 2: accept string

Tokeni § § Identifikator možemo da predstavimo regularnim izrazom (letter)(letter|digit)* Odgovarajući DKA je start:

Tokeni § § Identifikator možemo da predstavimo regularnim izrazom (letter)(letter|digit)* Odgovarajući DKA je start: goto state 0: read c if c = letter goto state 1 goto state 0 state 1: read c if c = letter goto state 1 if c = digit goto state 1 goto state 2: accept string

Ulazni fajl za Lex • Ulazni. l fajl je organizovan na sledeći način %{

Ulazni fajl za Lex • Ulazni. l fajl je organizovan na sledeći način %{ Deklaracije %} Definicije %% Pravila %% Korisnički definisane funkcije

Sekcija Deklaracije • • • Sekcija je opciona Sadrži obični C kod koji se

Sekcija Deklaracije • • • Sekcija je opciona Sadrži obični C kod koji se kopira u izlazni lex. yy. c fajl Na primjer %{ int i=0, j=0, k=0; %}

Sekcija Definicije • • Sekcija je opciona Definicije su oblika ime definicija ime je

Sekcija Definicije • • Sekcija je opciona Definicije su oblika ime definicija ime je riječ koja počinje sa slovom ili _, posle čega slijedi nula ili više slova, cifara, _ ili -. definicija počinje sa prvim ne-bjelina karakterom iza imena i završava se na kraju linije

Sekcija Definicije • • Definicija se u sekciji za pravila referencira sa {ime}, što

Sekcija Definicije • • Definicija se u sekciji za pravila referencira sa {ime}, što se transformiše u (definicija) Primjer … CIFRA [0 -9] … %% … {CIFRA}+". "{CIFRA}* … = ([0 -9])+". "([0 -9])*

Sekcija Pravila • • Sekcija je obavezna Pravila su oblika šablon akcije • •

Sekcija Pravila • • Sekcija je obavezna Pravila su oblika šablon akcije • • Ideja: kad god skener učita sekvencu sa ulaza koja odgovara šablonu, izvršava akcije Prije šablona ne smije da postoje bjeline, a akcije moraju da počnu u istom redu

Sekcija Pravila • • akcije mogu da budu pojedinačne C komande, ili grupa komadni

Sekcija Pravila • • akcije mogu da budu pojedinačne C komande, ili grupa komadni između {}; ako nije specifikovana nijedna akcija prepoznati token se ignoriše Primjer %% [ t]+ putchar( ’ ’ ); [ t]+$ /*ignoriše bjeline na kraju linije*/

Sekcija Pravila • šabloni se zapisuju pomoću proširenog skupa regularnih izraza

Sekcija Pravila • šabloni se zapisuju pomoću proširenog skupa regularnih izraza

Regularni izraz Sekcija Pravila Komentar [0 -9] Klasa karaktera, označava 0|1|2|3|4|5|6|7|8|9. Moguće je specifikovati

Regularni izraz Sekcija Pravila Komentar [0 -9] Klasa karaktera, označava 0|1|2|3|4|5|6|7|8|9. Moguće je specifikovati više od jednog opsega, npr. [0 -9 a-z], kao i pojedinačne karaktere, npr. [aeiou 0 -9] ^ Negirana klasa karaktera, complement specifikovanog skupa karaktera, npr. [^0 -9] preklapa sve karaktere koji nijesu cifre . Proizvoljan karakter osim n x? Označava 0 ili 1 pojavljivanje x x+ Označava da se x pojavljuje 1 ili više puta; ekvivalentno sa xx* x{m, n} Označava da se x pojavljuje između m i n puta. &x Preklapa x ali samo na početku linije x$ Preklapa x ali samo na kraju linije ab/cd Preklapa ab ali samo ako posle slijedi cd “x” Preklapa x kao tekstualni karakter, npr. “x*” preklapa x za kojim slijedi *. Specijalno značenje pojedinačnog karaktera može da se isključi ako je ispred karaktera , npr. . označava tačku {ime} Zamjenjuje sa ranije definisanim šablonom ime.

Sekcija Pravila • primjer

Sekcija Pravila • primjer

Prepoznavanje ulaza • • • Skener u ulazu traži string koji odgovara nekom šablonu

Prepoznavanje ulaza • • • Skener u ulazu traži string koji odgovara nekom šablonu Preklapa se najduži string Ako je moguće preklapanje dva ili više stringa iste dužine, preklapanje se ostvaruje po pravilu koje je prvo navedeno Prepoznati token je dostupan preko globalnog pokazivača yytext, a njegova dužina preko globalnog integera yyleng. Ukoliko nema poklapanja: tekući karakter sa ulaza se kopira na izlaz

Globalne promjenljive u Lex-u • • • yytext string koji sadrži tekuću leksimu yyleng

Globalne promjenljive u Lex-u • • • yytext string koji sadrži tekuću leksimu yyleng dužina leksime iz yytext yylval vrijednost leksime yylloc čuva lokaciju tokena yyin ulazna datoteka