İPUCU

Python Artificial Intelligence’da en çok kullanılan dildir ve gerekli dökümanların paylaşım alanlar burada paylaşılmaktadır.

Seçenekler

[Ileri Seviye Python] Haydi bir Interpreter Yazalim [BOLUM 1] (Ar-Ge) //Easyly

BufGix - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
08/2015
Nereden:
Phobos/Space
Mesajlar:
1.023
Konular:
74
Teşekkür (Etti):
314
Teşekkür (Aldı):
446
Ticaret:
(0) %
29-04-2018 02:43
#1
[Ileri Seviye Python] Haydi bir Interpreter Yazalim [BOLUM 1] (Ar-Ge) //Easyly
Hiç düşündünüz mü, Python 3 + 2 yazdiğımızda 5 olarak sonucu nasıl bize gösteriyor.

Yada yazdığımız kodlar nasil bir sıra halinde yürütülüyor.
Veya "8 + "yazdığımızda python nasıl bize Invalid syntax hatası veriyor.


Bazı arkadaşların, "Amaaan nasıl yapıyorsa yapıyor işte" dediğini duyar gibiyim. Bu arkadaşlar geri tuşuna basıp konudan ayrılabilirler. Nasıl yaptığını merak edenler ise okumaya devam etsinler.


"Derleyicilerin nasıl çalıştığını bilmiyorsanız, bilgisayarların nasıl çalıştığını bilmiyorsunuz.Derleyicilerin nasıl çalıştığını bildiğinizden % 100 emin değilseniz, nasıl çalıştığını bilmiyorsunuzdur. ”*- Steve Yegge


Interpreter(Yorumlayıcı) veya Compiler(Derleyici)'in amacı, bir kaynak programı bazı üst düzey dilde başka bir formata çevirmektir. Interpreter ile Compiler arasındakı fark ise ; Compilerler kaynak kodu makine diline çevirirken, Interpreter ise makine diline çevirmeden işlemleri yürütür.



Neden bir Interpreter(veya Compiler) yazayım ki? Cünkü:
* Bir interpreter(veya compiler) yazmak,birlikte kullanmaniz gereken cok fazla teknik bilgiye ve beceriye sahip olmaniz gerekir. Bir interpreter(veya compiler) yazmak, bu becerilerinizi gerliştireceği icin daha iyi bir yazılımcı olmanizi sağlar.
* Her seyin kontrolünü eline almak, bilgisayari anlamak için
* Kendi eşsiz programlama dilinizi oluşturmak için

interpreter(veya compilerin) yazmayı deneyebilirsiniz.


"Aman tanrım! Başlıkta Iler Seviye yazıyor. Kesin anlayamam" derseniz hata edersiniz. Aşağida yazilan bütün kodları Pyhton Nesne Tabanlı Programlamaya kadar geldim diyen herkez anlayabılır.


---- Hadi Başlayalım ----

Dilerseniz hesap makinesi olarak bilinen, aritmatik ifadelerin bir interpreter'ini yazarak başlayalim. Hedefimiz oldukça minimalist "4+8" gibi iki tane tek haneli tam sayının birbirine eklenmesini sağlamak.

Kod:

INTEGER, PLUS, EOF = 'INTEGER', 'PLUS', 'EOF'

#EOF: End Of File
#verilen ifadenin sonuna gelip gelmedigimizi kontrol edecegiz


class Token(object):
    """
    Her gecerli parcacik icin olusacak Token classi
    """
    def __init__(self, type, value):
        ## Tur: INTEGER, PLUS veya EOF
        self.type = type
        
        #Token degeri: 1,2,3,4,5,6... '+' gibi
        self.value = value
        
    def __str__(self):
        return 'Token(type = {}, value = {})'.format(self.type, self.value)
    
    def __str__(self):
        return self.__str__()



Simdi bir Inperpreter classi yazalim.
Kod:

Kod:
       
