Merhaba Ddili forum,
Ben bir ara deneme amaçlı genişletilebilir(? extendable) bir parser kodlamaya başladım. 'define' adlı anahtar kelime ile aşağıda gösterdiğim biçimde tanımlamalar yapabiliyorsunuz derleme süresi içerisinde bu parser tarafından bir kalıba dönüştürülüyor. Tanımlamar birbiri içerisinde de kullanılıp birbirine bağınırlık kurabiliyorlar. Daha sonra da uygun kalıplara uyan satırlar o kalıp çerçevesinde çözülüyor.
define "++" as _ a:Ident {
//kod üretimi
}
define "++" as a:Ident _ {
//kod üretimi
}
define "+" as a:Ident _ b:Ident {
//kod üretimi
}
define "*" as a:Ident _ b:Ident {
//kod üretimi
}
define "write" as _ a:Str {
//kod üretimi
}
_ tırnak içerisine alınmış olan tokenin geleceği yeri işaretlemek için ve Ident(Identifier), Sym(Symbol) gibi kelimeler de gelecek tokenin cinsini belirtiyor. Bunun yanında sabit anahtar kelimeler ve semboller de kullanılabiliyor. Temel olarak istediğim 'mixin' benzeri bir kod üretimi gerçekleştirmek ve tüm dilin bu şekilde açılarak terminal(uç) bağlara gelene kadar dönüştürülüp en son temellere inildiğinde ise makine kodu üretimi sağlanması.
Takıldığım noktaya gelecek olursak işlem önceliği mevzusu. * ile + şuanda birbiriyle aynı ağırlıkta işleme alınıyor. Bir gruplama yöntemi ile aralarındaki farkı kolayca belirtmek istiyorum. Bunu yaparken de dilin temel prensibi olan her şeyin dinamik tanımlanmasını engellemek istemiyorum.
Son olarak da kullanılmayan bir komutun kod içerisine dahil olmasını istemiyorum bağınırlık olmadığı takdirde tanım eğer kullanılmadıysa parserdan sonra bir daha görülmeyecek buna engel olabilecek bir işlem önceliği tekniğinden de uzak duruyorum.
Repo linkimi de şuraya bırakıyorum: https://github.com/h4kbas/Lang
Cevaplarınızı bekliyorum, şimdiden teşekkürler
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]