Python ile parser yapımı

Bu yazıda, Lexical Analiz yazısında anlattığım Lexer'ın üstüne, bir de Parser yapmaya başlayacağız. Parser konusunda genel bilgi almak için, Parsing Kavramı ve Yöntemleri yazısını okuyabilirsiniz.

Öncelikle, izleyeceğimiz yöntemden biraz bahsedeyim. Burada kullanacağımız yöntem, çok orjinal bir yöntem değil aslında. Vaughan Pratt tarafından Recursive Descent ve Operator Precedence yöntemlerinin güzel yanlarını birleştiren bir parse yöntemi, 1973 yılında bir sempozyumda sunuldu. 2007 yılında, Douglas Crockford bu yöntemi kullanarak, Top Down Operator Precedence adında bir yazı yazdı. Bu yazıda, bir javascript parser'ı örnek gösteriliyordu. Bundan esinlenen Fredrik Lundh Simple Top-Down Parsing in Python yazısında, bu yöntemi kullanarak Python'un bir kısmını parse edebilen bir program örneği ve benchmarkları yayınladı. Ben burada, bu yöntemi anlaşılır bir şekilde sunmaya çalışacağım. Bahsi geçen Parser ve Lexer'ın kısmen bitmiş hallerine Lexer-Parser github deposu üzerinden ulaşabilirsiniz.

Devamını oku…

Parsing Kavramı ve Yöntemleri

Aslında, geçen gün yazdığım Lexer için yazdığım Parser'ı tanıtacaktım. Parse kavramı üzerine internetten kolayca kaynak bulunabileceğini düşündüm. Ancak, biraz google araması yaptığımda karşıma gelen Türkçe sonuçlar pek tatmin edici olmadı. Bu sebeple, önce tanıtıcı bir yazıyla başlamak istedim. Bu yazının konuları şunlar olacak.

Devamını oku…

Lexical Analiz 3

Bugünkü yazılar biraz spam gibi oldu kusura bakmayın, ama lexical analiz 2'deki lexer'a yapılabileceğinden bahsettiğim birkaç eklemeyi de göstereyim dedim.

Satır Sayma

Satır sayma konusu çok kolay, _lexInitial ve _lexString yeni satırla karşılaştıklarında, bir değişkeni artıracak. Ayrıca, gönderdiğimiz tokenlere satır bilgisi de ekleyeceğiz.

Devamını oku…

Lexical Analiz

lexical analiz karakter dizisini, token dizisine çevirme işlemine deniyor. Token dediğimiz şey ise, bir veya daha fazla karakterden oluşan ve grup olarak önem taşıyan karakter dizisi demek. Bu analizi yapan kodlara lexer deniyor. Çoğu zaman, lexer'ların oluşturduğu token dizisi, parser tarafından işlenir. Bunlar bir dil oluşturmak ve bu dili analiz etmek için kullanılır.

Devamını oku…

Haskell Öğreniyorum

Hazır tatil, boş vaktim varken Haskell öğrenmeye bir şans daha vereyim dedim. Bir yandan öğrenirken, bir yandan da ufak bir Haskell tanıtımı yapayım (bkz: araklamak).

Haskell tamamen fonksiyonel bir dil. İmperatif dillerde, programa hangi adımları izleyeceğini adım adım anlatıp, neyin nasıl yapılacağını anlatıyoruz. Fonksiyonel dillerde ise, neyin ne olduğunu belirtiyoruz, nasıl yapılacağına program kendi karar veriyor.

Haskell tembel bir dil. Haskell size bir sonuç göstermek zorunda kalmadıkça, fonksiyon çalıştırmaz. Örneğin, bir liste döndüren bir fonksiyonu çalıştırıp, ilk iki elemanını ekrana basmak istediğinizde, Haskell ilk iki elemanı bulacak kadar fonksiyonu çalıştırıp, orada bırakıyor.

