Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
0 beğenilme 0 beğenilmeme
1.5k kez görüntülendi

Compiler (Derleyici) tasarlanırken, Lexical Analysis yapılırken, maalesef Türkçe ifadesini bilmiyorum, Türkçeleştirildi mi onu da; verilen bir Infix ifade Postfix veya Prefix notasyonuna dönüştürülür. 

Bu altta yazdığım kod, dönüştürülmüş postfix ifadenin derleyici simülasyonudur. Derleyici, ister C olsun ister Pascal veya başkası, gelen ifadeyi parse eder, parse ederken, token'lara ayrılır. Bu token'lar, "Symbol Table" adlı tabloda tutulurlar. Bu konular ileri seviyede olup, daha önce paylaştığım soru çözümlerinin seviyesinin üstündedir, derecelendirme imkânım olsaydı, seviye derecesini 5 üzerinden 4 yapardım. 

Derleyici tasarımı yapmayı düşünenlere faydalı olacağı kanısındayım, o yüzden "Symbol Table" nasıl oluşturulur, hangi teknikler kullanılır, onu da Python'da programlayarak göstereceğim. En çok kullanılan tekniklerden biri "Hashing" dir. Çünkü, "Symbol Table" bir süre sonra çok büyüyecektir. 

Derleyici, token'ların, aşağıdaki örnekte olduğu gibi, rakam mı, matematiksel işlemci (operator) mi olduğunu bilmez. 

Bu alttaki kod kendi kendi çağıran bir fonksiyondur. Bir sonraki yazmayı düşündüğüm konuların başında, umarım çok daha fazla vaktim olur, "Derleyici Tasarımında Infix ifade Nasıl Postfix'e Dönüştürülür" olacaktır.

"6 2 3 + - 3 8 2 / + * 2 $ 3 +" ifadesi Postfix ifadesidir. Kod, bu ifadeyi

parse ederken şunu yapıyor, gelen ifade, sayı mı işlemci mi diye bakıyor,

eğer sayıysa Stack'e basıyor, yok sayı değil de işlemci ise, Stack'ten iki

sayıyı çekiyor ve işlemci ne ise onu ilgili sayılar arasında uyguluyor. Adım adım şöyle hesaplıyor:

$6$'ya baktı, ne olduğuna karar verdi, Stack'e bastı, sonra $2$ geliyor, onu da bastı, daha sonraki adımda $3$ geliyor, onu da bastı, şimdiden Stack'te $3$ adet elemanımız oldu. Bir sonraki "token", $+$, bu durumda Stack'ten iki eleman çekecek, Stack son giren ilk çıkar mantığına göre çalışır, yani, Stack'in en tepesinde, $3$ var, bunun altında ise $2$ var, bu durumda bu ikisi Stack'ten çekilecek ve $+$ işlemcisi uygulanacak, sonuç $5$; bu token da Stack'e basılacak, bu durumda Stack'te $6$ ve $5$ var, daha sonra bir karakter daha sağa kaydığımızda, $-$ işlemcisini göreceğiz, bu durumda Stack'ten iki eleman çekilecek ve bu işlemci uygulanacak, bu da $6-5$ demek, kısaca $1$ elemanını da Stack'e basacağız; devam edersek işleme, sırasıyla $3, 8, 2$ elemanları da Stack'e basılacak. Bu durumda, Stack'in son hâli, $1,3,8,2$. Bu mantığı bu dizinin sonuna kadar uyguladığımızda işlemin sonucu, $52$ sayısı olacak.

Görüldüğü üzere, buradaki örnekte tek basamaklı sayılar kullanılmıştır, örnek

geliştirilebilir. Burada diğer bir kısıt, sayılar ondalıklı olamıyor, onun için başka bir şey yapmak gerekiyor. Ancak, genel mantığı budur postfix hesaplamanın...

Diyelim ki Infix ifade, $(6+3)/(8-2)$ olsun, bunun postfix versiyonu, $63+82-/$ olur, Önce sayılar sonra da işlemci geliyor, Prefix ifade de ise, tam tersi...

6 2 3 + - 3 8 2 / + * 2 $ 3 + bu ifadenin Infix karşılığı şu şekildedir:

$(((6-(2+3)*(3+(8/2)))^2)+3)$ 



Serbest kategorisinde (496 puan) tarafından 
tarafından yeniden gösterildi | 1.5k kez görüntülendi


Bu kod, gelen ifadeyi parse ediyor...  Derleyici tasarladığımıza göre, elemanın (token) sayı mı operatör mü olduğunu bilmiyoruz. image


İngilizce bilmeyenler için ingilizce kelimelerin Türkçe karşılıkları şunlar olabilir.

prefix: ön ek,   infix: iç ek,   postfix: son ek,  parse: ayrıştırmak

token: simge,    lexical analysis: sözlüksel analiz

yazılarınızı -özellikle bunu- okumaktan çok zevk aldım ve bana çok şey kattı. elinize sağlık.

Sayın @dpc, ilginiz için teşekkür ederim.

20,210 soru
21,737 cevap
73,303 yorum
1,911,202 kullanıcı