Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

flex Sözcüksel Analiz İçin Bir Araç

Benzer bir sunumlar


... konulu sunumlar: "flex Sözcüksel Analiz İçin Bir Araç"— Sunum transkripti:

1 flex Sözcüksel Analiz İçin Bir Araç

2 Sözcüksel ve Sözdizimsel Analiz
Sözcüksel Analizci (Lexer) Sözdizimsel Analizci (Parser) Girdi Akımı Token Akımı Parse Ağacı Sözcüksel Analizci (Lexical Analyzer - Lexer): Girdi akımını tarayarak karakter dizisini token’lara çevirir. flex bu amaçla kullanılan bir araçtır. Sözdizimsel Analizci (Syntax Analyzer – Parser): Token’ları okuyarak, dilin gramer kurallarına göre onları dil yapılarına çevirir. bison bu amaçla kullanılan bir araçtır.

3 Giriş flex: Düzgün ifade koleksiyonlarını okuyarak, onları sözcüksel analiz yapacak C veya C++ programlarını yazmada kullanır. bison: flex programının çıktısını kullanır ve bu çıktıyı dilin düzgün ifade kurallarını kullanarak parse etmeye (ayrıştırmaya) çalışır.

4 flex ve bison İlişkisi

5 flex flex ile bir takım düzenli ifadeleri ve her birine karşılık gelen aksiyonları tanımlarız. Bir flex programın kabaca içeriği: %{ Global C, C++ değişkenleri Kütüphane ekleme işlemleri %} Tanımlar %% Düzgün ifadeler ve ilişkili aksiyonlar (kurallar) C, C++ ana (main) programı ve diğer fonksiyonlar

6 Kolay Bir flex Programı (ornek0.lex)
(emacs, vi, nano vb. editörler ile oluşturulabilir.) %{ #include <stdio.h> /* printf icin gerekli */ %} %% .|\n printf("%s",yytext); $ flex ornek0.lex $ gcc -o ornek0.x lex.yy.c –lfl $ ls ornek0.x ornek0.lex lex.yy.c Flex, uyuşan token değerini (lexeme) yytext değişkeni içinde tutar.

7 Kolay Bir flex Programı (ornek0.lex)
test0.txt isimli giriş dosyasının içeriği şöyle olsun: ali Veli $ ./ornek0.x < test0.txt Giriş dosyasının içeriğini aynen geri döndürür.

8 Örnek flex Programı (ornek1.lex)
%% zippy printf("I RECOGNIZED ZIPPY"); test1.txt isimli giriş dosyasının içeriği şöyle olsun: zippy ali zip veli and zippy here zipzippy ZIP $ ./ornek1.x < test1.txt I RECOGNIZED ZIPPY veli and I RECOGNIZED ZIPPY here zipI RECOGNIZED ZIPPY Herhangi bir kuralla eşleşmeyen karakter dizisi grubu için varsayılan kural bu lexeme değerini standart çıktı olan ekrana yönlendirmektir.

9 flex en uzun düzgün ifadeyi bulur.
ornek2.lex %% zip printf("ZIP"); zippy printf("ZIPPY"); $ ./ornek2.x < test1.txt ZIPPY ali ZIP veli and ZIPPY here ZIPZIPPY ZIP flex en uzun düzgün ifadeyi bulur.

10 ornek3.lex %% monday|tuesday|wednesday|thursday|friday|
saturday|sunday printf("<%s is a day.>",yytext); test3.txt şöyle olsun: today is wednesday september 27 $ ./ornek3.x < test3.txt today is <wednesday is a day.> september 27

11 Örüntü Tasarımı . Enter (new line) dışında her türlü karakteri karşılar (matches). * Öncesindeki düzgün ifadenin 0 veya daha fazla tekrarlarını karşılar. + Öncesindeki düzgün ifadenin 1 veya daha fazla tekrarlarını karşılar. ? Öncesindeki düzgün ifadenin 0 veya 1 kopyasını karşılar. | Veya – arkasındaki veya önündeki örüntüyü karşılar. ^ Satırın başını karşılar. $ Satırın sonunu karşılar. / Öncesi ve sonrasındaki ifade varsa, önceki ifadeyi karşılar.

12 Örüntü Tasarımı [ ] Braketler içindeki herhangi bir karakteri karşılar. İlk karakter ^ ise, braketler dışındaki her türlü karakteri karşılar. Aralık belirtimi için - kullanılabilir. " " Tırnaklar içinde ne varsa onu karşılar. ( ) Grup içini karşılar. {} İçindekileri (değişken kombinasyonları) karşılar.

13 flex deki Düzgün İfadeler
a matches (karşılar) a abc matches abc [abc] matches a, b veya c [a-f] matches a, b, c, d, e, veya f [0-9] matches herhangi bir rakam X+ matches 1 veya daha fazla X X* matches 0 veya daha fazla X [0-9]+ matches herhangi bir sayı (…) gruplama demektir | veya demektir (a|b|c)* eşittir [a-c]*

14 flex deki Düzgün İfadeler
X? X opsiyonel (0 veya 1 oluşum) if(def)? matches if veya ifdef (eşittir if|ifdef) [A-Za-z] matches herhangi bir alfabe karakteri . matches enter dışındaki her türlü karakter \. matches . (nokta) karakteri \n matches enter (new line) \t matches tab \\ matches \ (ters bölü) karakteri [ \t] matches ya boşluk ya da tab [^a-d] matches a,b,c,d dışındaki her karakter

15 Düzgün İfade Örnekleri
Reel sayılar, örn., 0. 27, 2.10, .17 [0-9]*(\.)?[0-9]+ Opsiyonel işaret karakteri eklemek için: [+-]?[0-9]*(\.)?[0-9]+

16 Biraz Daha Kompleks Bir Program (ornek4.lex)
%% [\t ]+ ; /* hicbirsey yapma */ monday|tuesday|wednesday|thursday|friday| saturday|sunday printf("%s is a day.",yytext); [a-zA-Z]+ printf("<%s is not a day.>",yytext);

17 ornek5.lex %% [\t ]+ ; /* hicbirsey yapma */
Monday|Tuesday|Wednesday|Thursday|Friday printf("%s is a week day.",yytext); Saturday|Sunday printf("%s is a weekend.",yytext); [a-zA-Z]+ printf("%s is not a day.",yytext);

18 Tanımlar Kısmının Kullanımı
%% [+-]?[0-9]*(\.)?[0-9]+ printf("FLOAT"); Bunu şöyle de yazabiliriz: (digit tanımlaması yaparak) digit [0-9] [+-]?{digit}*(\.)?{digit}+ printf("FLOAT"); input: ab7.3c d++5 output: abFLOATc-FLOATFLOAT+d+FLOAT

19 Değişken Deklarasyonu
%{ #include <stdlib.h> /* atof icin gerekli */ float val; %} digit [0-9] sign [+-] %% {sign}?{digit}*(\.)?{digit}+ {val=atof(yytext); printf(">%f<",val);} Input => Output ali-7.8veli => ali> <veli ali--07.8veli => ali-> <veli => > <> <

20 Başka Bir Örnek /* buyukharflerdenolusankelimeleriekranabas */ %%
[A-Z]+[ \t\n\.\,] printf("%s",yytext); . ; /* hicbirsey yapma */ flex, büyük harflerden oluşan sonrasında da boşluk, tab, enter, nokta veya virgülden oluşan kelimeleri ekrana basar. Input Output Ali VELI A7, X VELI X. HAMI BEY a HAMI BEY

21 Tanım İçinde Tanım Kullanımı
alphabetic [A-Za-z] digit [0-9] alphanumeric ({alphabetic}|{digit}) %% {alphabetic}{alphanumeric}* printf("Değişken"); \, printf("Virgül"); \{ printf("Sol süslü parantez"); \:\= printf("Atama");

22 Kullanıcı Kodları Bölümü
Bu bölümde istediğiniz C, C++ kodunu kullanabilirsiniz. Tek gereken satır: int main(){yylex();return 0;} flex yylex() fonksiyonunu kendisi oluşturur ve sizin için bütün işi yapar. Buradaki fonksiyonlar kurallar bölümünde çağrılabilir.

23 Kural Sırası Birden fazla düzgün ifade input dosyasında bir kelime karşılarsa, ilk tanımlanan kural kullanılır. %% for printf("FOR"); [a-z]+ printf("IDENTIFIER"); Aşağıdaki input için for count := 1 to 10 output şöyle olur: FOR IDENTIFIER := 1 IDENTIFIER 10

24 Kural Sırası Eğer sırayı değiştirirsek [a-z]+ printf("IDENTIFIER");
%% [a-z]+ printf("IDENTIFIER"); for printf("FOR"); Aynı input için output: IDENTIFIER IDENTIFIER := 1 IDENTIFIER 10

25 Sayı Tanıma (ornek6.lex)
%% [\t ]+ ; /* Boşlukları gözardı et*/ [+-]?[0-9]*(\.)?[0-9]+ printf(" %s:number",yytext); [a-zA-Z]+ printf(" %s:NOT number",yytext); int main() { yylex(); return 0; }

26 Kelimeleri Sayma (ornek7.lex)
%{ int char_count=0; int word_count=0; int line_count=0; %} word [^ \t\n]+ eol \n %% {word} {word_count++; char_count+=yyleng;} {eol} {char_count++; line_count++;} char_count++; int main() { yylex(); printf("line_count = %d , word_count = %d, char_count = %d\n", line_count, word_count, char_count); return 0; } yyleng match edilen karakter sayısını verir.

27 Kelimeleri Sayma (Devam)
test7.txt şöyle olsun: how many words and how many lines are there in this file $ ./ornek7.x < test7.txt line_count = 5, word_count = 12,char_count = 58


"flex Sözcüksel Analiz İçin Bir Araç" indir ppt

Benzer bir sunumlar


Google Reklamları