Thread overview
Genişletilebilir parser yaptım, işlem önceliği olayları nasıl tanımlanmalı?
Jun 26, 2018
huseyin
Jun 27, 2018
huseyin
Jun 28, 2018
huseyin
Nov 25, 2019
domer54x
June 27, 2018

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. ]

June 27, 2018

Hocam önceliği oluşturmak sorun değil onu çözdüm. Asıl sorun hiyerarşiyi nasıl kurmamız gerekir? Bu parser tamamen yalın bir halde toplama, çıkarma gibi işlemleri bile ben define etmek istiyorum. Tamamen bilgisiz bir şekilde gelecek. Çok az assembler kodu önceden tanımlı olacak(and, or vb.) son olarak da 'define' anahtar sözcüğü olacak. Diğer tüm şeyleri compile-time sürecinde öğrenip iç içe çözümleyerek terminal nodelara(uç bağ ?) ulaşacak ve bunları derleyecek. Ancak her şey kullanıcı-tanımlı olunca işlem önceliğini de tanımlamak gerekiyor. Buna nasıl bir yol önerirsiniz?

Ben bazı yöntemler düşündüm ancak hepsinde bir sorun çıkıyor.

1- Üstte tanımlanan önceliklidir desek her şey bir dosyada tanımlansa falan kıyamet kopar :D
2- Precedence gibi bir keyword getirsek sayı versek en küçük olan en büyük olsa ya da tam tersi o da karıştırıyor.
3- En son acaba dedim group diye bir keyword mü oluştursam. Örneğin, 'group math' yazanları kendi arasında sıralasa sonra grupların önceliği ayrı bir yerde tanımlansa. Bu da tanımlayan kişilerde kafa karışıklığına yol açar mı bilemiyorum.

Teşekkürler

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 27, 2018

Bu konular beni aşar ama yanılmıyorsam ifadeler hep 'ident' değil, farklı işleçler için farklı olmalı. Örneğin, aklıma gelen pegged'de basit bir aritmetik örneği var:

https://github.com/PhilippeSigaud/Pegged

Orada PEG söz dizimi kullanılıyor ama başka söz dizimleri için de geçerli: Örneğin, işin içine Term ile Factor ayrımı girince öncelik de çözülmüş oluyor.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 28, 2018

Bu soruların her türlüsünün çözülmüş olduğundan eminim; bilgisayar bölümünden mezun bir arkadaş doğru tarafa yönlendirecektir. (Ben değilim. :) )

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 28, 2018

Anladım hocam o zaman araştırmaya devam :D

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

November 26, 2019

Ellerine sağlık ben de böyle bir şey yapmak istiyorum acaba hangi konuları araştırmam gerek

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]