Kayıtlar

3. Hafta

Giriş Bu hafta, değişkenlerin tutulması olayını çözdüm. Artık değişkenleri bir hash table da tutuyorum. Değişkenlerin genel tipinde de ilerledim. Dili Türkçe programlama dili yapmaya karar verdim. Gramer üzerine bir kaç denemem oldu. Her an karar vermem gereken tasarım sorunlarının ortaya çıkacağını fark ettim. Değişken Tipi Genel değişken tipi, bir union ve bir type dan oluşan bir struct. Bu versiyon 1. Daha kullanıcı tanımlı veri tiplerini , yada herhangi bir fonksiyonu içinde tutamıyor. struct value_t{ int type; union{ char* sval; double dval; int ival; } } Yukarıdaki yapıdaki en güzel kısım oradaki union. Union C'de özel bir yapı. İçerisindeki en büyük veri tipi kadar yer kaplıyor. Yani yukarıdaki union 8 byte yer kaplayacak. Aynı verileri olan bir struct 20 byte(alignment hariç) yer kaplayacaktı. Ve bu unionlardan ,doğal olarak, bir seferde sadece bir veri okunabiliyor.  int type  objenin tipini tutacak. Tipi de şöyle tanımladım şimdilik; en...

Değişkenlerin Tutulması Sorunsalı

