05 Sep 2017
Merhaba arkadaşlar,
Programlama dili geliştirirken karşımıza çıkan en temel öğelerden birisi ayrıştırıcı yazımıdır. Bildiğiniz üzere programlama dilini yazı tabanlı geliştiriyoruz çoğunlukla (scratch gibi blok tabanlı diller de mevcuttur). Yazdığımız kodun hatalı olup olmadığının denetlenmesi ayrıştırıcının sorumluluğundadır.
Ayrıştırıcılar genellikle parse tree adını verdiğimiz ayrıştırma ağacı kuralları yazarak oluşturulur. En temel manada örnek vermek gerekirse, bunu cümlelerin nasıl oluştuğundan hareketle anlatabiliriz:
Cümle = özne yüklem
Evet, gördüğünüz üzere Türkçe cümle ifadeleri sırasıyla özne ve yüklemin arka arkaya gelmesinden oluşur. Peki yazdığımız bu ayrıştırıcı kuralına uyan bir kaç cümle örneği verelim:
Ali geldi.
Ahmet gidiyor.
Tabi her Türkçe cümlenin bu kadar basit ifade edilmediğini içinizden geçirdiğinizi duyar gibiyim. Biliyoruz ki; çok daha karmaşık cümleler kurabiliriz ve yazdığımız ayrıştırıcı ağacı bunlarında kontrolüne imkan sağlamalıdır. Hadi şimdi yeni bir gramer belirleyelim:
cümle = özne tümleç yüklem
Evet yeni gramerimiz öncekine ek olarak tümleç adı verilen konum, zaman gibi ifadelerin belirtiği ek dil ögelerini de içlerinde barındırırlar. Şimdi de bu ayrıştırıcı kuralına uyan örneklere bakalım:
Ali sinemaya gidiyor.
Ali otobüsle gidiyor.
Ali sabah gidiyor.
Şu ana kadar geldiğimiz noktada özne, tümleç ve yüklemden oluşan basit bir gramerimiz var. Peki bu gramer şu cümlenin doğruluğunu test edebilir mi?
Ali sinemaya sabah gidiyor.
Malesef yapamaz, çünkü örnek cümlemiz 2 tane tümleç içermektedir. Cümleler doğası gereği hiç tümleç içermeyeceği gibi, bir, iki, üç hatta beş tümleç de içerebilir. Dolayısıyla yazdığımız ayrıştırıcı kuralı bütün bunları kapsayıcı olmalıdır. İşte tüm bu varyasyonları içermek üzere:
tümleç*
Ifadesini kullanıyoruz. Bu hiç olmayadabilir bir den fazla defa da bulunabilir anlamına gelmektedir. Dolayısıyla yukarıda verdiğimiz örnek ve aşağıdaki örnek cümleler artık gramer tarafından test edilebilir olacaktır:
Ali sinemaya akşam arabayla gidiyor
Şimdi tüm bunları deneyebileceğiniz, grameri yazılmış deneme sitesini şurada bulabilirsiniz:
See the Pen Simple Turkish Parser by Mehmet Akif AKKUS (@mehmetakifakkus) on CodePen.
1- http://matt.might.net/articles/grammars-bnf-ebnf