🐍 BurakPy: Python ile Yazdığım Basit Programlama Dili ve Yorumlayıcısı
Programlama dillerini nasıl çalıştığını anlamak için en iyi yol, kendiniz bir tane yazmaktır. Bu yazıda, Python ve PLY kütüphanesi kullanarak geliştirdiğim BurakPy adlı mini programlama dilini ve yorumlayıcısını detaylarıyla anlatacağım.
✨ Projenin Amacı ve Kapsamı
BurakPy, temel programlama yapıları ve ifadeleri destekleyen, öğrenme amaçlı bir yorumlayıcıdır.
Hedefim:
-
Basit aritmetik ve mantıksal ifadeler
-
Değişken atama ve kullanımı
-
Koşullu ifadeler (
if
,else
) -
Döngüler (
while
) -
Kullanıcıdan giriş alma (
input
) -
Çıktı verme (
print
)
Bunları destekleyen temiz, okunabilir ve genişletilebilir bir yapı kurmak.
⚙️ Mimari ve Teknoloji Seçimi
-
Python dili ile hızlı prototip oluşturma
-
PLY (Python Lex-Yacc): Lexer ve parser oluşturmak için güçlü ve Python dostu bir araç
-
AST (Abstract Syntax Tree): Kaynak kodu parse edip ağaç yapısına dönüştürmek
-
Yorumlayıcı (Interpreter): AST üzerinde yürüyerek işlemleri gerçekleştirmek
-
1️⃣ Lexer — Kaynak Kodun Token’lara Dönüşümü
BurakPy,
ply.lex
ile tokenize edilir. Bu aşamada:-
Anahtar kelimeler (
print
,if
,else
,while
,input
) ve operatörler (+
,-
,*
,/
,=
,==
,!=
,<
,>
,<=
,>=
) tanımlanır -
Değişken isimleri ve sayılar (
NUMBER
) tanımlanır -
Beyaz boşluklar, tablar ve satır sonları düzgün yönetilir
-
Hatalı karakterlerde kullanıcıya uyarı verir
-
tokens = (
'NUMBER', 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'EQUALS',
'NAME', 'PRINT', 'IF', 'ELSE', 'INPUT', 'WHILE',
'GT', 'LT', 'GE', 'LE', 'EQ', 'NE', 'COLON', 'LPAREN', 'RPAREN'
)
t_PLUS = r'\+'
# ... diğer token tanımları
Önemli: Lexer, kaynak kodu doğru ve hızlı şekilde parçalayarak parser’ın işini kolaylaştırır.
2️⃣ Parser — Token Dizisini Sentaks Ağacına Çevirme
ply.yacc
yardımıyla dilin grameri tanımlandı. Bu aşamada:
-
Üretim kuralları (production rules) tanımlanarak ifadelerin yapısı belirtildi
-
Operatör önceliği ve birleşim yönü (precedence) ayarlandı
-
Blok yapıları (if-else, while) için özel kurallar oluşturuldu
-
Syntax hataları için geri bildirim mekanizması eklendi
Örnek bir gramer kuralı:
def p_statement_if_else(p):
'statement : IF condition COLON statements ELSE COLON statements'
p[0] = ('if_else', p[2], p[4], p[7])
3️⃣ AST ve Veri Yapıları
Parser çıktısı olarak gelen AST (soyut sözdizim ağacı), ifadelerin ve komutların hiyerarşik yapısını temsil eder.
Örnek AST düğümü:
('assign', 'x', ('binop', '+', ('var', 'a'), 5))
4️⃣ Yorumlayıcı — AST Üzerinde Çalışma
eval_expression
ve eval_statement
fonksiyonları, AST üzerinde derinlemesine gezinir ve işlemleri gerçekleştirir:
-
Aritmetik işlemler:
+
,-
,*
,/
-
Değişken yönetimi: Atama ve okuma
-
Koşullar:
>
,<
,>=
,<=
,==
,!=
işlemleri boolean döner -
Döngüler ve şart blokları:
while
,if
,else
yürütülür -
Girdi ve çıktı:
input()
ile kullanıcıdan veri alınır,print
ile gösterilir
Örneğin:
def eval_expression(expr):
if isinstance(expr, int):
return expr
elif expr[0] == 'binop':
op, left, right = expr[1], expr[2], expr[3]
lval = eval_expression(left)
rval = eval_expression(right)
# işlemler...
5️⃣ REPL — İnteraktif Çalışma Ortamı
BurakPy, kendi Read-Eval-Print Loop (REPL) ortamına sahiptir.
-
Kod satır satır veya bloklar halinde girilebilir
-
Kod parse edilip hemen çalıştırılır
-
Çıkmak için
exit
,quit
veya Ctrl+D kullanılır -
Çok satırlı bloklar için
:
ile başlayan satırlar devam ettirilir
🔍 Geliştirme ve Öğrenme Deneyimi
-
PLY’nin gücü: Python ortamında lexer/parser yazmak kolay ve güçlü
-
AST tasarımı: Kendi ağaç yapımı kurmak soyutlama için önemli
-
Kontrol yapıları:
if-else
,while
bloklarını işlemek mantıksal akış yönetimini öğretti -
Hata yönetimi: Hem lexical hem syntax hataları için bilgilendirici mesajlar geliştirdim
-
REPL kullanımı: Etkileşimli ortam kullanıcı deneyimini arttırdı
🚀 İleriye Dönük Planlar
BurakPy’yi daha da geliştirmek için:
-
Fonksiyon ve parametre desteği
-
Liste ve sözlük gibi veri yapıları
-
Daha zengin hata mesajları ve hata ayıklama araçları
-
Modüler yapıya geçiş (parser, lexer ve evaluator ayrı modüller)
-
Dosyadan kod çalıştırma ve kütüphane desteği
i = 0
while i < 5:
print i
i = i + 1
📢 0
📢 1
📢 2
📢 3
📢 4
🏁 Sonuç ve Gelecek Vizyonu
BurakPy projesi, programlama dillerinin temel prensiplerini kavramak ve yorumlayıcı yapısını öğrenmek için çıktığım bir yolculuk oldu. Kendi dilimi tasarlayıp yorumlamak, sadece teoride değil, pratikte de yazılımın derinliklerine inmeme olanak sağladı.
Elimdeki bu temel yapı, sadece başlangıç. BurakPy’yi;
-
Fonksiyon tanımlama ve çağırma özellikleriyle zenginleştirerek,
-
Karmaşık veri yapıları (listeler, sözlükler) ekleyerek,
-
Hata yönetimini ve kullanıcı deneyimini iyileştirerek,
-
Modüler ve sürdürülebilir bir mimari kurarak,
-
Kendi standart kütüphanesini oluşturacak kadar büyüterek,
tam anlamıyla güçlü, esnek ve öğretici bir programlama diline dönüştürmeyi hedefliyorum.
Bu süreçte öğrendiklerimi paylaşmaya devam edeceğim ve dilin gelişimini adım adım blogda belgeleyerek, programlama dilleri ve derleyici tasarımıyla ilgilenen herkes için faydalı bir kaynak olmasını sağlayacağım.
BurakPy, benim için sadece bir proje değil; yazılım dünyasında yaratmanın ve öğrenmenin somut bir simgesi. Yolculuk devam ediyor, keşfetmeye, geliştirmeye ve paylaşmaya hazırım.