Giriş Bisondaki yystype değişkeni anladım. Bir kaç örnektede kullanabildim. Gramer dosyasındaki kurallarda   $$ = $1 + $2; gibi action ifadelerindeki değişken tipinin neleri nasıl etkilediği de anladım. (Biraz geç oldu ama) Değişkenleri tutmak için bir yer bulmaya çalıştım ve orada kaldım. Değişkenlerin Tutulması Yazdığım her hesap makinesinde tanımlanan değişkenler ya tek harf ve dizide ya da çok harfli bir listede tutuyordum. Yani yaptığım örneklerde öyleydi. Tek harf kullanılan durumlarda, kullanıcı sadece a = 5  b = 6 gibi değişkenler tanımlayabiliyordu. Bunları bir dizide (genelde 26'lık) tam sayıya çevirerek tutuyordum. int table[26]; Ve lex dosyasında da onu Bisonun değer stackine şöyle gönderiyordum. [a-z] {yylval = yytext[0]-'a'; return NAME;} Ya da bir linked list oluşturup, değişkenleri onun içinde saklıyordum. Listedeki değişkene bakmam gerektiğinde algoritma O(n) de çalışıyordu. Programdaki değişken sayısı arttıkça bu algoritma ve veri yapısı...

Bir kaç günün özeti

Son bir kaç gündür. Flex ve Bison ile alakalı örnekler bulup onları çözdüm. Örnekleri kendimce geliştirmeye çalıştım. Yaptığım çalışmaları gün gün klasörledim. Yazdığım kodları o günün klasörüne koydum. Biraz önce artık bir şeyler de yazayım diyip ne yaptığıma bakınca 3-5 kere hesap makinesi yazdığımı gördüm. Aslında biraz kendi etrafımda dolaşmışım. Pek ilerlediğim söylenemez. Örnek 1 Eylül 12'de başarısız bir kaç hesap makinesi denemesinde bulunmuşum. (Onları paylaşmayacağım.) Sonrasında daha basit yapılara (çok basit yapılara) yönelmeyi düşünmüş olmalıyım ki; şöyle bir şey yapmışım. A -> ( A ) A -> B A -> epsilon // B' de hertürlü bir string olabilir. Resmi olamayan şekillerle şöyle gösterilebilir. B -> [a-z]+ Bu gramer yapısına uyan bazı sözcükler şöyle: ((((((A)))))) (((omer))) ((A)) ((((selam)))) ((((((((())))))))) () Dosyaları koyunca herşey açık olacak. Ama şu kurala bir değinmem gerekiyor. rules.y da tanımlanan şöyle bir kural var. ...

NFA, DFA, Regex, CFG, PDA

Resim
Özet Hesaplama kuramında öğrenip unuttuğum bazı teorik bilgileri yeniledim. Unuttuğum ve en önemli olan kısım: Regex: NFA , CFG: PDA ikililerinin birbirleriyle bu kadar içli dışlı olduklarıydı. İyi oldu. Güzel oldu. NFA, DFA, Regex, CFG, PDA Finite Automata (Sonlu Otomat) Sonlu otomatlar, düzenli dilleri kabul eden ya da fark eden basit bilgisayarlar/hesaplama sistemleridir. Sonlu otomat, bir alfabeden, bir durumlar kümesinden, bir geçiş fonksiyonundan, bir başlangıç ve bir ya da birden fazla kabul durumundan oluşur. Şöyle gösterilir. M = (Q, E, &, q0, F) Q: Durumlar kümesi E: Alfabe &: Q x E -> Q şeklinde geçiş fonksiyonu F: Kabul durumlar kümesi Deterministic Finite Automata (Belirli Sonlu Otomat) Belirli bir otomattır. Aynı anda makina aynı anda sadece bir durumda bulunabilir. Non-Deterministic Finite Automata (Belirsiz Sonlu Otomat) Epsilonun, yani boş karakteri girdi olarak kabul eden. Aynı anda birden çok durumda bulunabilen makinelerdir. Regular ...

Lex ve Yacc-2

ÖZET Lex ve yacc ile alakalı örnekler yapmaya çalıştım ve hazır örnekler üzerine çalıştım. Onlarla alakalı bir kaç yazı okudum. Kısmi anlamda arkalarındaki teoriye baktım. Ortalama 3-4 saat çalıştım. Giriş Lex ve yacc bir derleyici ya da yorumlayıcı oluşturmak için çok gerekli olan iki araç. Bu araçları iyi kullanabilmek bir programlama dili oluşturma yolunda önemli bir yere sahip. Bu düşünceyle Lex ve yaccın biraz daha üstüne düştüm. Tabiki bunların yerine kendir lexer ve parserımı da yazabilirim. Ama böyle iki iyi araç varken böyle bir şeyin peşine düşmek pek mantıklı değil, heleki bu araçları da tam anlamıyla kullanamıyor ve bilmiyorken. Şimdiki kısa süreli amacım lex ve yaccı iyi kullanabilmek. Başından sonuna herşeyini anlamak. Hesap Makinesi Benim Denemem Hesap makinesi örneğini [Tom Nieman][ http://epaperpress.com/ ]'ın sitesinde görmüştüm. Bundan cesaret alarak, ne de olsa yanlışımı kontrol edebileceğim bir yer var, şu anki lex ve yacc bilgimle bir hesap makinesi...

Lex ve Yacc

Resim
Özet Lex & Yacc ile ilgili kaynak aradım. Örnekleri yazdım, çizdim. Regex bilgimi tazeledim. Ortalama 6-7 saat çalıştım. Lex: A Lexical Analyzer Generator (Sözcüksel çözümleyici üretici) [Lex][ http://dinosaur.compilertools.net/lex/ ] karakter bazındaki girdileri dizgecikler (tokens) haline getiren bir bilgisayar programı. Derleme evlerinde gösterilen ilk evreyi bu program rahatlıkla gerçekleştiriyor. Yacc: Yet Another Compiler-Compiler (Bir başka derleyici-derleyici) [Yacc][ http://dinosaur.compilertools.net/yacc/index.html ] gramer (sözdizilim) ayrıştırıcı. Girdiğimiz gramer kurallarına göre dizgecikleri çözümlüyor. Anlatması biraz zor. Yani adı bile "compiler-compiler". Çok tatlı durmuyor. Ama ne yaptığını görünce anlaması biraz kolay oluyor. Şöyle ki; Ömer yakışıklı bir insandır. Bu cümledeki kelimeleri çıkaran onların isim mi fiil mi sıfat mı olduğunu bulan kısım Lex (Tabi bizim yazdığımız kurallara göre). Yacc ise bu cümlenin doğru bir cümle olup olmadı...

İkinci Gün

Özet Implementing Programming Languages'a başladım. 2 bölüm okudum, ve bir parser bulmak icab etti. (Diğerler bölümleri de bir gözden geçirdim. ) Sırasıyla Cygwin, flex, yacc kurdum. Ortalama 3-3.5 saat çalıştım. Başlarken Hangi kitaptan okumaya başlayayım derken, hepsinin bir bölümlerine baktım. Hepsinin girişini okurken o kitabın hemen girişinde sihirli kelimelerin sıralandığı bir cümle gördüm. This book aims to make programming language implementation as easy as possible. It will guide you through all the phases of the design and implementation of a compiler or an interpreter. You can learn the material in one or two weeks and then build your own language as a matter of hours or days Implementing Programming Languages (pg.7) Kitap Kitabın ilk bölümünü önce okudum. Sonra bir daha okuyarak notlarımı çıkarttım. Aslında tam emin değilim notlarımı not olarak ayrı mı koymalıyım, ya da bu blog postunun içine mi gömmeliyim diye. Ama ben buraya yazacağım. Özet geçeyim, sonr...