Professional Documents
Culture Documents
PP2 Skener
PP2 Skener
2/42
Skener
ulazni if (a > b)
tekst a = a – 1;
if (a > b)\n\ta = a – 1;
simboli
3/42
Skener
string simbola = leksema (lexeme)
klasa simbola = token (token)
u srpskom jeziku:
imenice
glagoli
...
u programskom jeziku:
identifikatori (imena)
ključne reči
brojevi
zagrade
...
Klasa simbola odgovara skupu stringova
4/42
Skener
Klasa simbola odgovara skupu stringova
identifikator:
stringovi koji počinju slovom iza kojeg sledi slovo ili cifra
A, a, abc, a2b, ...
broj:
neprazan string cifara
0, 125, 12345, 001
ključna reč:
„if“, „else“, „while“, …
belina:
neprazna sekvenca praznih mesta, tabulatora i novog reda
if___(a > b)
5/42
Skener
6/42
Zadatak
Za sledeći deo koda, izaberite tačan broj tokena za svaku klasu
koja se pojavljuje u kodu:
1) W = 9; K = 1; I = 3; N = 2; O = 9
2) W = 11; K = 4; I = 0; N = 2; O = 9
3) W = 9; K = 4; I = 0; N = 3; O = 9
4) W = 11; K = 1; I = 3; N = 3; O = 9
W: Whitespace N: Number
K: Keyword O: Other Tokens:
I: Identifier { } ( ) < ++ ; =
7/42
Skener
mogući problemi
PL/I – ključne reči nisu rezervisane reči
IF ELSE THEN THEN = ELSE; ELSE ELSE = THEN
C++
templejt
• Foo<Bar>
stream input operator
• cin >> var;
ugnježdeni templejti
• Foo<Bar<Bazz>>
• Foo<Bar<Bazz> >
8/42
Skener
Cilj skenera je da:
podeli ulazni tekst na lekseme
identifikuje token svake lekseme
Skener
čita ulazni tekst s leva na desno
prepoznaje po jedan simbol
Neki skeneri prepoznaju još jedan token unapred
lookahead token
9/42
Skener – dijagram prelaza
Sistematičan način prepoznavanja simbola
Generalni – opšti skener:
preuzme opis simbola i na osnovu njega
prepoznaje i klasifikuje simbole
Opisivanje simbola
gramatika simbola (patterns)
word, capital_word, dot
gramatika se može prikazati u grafičkom obliku
dijagram prelaza (transition diagram)
daje osnovu za sistematičan način prepoznavanja
simbola
10/42
Skener – dijagram prelaza
Dijagram prelaza zahteva uvođenje stanja skenera
polazno stanje
po jedno završno stanje za svaki prepoznati simbol
za simbole sastavljene od jednog znaka
pojava tog znaka prevodi skener iz polaznog u završno
stanje
za simbole sastavljene od više znakova
pojava prvog znaka prevodi skener iz polaznog u prvo
međustanje
pojava svakog narednog znaka prevodi skener u
sledeće međustanje, kada ima više međustanja
ako pravilo formiranja simbola dozvoljava ponavljanje
pojedinih znakova, tada nakon njihove pojave skener
ostaje u zatečenom međustanju
11/42
Skener – dijagram prelaza
Dijagram prelaza je usmereni graf u čiji sastav ulaze:
čvorovi koji predstavljaju stanja skenera
jedan od ovih čvorova je polazni, a
više njih mogu biti završni čvorovi
usmerene spojnice između čvorova
ukazuju na moguće prelaske iz jednog u drugo stanje
labele usmerenih spojnica
svaka labela odgovara skupu znakova
podrazumeva se da spojnice koje kreću iz istog čvora
imaju različite labele
• ovo ograničenje obezbeđuje jednoznačnost
prelazaka
znakovi od kojih se mogu obrazovati labele
12/42
Skener – dijagram prelaza
dot → "."
capital_word → capital_letter {small_letter}
word → small_letter {small_letter}
14/42
Skener – dijagram prelaza
dot → "."
capital_word → capital_letter {small_letter}
word → small_letter {small_letter}
15/42
Skener – dijagram prelaza
Podrazumeva se da početno stanje skenera odgovara
početnom čvoru
Kada se ne nalazi u završnom stanju:
skener preuzima znak i
proverava da li on odgovara nekoj labeli koja izlazi iz
trenutnog čvora
ako ogovara
skener prelazi u stanje određeno čvorom na koga
ukazuje dotična spojnica
ako ne ogovara
tada je otkrivena leksička greška
16/42
Skener – dijagram prelaza
Kada dospe u stanje koje odgovara završnom čvoru
skener je prepoznao simbol i može da ponovo pređe u
početno stanje (reset)
u nekim od završnih stanja skener mora da vrati
poslednje preuzeti znak, ako on ne pripada
prepoznatom simbolu, jer tada on pripada sledećem
simbolu
na primer, ako iza znaka < ne sledi znak =, reč je o
relacionom operatoru manje, pa znak iza znaka < ne
pripada tom nego sledećem simbolu
17/42
Skener – tabela prelaza
Dijagram prelaza može biti prikazan i u obliku tabele prelaza
Tabela prelaza određuje akciju skenera na pojavu nekog znaka
u zadanom stanju
Redove tabele prelaza označavaju redni brojevi polaznog
stanja i međustanja, a njene kolone označavaju znakovi
Svaki element tabele prelaza sadrži ili redni broj stanja u koje
skener prelazi nakon pojave odgovarajućeg znaka ili crticu kao
oznaku da u datom stanju nije predviđena pojava
odgovarajućeg znaka
18/42
Skener - deterministički konačni automat
Dijagram/tabela prelaza definiše deterministički konačni
automat (deterministic finite automata, DFA)
koji ima unapred zadan konačan broj stanja i
konačan broj jednoznačnih prelaza između ovih stanja
Skener može imati oblik funkcije koja simulira takav automat
Da bi ovakav skener prepoznao simbole konkretne gramatike
simbola on mora imati na raspolaganju odgovarajuću tabelu
prelaza:
19/42
Skener – regularni izrazi
dot → "."
capital_word → capital_letter {small_letter}
word → small_letter {small_letter}
20/42
Skener – regularni izrazi
Tabela prelaza se može definisati gramatikom simbola
za ovu svrhu se koriste regularne gramatike
njihova pravila imaju oblik regularnih definicija
ime vrste simbola i
opis simbola u formi regularnog izraza
• regular expression, regex, regexp:
ime → regularni izraz
21/42
Skener – regularni izrazi
Oblikovanje regularnih izraza
22/42
Skener – regularni izrazi
znak * označava da se njemu prethodeći regularni izraz
navodi nijednom, jednom ili više puta
regularnom izrazu abc*
odgovaraju stringovi "ab", "abc", "abcc", "abccc", …
24/42
Skener – regularni izrazi
uglaste zagrade omogućuju navođenje klase znakova
regularni izraz [0123456789]
odgovara regularnom izrazu (0|1|2|3|4|5|6|7|8|9),
znači svakoj od pojedinačnih cifara
25/42
Skener – regularni izrazi
znak . označava bilo koji znak osim znaka za novi red
regularnom izrazu .*
odgovaraju svi mogući stringovi koji mogu da se pojave
u jednom redu, uključujući i prazan red
26/42
Skener – regularni izrazi
Primeri regularnih izraza
regularni izraz [0-9]+
opisuje prirodne brojeve i nulu
regularni izraz -?[0-9]+
opisuje cele brojeve
regularni izraz [01]+
opisuje binarne brojeve
27/42
Skener – regularni izrazi
Primeri regularnih izraza
regularni izraz [a-cA-C]+
„accAAca“, „a“, „AACC“
regularni izraz [a-c A-C]+
„accAAca“, „a“, „AACC“, “A C“, „ ”
ukrštene reči
primeri preuzeti sa sajta: regexcrossword.com
28/42
Ukrštene reči sa regularnim izrazima
29/42
Ukrštene reči sa regularnim izrazima
30/42
Ukrštene reči sa regularnim izrazima
31/42
Ukrštene reči sa regularnim izrazima
32/42
Ukrštene reči sa regularnim izrazima
33/42
Skener – generator skenera
Pomoću regularnih izraza se mogu opisati simboli,
a to je dovoljno za automatsko generisanje tabele prelaza
Generator tabele prelaza određuje ponašanje skenera
pa se zove i generator skenera
Primeri generatora skenera su:
Lex (Lex)
Flex (Fast Lexical Analyzer)
34/42
Skener - Flex
35/42
Skener - Flex
Izgled Flex izvornog programa (Lex specifikacije)
36/42
Skener - Flex
Flex generiše skener u obliku C funkcije yylex():
int yylex(void);
Funkcija yylex()
se pravi na osnovu regularnih izraza i njima pridruženih
akcija
smešta se u izlaznu datoteku lex.yy.c
zajedno sa neizmenjenim prvim i trećim delom
specifikacije (definicijama C konstanti, C promenljivih i
pomoćnih C funkcija)
Za Flex znakovi < i > imaju posebno značenje
pa se moraju koristiti između navodnika ("<" i ">") kada se
koriste kao obični znakovi
Flex zahteva definiciju funkcije yywrap() koja opisuje
ponašanje skenera kada naiđe na EOF znak
37/42
Skener - Flex
Kako radi skener, odnosno funkcija yylex():
ponavlja prepoznavanje simbola i
izvršava zadane akcije
sve dok se u okviru akcija ne izvrši return iskaz
tada sledi povratak iz ove funkcije
automatski povratak iz ove funkcije:
kada naiđe znak za kraj datoteke EOF
u tom slučaju povratna vrednost funkcije je 0
38/42
Skener - Flex
Flex definiše i globalne promenljive:
40/42
Skener - Flex
Funkcija yylex() pronalazi:
najduži string koji odgovara nekom regularnom izrazu
ako pronađeni string odgovara nekolicini regularnih
izraza
<= treba da se prepozna kao manje ili jednako, a ne kao
manje pa jednako
pripisuje ga prvonađenom regularnom izrazu
rezervisana reč if treba da se prepozna kao
rezervisana reč, a ne kao identifikator
zato regularni izraz if prethodi regularnom izrazu
identifikatora [a-zA-Z][a-zA-Z0-9]*
41/42
Skener – Flex - primeri
zbirka zadataka flex&bison
zero skener
bez ijednog pravila
njam skener
sa jednim pravilom
ws skener
proizvoljno dugačke beline skraćuje na 1 prazno mesto
wclc skener
broji karaktere, reči i rečenice
42/42