class Interpreter(object):
    def __init__(self, text):
        self.text = text    #Gelen string
        self.pos = 0        #Bir nevi imlec, karakterlein yerlerini belirlemek icin
        self.current_token = None  #token ornegi
        
    def error(self):
        raise Exception('Error parsing input')  #Eger hatali kullanim olursa
        
    def getNextToken(self):
        """
        Lexer: bu kod verilen degerin (self.text) in parcalanmasindan sorumludur.
        Tokenlerine ayirir.
        """
        text = self.text
        
        
        #text in sonuna geldiginde
        # Token End of File i dondur
        if self.pos > len(text) - 1:
            return Token(EOF, None)
         
         
        #Su an hangi karakterle islem yapiyoruz self.pos a gore bul   
        current_char = text[self.pos]
        
        
        #Eger suanki karalter bir sayi ise
        #Integer tipli bir token olustur
        #self.pos degerini 1 arttir ki diger karaktere gecebilsin
        #sonra token nesnesini dondur
        if current_char.isdigit():
            token = Token(INTEGER, int(current_char))
            self.pos += 1
            return token
        
        if current_char == '+':
            token = Token(PLUS, '+')
            self.pos += 1
            return token
        
        #hicbir kosula girmez ise
        self.error()
        
    def eat(self, token_type):
    """
    Gecerli bir tip degeri (Integer, plus)ile gelen tip degerini karsilastir eger eslesirse tokeni 'ye' :) ve yeni tokeni esitle.
    eger eslesmez ise hata mesaji goster.
    """    
        if self.current_token.type == token_type:
            self.current_token = self.getNextToken()
        else:
            self.error()
        
    def expr(self):
        #EXPR INTEGER -- PLUS -- INTEGER
        
        #Ilk tokenimizi alalim
        self.current_token = self.getNextToken()
        
        
        #Gecerli tokenin tek haneli bir tamsayi olmasini bekliyoruz
        left = self.current_token
        self.eat(INTEGER)
        
        #Tokenin + isareti olmasini bekliyoruz
        op = self.current_token
        self.eat(PLUS)
        
        #Tokenin tamsayi olmasini bekliyoruz
        right = self.current_token
        self.eat(INTEGER)
        
        
        #Son olarak iki tokenin value degerlerini topluyoruz.
        return left.value + right.value
        
def main():
    while True:
        text = raw_input('Interpreter> ')
        
        if not text:
            continue
        interpreter = Interpreter(text)
        result = interpreter.expr()
        print result

main()


Aslinda kodda herşeyi acikladim. Ama kısaca özetlemek gerekirse.

* Bir Token classi olusturduk bu class tip ve degerleri tutyor

* Interpreter in icindeki eat methodu bir nevi kontrol islemi yaptik eger gelen karakter istedigimiz tipte degilse hata mesajiyla uyariyor.

* expr ile solaki sayiyi, oparetoru ve sagdaki sayıyı buluyoruz ve topluyoruz.


* getNextToken() bir Lexerdır yani amacı gelen text deki bizim icin uygun parcalari ayirmaktir. Bu isleme "Sözcüksel Analiz" denir.

Yazdigimiz Lexer soyle çalisiyor.










Ayrica yazdığımız mukemmel Interpretrimizin doğru çalışması için bazı kurallara uyulması gerekir:
* Sadece tek haneli sayilarin yazilmasi gerekir.
* Sadece tek aritmatik islem yapabiliyor
* Ve aralarda boşluk olmayacak.

Diğer yazımda bunlarin cözümlerini yapacağız.

Kod:
Interpreter> 3+4 
Token(type=INTEGER, value = 3)
Token(type=PLUS, value = '+')
Token(type=INTEGER, value = 4)
7 
Interpreter> 3+5 
Token(type=INTEGER, value = 3)
Token(type=PLUS,value = '+')
Token(type=INTEGER, value = 5)
8 
Interpreter> 3+9 
Token(type=INTEGER, value = 3)
Token(type=PLUS, value = '+')
Token(type=INTEGER, value = 9)
12 
Interpreter>


Eveeet. Bugünlük benden bu kadar. Sinavlarimdan vakit buldukça bu seriye devam edeceğim.


Kaynak:
https://ruslanspivak.com/
(Mukemmel bir blog. Okumanizi tavsiye ederim.)