Haskell, statik tipleme kullanıyor. Yani, derleme sırasında bir takım hataları yakalayabiliyorsunuz. Ayrıca, C'nin aksine, çıkarım yapma yoluyla veri tiplerini bulabiliyor. Örneğin, a = 5 derseniz, a'nın bir int olduğunu belirtmenize gerek yok, Haskell kendi anlıyor.

Haskell zarif ve ifade gücü yüksek bir dil. Python'dan hatırlayacağınız, list comprehension yapısı Haskell kaynaklı. Ne kadar az kod, o kadar kolay bakım gereksinimi ve o kadar az bug demek.

Devamını oku…

cx_freeze ve py2exe alternatifi

Yazdığı kodları Windows'da son kullanıcıya dağıtmak isteyen Pythoncular bildiğim kadarıyla, iki farklı yol izliyor:

  • Kullanıcıdan Python yüklemesini istemek
  • cx_freeze, py2exe gibi programlarla Python ve yazılan uygulamayı tek dosya altında birleştirmek

Bu iki yöntemin de kendine göre bir takım sıkıntıları var. İlk yöntem, son kullanıcı açısından yorucu olabilir. Aynı zamanda, son kullanıcının Python'u kuracak ve sistem yoluna ekleyecek kadar bilgili olmasını gerektiriyor.

İkinci yöntem ise, hem bir açıdan kodları sakladığı için açık kaynak felsefesiyle ters düşüyor, diğer yandan bozuk exe dosyası üretme riski var. Ayrıca, şahsen hiç estetik bulmuyorum bu yöntemi.

Bu yazıda, muhtemel bir üçüncü yöntemden bahsedeceğim.

Devamını oku…

Python ile Yazılmış Programlar

Python kullanım alanları yazısında, Python programlama dilinin hangi alanlarla kullanıldığına değinmiştim. Bu yazıda ise, Python ile neler yapılabileceği daha iyi anlaşılsın diye, Python ile yazılmış programlardan bahsedeceğim.

İyi Programcı Nasıl Olunur

Ben iyi bir programcı olduğumu iddia edemem. Ancak, kendi çabalarıyla programcılık hakkında bazı şeyler öğrenmiş ve hayatının belirli bir kısmında, amatör olarak da olsa, programcılıkla uğraşmış biriyim. Bu maceram boyunca, edindiğim deneyimler doğrultusunda, doğru veya yanlış, "iyi programcı nasıl olunur?", "iyi programcı olmak için neler yapmak gerekir", "yazılım konusunda kendini geliştirme nasıl mümkün olur" gibi sorulara bir cevap yazıyorum. Yazı iki kısımdan oluşuyor; önce bana göre iyi bir programcı olmak için ihtiyaç duyacağınız şeylerden bahsedeceğim, sonra kendinizi geliştirebilmeniz için bazı adımlar tavsiye edeceğim. Ancak, bunlara geçmeden önce şunu da belirtmek istiyorum ki, bunları benim gibi bu işin okulunu okumamış ve kendi çabalarıyla programlama konusunda bir yerlere gelmek isteyen kişileri düşünerek yazdım. Çünkü, burada tavsiye edeceğim adımlar, zaten bilgisayar mühendisliği bölümlerinde derslerde veriliyordur diye düşünüyorum. O yüzden, bu yazı okullulara çok hitap etmeyebilir.

Bence programcılar iki kısımdan oluşuyor. İlk grup, programcılığı programcılık için yapanlar grubu. Bu gruptaki kişiler, sırf eğlence olsun diye program yazan, farklı ve yeni şeyler denemeye yatkın kişilerdir. Diğer grup ise, programcılığı bir araç olarak kullanan ve programcılık aracılığıyla bir işini halletmesi gereken kişilerdir. Bunlara örnek olarak, bilimsel amaçlarla programcılık yapanları verebiliriz. Bu yazı ilk gruba yönelik olacak.

Devamını oku…