Xtext – DSL Framework, Bölüm 3

İlk ve İkinci bölümlerde Xtext ile ufak bir parçada olsa dilin nasıl geliştirileceğinden bahsetmiştik. Dilin gramerini nasıl belirleyeceğimizi, bunu ufak metodlarla nasıl test edebileceğimizi görmüştük. Ardından genel olarak oluşturduğumuz dilden nasıl çıktı alabileceğimize ve testlerimizi nasıl yapabileceğimize bakmıştık.

Şimdi ise çıtayı çok az daha yükseltelim. Geçtiğimiz aylarda benim en merak ettiğim konu dilimizde oluşturduğumuz kısımları, diğer kısımlar içinde nasıl kullanacağımızı merak ettim ve bunun aslında Xtext ile çok kolay olduğunu gördüm.

Diger Kısımların Kullanımı Derken?

İlk bölümden gördüğünüz üzere dilimizi oluştururken bunu alt parçalara bölerek yapıyoruz. Örneğin Java gibi bir dilde, değişkenlerimiz var, sınıflarımız var, metodlarımız var, daha var da var. Fakat ancak ilgili alanda tanımladığımız bir metodu kullanabiliyoruz. Yani dili geliştiren kişi bir metodun adının nasıl olacağını biliyor fakat dili kullanan kişinin kullandığı adı bilemiyor. Yinede Javada program geliştirirken uyarılar alabiliyoruz. Bu metod yaratılmadı gibi ya da aslında şu metodu mu kastettiniz gibi uyarılar alabiliyoruz.

İşte benim Xtext’te yapmak istediğimde tam olarak bu. Doğal olarak Xtext ile dil geliştirilecekse kullanan kişinin oluşturduğu isimlerede referans verebilmeliyiz. Bunun için ufak bir örnek hazırladım. Dilimiz son haline geldiğinde aşağıdaki kodu çalıştırabilir olacak.

bhdrkn.func/example.func


[FUNCTIONS]
function firstFunctionName
function secondFunctionName
function thirdFunctionName
[/FUNCTIONS]
[CALLS]
call firstFunctionName
call secondFunctionName
call thirdFunctionName
[/CALLS]

Gördüğünüz gibi tasarlanılan dil, açıklayıcı olması açısından, son derece basit. Kullanıcı fonksiyon isimleri yaratabilecek ve sonradan sadece ama sadece yarattığı isimlerdenki fonksiyonları çağırabilecek. Düşünürseniz bir dil için olmazsa olmaz bir özellik bu. Tabi bukadar önemli bir özelliği Xtext içerisinde gerçeklemekte son derece kolay.

Projenin Olusturulması

Eclipse altında yeni Xtext Projesini aşağıdaki özelliklerle oluşturuyoruz.

  • Dosya uzantısı: func
  • Proje Adı: org.xtext.bhdrkn.function
  • Gramer Adı: org.xtext.bhdrkn.function.Function

Daha sonra oluşan Function.xtext dosyamızı aşağıdaki gibi yapıyoruz.

Function.xtext


grammar org.xtext.bhdrkn.function.Function with org.eclipse.xtext.common.Terminals

generate function "http://www.xtext.org/bhdrkn/function/Function"

FUNCFile:
functions = Functions
calls = Calls;

Functions:
'[FUNCTIONS]'
functions+=Function*
'[/FUNCTIONS]' ;

Function:
'function' name=ID;

Calls:
'[CALLS]'
calls+=Call*
'[/CALLS]' ;

Call:
'call' name=[Function];

Gördüğünüz gibi dilin tasarımı son derece basit. Sadece daha önce kullanmadığımız tek bir şey kullandık burada. Onu da “‘call’ name=[Function]; satırında rahatça görmek mümkün. Burada köşeli parantezlerin manası, kullanılacak adı git oluşturulan Function yapılarında ara.

Kodu bu şekilde yazdıktan sonra öncelikle GenerateFunction.mwe2 dosyasını çalıştırıyoruz. Ardından da ikinci projeyi Eclipse Application olarak çalıştırıyoruz. Açılan yeni Eclipse’te yeni bir proje yaratıp. Yukarıda örnek aldığımız bhdrkn.func dosyasına benzer bir dosya oluşturmaya başlıyoruz.

Yazarken sizde farkedeceksiniz eğer call kelimesinden sonra function ile tanımlanmamış bir şey kullanırsanız size hata verecek. Hatta hatanın üzerine tıkladığınızda sizi düzeltip “Bunu mu demek istedin?” diye soracak.


Eğer resimde gördüğünüz uyarıyı alıyorsanız ve alternatiflerden birini seçtiğinizde sorununuz kalkıyorsa o zaman sisteminiz çalışıyor demektir.

Son

Son olarak şundan bahsetmek istiyorum. Ben bu tip bir örnek yaptığımda daha Xtext 2.0 çıkmamıştı. Son zamanlarda aklıma takılan bir sorun için siteye gittiğimde Xtext 2.0 çıktığını öğrendim. Her bu tip haberi geç öğrendiğimde olduğu gibi RSS kullanmadığıma sinir oldum. Şimdi kullanmaya başlayacak mıyım peki? Hayır hiç zannetmiyorum. Nedense RSS ya da türevlerine bir türlü alışamadım.

Konuya dönersek, Xtext 2.0 çıkmış olmasına rağmen ben daha sürümümü 2.0 yükseltmedim. Çünkü şu an bir projenin ortasındayım ve bir projenin ortasındayken kullanılan kaynağın değiştirilmesini mantıklı bulmuyorum. Eğer Xtext 2.0 altında denendiğinizde bir hatayla karşılaşılırsanız lütfen beni bilgilendirin.

Bunun yanı sıra eğer projenin oluşturulması ve çalıştırılmasıyla ilgili bir sıkıntı varsa, geri dönüp Bölüm 1‘i bir okuyun derim.

Kaynaktan bahsetmek gerekirse, sadece Xtext User Manual‘i kullanıyorum. Tabi kide demin bahsettiğim nedenden ötürü 1.0.1’i yani kendi sürümümün Manual’ini kullanıyorum.

GitHub Adresi

Fonksiyonların anlatıldığı bu örneğe aşağıdaki GitHub adresini kullanarak erişebilirsiniz.

https://github.com/bhdrkn/Xtext-Examples

End Of Line