---------------------
~Cahile gelmez benden hayır
Konu BufGix tarafından (10-06-2018 15:55 Saat 15:55 ) değiştirilmiştir.
CyberXhackk - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
03/2016
Nereden:
pardus@root
Mesajlar:
2.992
Konular:
240
Teşekkür (Etti):
772
Teşekkür (Aldı):
704
Ticaret:
(0) %
29-04-2018 02:59
#2
Elinize sağlık
--------------------- Linux'a Dair Herşey..
Phoique 7 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
03/2017
Mesajlar:
462
Konular:
23
Teşekkür (Etti):
37
Teşekkür (Aldı):
139
Ticaret:
(0) %
29-04-2018 14:43
#3
Eline sağlık dostum.
---------------------
JavaScript Developer
BufGix - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
08/2015
Nereden:
Phobos/Space
Mesajlar:
1.023
Konular:
74
Teşekkür (Etti):
314
Teşekkür (Aldı):
446
Ticaret:
(0) %
29-04-2018 20:44
#4
Alıntı:
CyberXhackk´isimli üyeden Alıntı Mesajı göster
Elinize sağlık
Alıntı:
Phoique 7´isimli üyeden Alıntı Mesajı göster
Eline sağlık dostum.

Teşekkur ederim.
---------------------
~Cahile gelmez benden hayır
ihan3t - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
02/2012
Mesajlar:
5.004
Konular:
255
Teşekkür (Etti):
291
Teşekkür (Aldı):
1833
Ticaret:
(0) %
01-05-2018 15:48
#5
Eline sağlık, bu tarz konuların artması dileğiyle.

Gelecek konularda BNF (backus naur form) gibi konularada değinip bir dilin nasıl oluşturulacağı ile ilgili bilgilerde vermen, derleyiciyi/interpreterı neye göre oluşturacağı hakkında fikir verir insanlara.
---------------------
Computer Engineer.

Senior Software Engineer.
BufGix - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
08/2015
Nereden:
Phobos/Space
Mesajlar:
1.023
Konular:
74
Teşekkür (Etti):
314
Teşekkür (Aldı):
446
Ticaret:
(0) %
01-05-2018 16:13
#6
Alıntı:
ihan3t´isimli üyeden Alıntı Mesajı göster
Eline sağlık, bu tarz konuların artması dileğiyle.

Gelecek konularda BNF (backus naur form) gibi konularada değinip bir dilin nasıl oluşturulacağı ile ilgili bilgilerde vermen, derleyiciyi/interpreterı neye göre oluşturacağı hakkında fikir verir insanlara.
Onerilerinizi dikkate alacagım. Tesekkurler
---------------------
~Cahile gelmez benden hayır
Konu BufGix tarafından (01-05-2018 16:17 Saat 16:17 ) değiştirilmiştir.
Ceen - ait Kullanıcı Resmi (Avatar)
Forumdan Uzaklaştırıldı
Üyelik tarihi:
07/2017
Mesajlar:
219
Konular:
19
Teşekkür (Etti):
70
Teşekkür (Aldı):
75
Ticaret:
(0) %
01-05-2018 17:19
#7
Elinize ağzınıza sağlık hocam.
THT159 - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
09/2016
Nereden:
deepLearning
Mesajlar:
306
Konular:
85
Teşekkür (Etti):
43
Teşekkür (Aldı):
4
Ticaret:
(0) %
01-05-2018 20:29
#8
Elinize sağlık hocam. Başarılarınızın devamını dilerim.
R3DBULL - ait Kullanıcı Resmi (Avatar)
Tamamen Forumdan Uzaklaştırıldı
Üyelik tarihi:
04/2016
Mesajlar:
615
Konular:
57
Teşekkür (Etti):
228
Teşekkür (Aldı):
100
Ticaret:
(0) %
26-05-2018 14:46
#9
Eline sağlık.
Depdip - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
08/2017
Nereden:
NewYork
Mesajlar:
1.588
Konular:
46
Teşekkür (Etti):
296
Teşekkür (Aldı):
420
Ticaret:
(0) %
26-05-2018 14:49
#10
Eline Sağlık

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı