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

Slides:



Advertisements
Benzer bir sunumlar
Bölüm 11 Metin Dosyaları Metin Dosyaları Dosya Açma ve Kapama
Advertisements

STRİNG FONKSİYONLARI.
Soru1: 1’den 4’e kadar olan tamsayıları ekrana tek satırda görülecek şekilde yazdıran bir programı aşağıdaki metotları kullanarak yazınız. Bir printf ifadesi.
Bölüm 12 ÜST DÜZEY KONULAR Dinamik Bellek Ayırma Önişlemci
Makine Müh. & Jeoloji Müh.
SCANNER SINIFI ve KLAVYEDEN VERİ OKUNMASI
Nesnelerin Özellikleri. - Üye nesneler - friend belirtesi - Nesnelerin operatörlere yüklenmesi - this yerel (lokal) değişkeni - inline tanımlı üye fonksiyonlar.
Değişken , Veri Türleri ve Operatörler
JavaScript Birinci Hafta.
Bölüm 2 C Dilinin Temelleri
String Diziler(Katarlar)
C Programlama Diline Giriş
Atama ve Girdi/Çıktı Komutları
Soru1: kuvvet(taban,us) Şeklinde bir yinelenen fonksiyon yazın
Bölüm 9 Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri
Bölüm 9 Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri
String Kütüphanesindeki Arama Fonksiyonları
Bölüm 10 Yapılar ve Birleşimler
Bölüm 2 C Dilinin Temelleri Genel Kavramlar
Soru1: Dışardan "%s" format belirteci kullanılarak girilecek 20 elemanlı bir dizinin elemanlarının kaç tanesinin rakam, kaç tanesinin harf ve kaç tanesinin.
Derleyici Araçları FLEX & BISON
Erişim Denetimi, Fonksiyon
C ile Programlamaya Giriş
Paralel Programlamaya Giriş
FONKSİYONLAR.
Derleyici Teorisine Giriş
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
Algoritma & Programlama
Temel Giriş/Çıkış Fonksiyonları
Editörler Asli Ergün.
İNTERNET PROGRAMCILIĞI I BTP 207 Ders 8.  Tamsayı Değerler (Integer) Tamsayılar, 10 tabanlı (decimal), 8 tabanlı (octal) veya 16 tabanlı (hexadecimal)
STRING‘LER Karakter Kütüphanesi Fonksiyonları
Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri Dizgi Çıktı İşlemleri Dizgi Fonksiyonları Karakter Fonksiyonları Gösterge Dizgileri.
Değerler ve Değişkenler
Otomata Teorisinin Uygulama Alanları
Örnek Adam asmaca oyununun programının yazılması.
DÜZENLİ İFADELER Regular Expressions.
Bugünkü konular Programlama dilleri ve Syntax Generic C Program yapısı
Bu Günkü Konular If yapısı ve karşılaştırma operatörleri
Sözcüksel Çözümleme/Analiz (Lexical Analysis)
2. HAFTA 2. Hafta.
BISON (YACC) (Yet Another Compiler Compiler)
Bölüm 3 Atama ve Girdi/Çıktı Komutları Bölüm 3 Atama ve Girdi/Çıktı Komutları Atama Komutu Operatörler İsim Sabitleri Veri Tipi Dönüşümü Çıktı Fonksiyonu.
4. Hafta1 4. HAFTA. 4. Hafta2 Fonksiyonlar  Büyük problemler, küçük parçalara bölünerek kolay çözülür  Yazılımlar benzer modüller içerirler  Hata ayıklama.
BMS-301 Kabuk Programlama Güz 2015 (5. Sunu) (Yrd. Doç. Dr. Deniz Dal)
1 7. HAFTA. 2 Referanslar  Referanslar adres temsilcisidir  İşaretçilerin görevlerini kısmi olarak yapabilirler  Değişken değildirler.  Bellekte yer.
String Diziler(Katarlar)
Adım Adım Algoritma.
SAYISAL ANALİZ Doç.Dr. Cüneyt BAYILMIŞ.
BİLGİSAYAR programlama II
1 Değişken alanları Geçici değişkenler Birleşik ifadeler(bloklar) ve değişkenler Değişken Depolama Süresi ve Alanı –Local ve global değişkenler –Static.
BİLGİSAYAR PROGRAMLAMA Ders 6: Diziler Yrd. Doç. Dr. Altan MESUT Trakya Üniversitesi Bilgisayar Mühendisliği.
Bölüm 2 C Dilinin Temelleri Genel Kavramlar Yazım ve Noktalama Kuralları C Kütüphaneleri C Dilindeki Sözcükler Değer Sabitleri Veri Tipleri Değişkenler.
PHP ve HTML İnternet Programlama - 2. Koşullu İfadeler ve Döngüler Döngü ya da çevirim diyebileceğimiz, belli şart ve koşullarda istenilen değerleri yapabilmemizi.
Bölüm 3 Atama ve Girdi/Çıktı Komutları
C Programlama Dili Bilgisayar Mühendisliği.
Bilgisayar Programlamasına ve Veri Analizine Giriş - IV
BİLGİSAYAR PROGRAMLAMA Ders 10: Dosyalama İşlemleri
BÖLÜM 5 POINTER’LER (İŞARETÇİLER)
DİL ÇEVRİMİ Yüksek düzeyli bir dilde yazılmış bir program ancak makine diline çevrilerek bir bilgisayarda çalıştırılabilir.
Bölüm 9 Dizgiler Dizgi Tanımı Dizgi Girdi İşlemleri
Bölüm 2 C Dilinin Temelleri
ARDUİNO Arduino Eğitimleri Bölüm 3 Programlama Dili Temelleri
Bilgisayar Programlamasına ve Veri Analizine Giriş
YAPISAL PROGRAMLAMA Hafta-7
Bölüm 3 Atama ve Girdi/Çıktı Komutları
Bölüm 2 C Dilinin Temelleri
Bir Döngünün Bölümleri (hatırlatıcı)
C ile Programlamaya Giriş
Sunum transkripti:

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

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.

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.

flex ve bison İlişkisi

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

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.

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.

Ö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.

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.

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

Ö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.

Ö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.

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]*

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

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]+

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);

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);

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--5.4.3+d++5 output: abFLOATc-FLOATFLOAT+d+FLOAT

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>-7.800000<veli ali--07.8veli => ali->-7.800000<veli +3.7.5 => >3.700000<>0.500000<

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. 12 VELI X. HAMI BEY a HAMI BEY

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");

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.

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

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

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; }

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.

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