Turkhackteam.net/org - Turkish Hacking & Security Platform...  
Geri git   Turkhackteam.net/org - Turkish Hacking & Security Platform... >
Programlama
> Python


Python ile Interpreter Yapımı - Tokenizer - ihan3t

Python

Yeni Konu aç Cevapla
 
Seçenekler
Alt 08-08-2017   #1
  • Offline
  • Yarbay
  • Genel Bilgiler
Üyelik tarihi
Feb 2012
Mesajlar
Konular


  
Python ile Interpreter Yapımı - Tokenizer - ihan3t



Merhabalar, Gerçek Yazılımcılar Belli Olacak - Teknik Yarışma - ihan3t konusunda sorduğum sorunun cevabının bir kısmını yazmaya karar verdim.

Sorduğum soruda istediğim şey bir tokenizer (lexer) ve bir adet parser yazılmasıydı, fakat birçoğu soruyu anlamadı/çarpıttı ve istenilen cevap ortaya maalesef çıkmadı.

Bir programlama dilini kullanarak yazdığımız kod aslında belirli kurallara uyarak bir araya getirdiğimiz karakterler kümesidir.

Tokenizer, bu karakterler kümesini dilin kurallarını kullanarak interpreterın anlayacağı hale getirir.

Şimdi basit matematiksel ifadelerimizi tokenize etme işlemini yapacağız.

Yapacağımız iş,

(9*3)-1+8*5+(1-3)

şeklinde verilen bir ifadeyi tokenlara ayırmak olacak.

Tokenizer adında bir classımız olsun. Tokenlara ayırmak için verilen expression ımızı teker teker okuyup belirli bir kurala göre tokenize edeceğiz. Kuralımız ise şu, eğer matematiksel bir ifadeye rastlarsa (dört işlem sembolü veya parantez) token olarak ekle, eğer bir sayıya rastlarsa sayı devam ettiği sürece alıp bunu token olarak ekle.

Classımızın 3 adet fieldı var. Birincisi tokenize edeceğimiz expression, diğeri şuanda okuduğumuz char diğeri expressiondaki mevcut pozisyonumuz (kaçıncı karakteri okuduğumuz) sonuncusu ise operation tiplerimizi tutan dictionary tipindeki değişkenimiz. (bu değişken yerine TokenTypes gibi bir enum da tutulabilirdi, farklı şekillerde yapılabilirdi, token tiplerimiz az olduğu için ve kod yazarken kolaylık olsun diye ben dictionary seçtim)

Tokenlarımızı temsil eden classımız :

Kod:
class Token():
    type = ''
    text = ''

    def __init__(self, text, type):
        self.type = type
        self.text = text
Kod:
class Tokenizer():
    expression = ''
    currentChar = ''
    currentCharPosition = 0
Tokenize etme işlemi sırasında bir char ın operation olup olmadığına karar vereceğimiz ve eğer operation ise hangi operation olduğunu söyleyen metodu ekleyelim :

Kod:
class Tokenizer():
    expression = ''
    currentChar = ''
    currentCharPosition = 0

    opTypes = {
        '+' : 'ADD',
        '-' : 'SUBTRACT',
        '*' : 'MULTIPLY',
        '/' : 'DIVIDE',
        '(' : 'LEFT_PAREN',
        ')' : 'RIGHT_PAREN'
    }

    def isOp(self, chr):
        opList = ['+', '-', '*', '/', '(', ')']
        return True if chr in opList else False

    def findOpType(self, chr):
        return self.opTypes[chr]
Şimdi gelelim tokenize metodumuza. Asıl işi burada yapıyor olacağız.

Kod:
    def tokenize(self, resource):
        tokens = []
        token = ''
        state = 'DEFAULT'

        index = 0
        while index < len(resource):
            chr = resource[index]
            index += 1

            if state == 'DEFAULT':
                if self.isOp(chr):
                    opType = self.findOpType(chr)
                    tokens.append(Token(chr, opType))
                elif chr.isdigit():
                    token += chr
                    state = 'NUMBER'
                continue

            if state == 'NUMBER':
                if chr.isdigit():
                    token += chr
                else:
                    tokens.append(Token(token, 'NUMBER'))
                    token = ''
                    state = 'DEFAULT'
                    index -= 1
                continue

        return tokens
- Burada expressionımızdan bir karakter okuyoruz
- Başlangıçta "default" adında bir durumdayız
- Durumumuz default ise okuduğumuz karakterin operation mı yoksa sayı tipinde mi olduğuna bakıyoruz
- Eğer operation tipindeyse, hangi operation olduğunu bulup token listemize ekliyoruz
- Eğer sayı tipindeyse sayıyı token değişkenimize ekleyip, state değişkenini "number" yapıyoruz ve sayının sonuna kadar okumaya devam ediyoruz
- Sayı bitip tekrar bir operation geldiğinde state imizi tekrar değiştiriyoruz ve token oluşturma işlemine devam ediyoruz

Programı bir bütün haline getirelim :

Kod:
class Tokenizer():
    expression = ''
    currentChar = ''
    currentCharPosition = 0

    opTypes = {
        '+' : 'ADD',
        '-' : 'SUBTRACT',
        '*' : 'MULTIPLY',
        '/' : 'DIVIDE',
        '(' : 'LEFT_PAREN',
        ')' : 'RIGHT_PAREN'
    }

    def isOp(self, chr):
        opList = ['+', '-', '*', '/', '(', ')']
        return True if chr in opList else False

    def findOpType(self, chr):
        return self.opTypes[chr]

    def tokenize(self, resource):
        tokens = []
        token = ''
        state = 'DEFAULT'

        index = 0
        while index < len(resource):
            chr = resource[index]
            index += 1

            if state == 'DEFAULT':
                if self.isOp(chr):
                    opType = self.findOpType(chr)
                    tokens.append(Token(chr, opType))
                elif chr.isdigit():
                    token += chr
                    state = 'NUMBER'
                continue

            if state == 'NUMBER':
                if chr.isdigit():
                    token += chr
                else:
                    tokens.append(Token(token, 'NUMBER'))
                    token = ''
                    state = 'DEFAULT'
                    index -= 1
                continue

        return tokens

def main():
    tokenizer = Tokenizer()
    expression = "( 9 *3 )-1+8*5+(1-3)"

    tokens = tokenizer.tokenize(expression)

    for token in tokens:
        if token.type == 'NUMBER':
            print '{} ({})'.format(token.type, token.text)
        else:
            print token.type
Kodumuzu çalıştırdığımızda bize şöyle bir çıktı veriyor :

Kod:
LEFT_PAREN
NUMBER (9)
MULTIPLY
NUMBER (3)
RIGHT_PAREN
SUBTRACT
NUMBER (1)
ADD
NUMBER (8)
MULTIPLY
NUMBER (5)
ADD
LEFT_PAREN
NUMBER (1)
SUBTRACT
NUMBER (3)
RIGHT_PAREN
Tokenize edilmiş sonucumuz. Bu çok simple bir tokenizer. Bir expressionı tokenize ettikten sonra, mantığı anlayıp daha derin bilgiler edindiğinizde aslında bir programlama dili syntaxı oluşturmaya başlıyorsunuz.

Parse etme sürecini de öğrenince aslında çalışan bir programlama diliniz oluyor.

Tabii ki bu tasarlamayı yapmak için context free grammer kavramını, terminal ve non terminal değişkenleri bilmek gerekiyor.

Verdiğim örneklerden yola çıkıp kendinizi geliştirerek programlama dili keywordlerini tokenize eden bir tokenizer yazabilirsiniz artık.

Tokenize etme aşamasında çok farklı teknikler kullanılabilir, matematik dilini baz aldığımız için bu şekilde karakter bazında okuma işlemi bizim için yeterli.

Yeterli ilgi olursa parse etme işlemini ileriki zamanlarda fırsat bulursam anlatabilirim.

Herkese iyi forumlar, ihan3t.

    


__________________

Computer Engineer.

Software Development Specialist.
Offline
 
Alıntı ile Cevapla
Alt 08-08-2017   #2
  • Offline
  • İhbar Hattı Sorumlusu
  • Genel Bilgiler
Üyelik tarihi
Dec 2013
Mesajlar
Konular


  


eline sağlık harika anlatım
    


__________________

Akılca en mükemmeliniz, Allah'tan en çok korkanınızdır.
~HZ.MUHAMMED MUSTAFA (S.A.V)~


Offline
 
Alıntı ile Cevapla
Alt 08-08-2017   #3
  • Offline
  • Yarbay
  • Genel Bilgiler
Üyelik tarihi
Feb 2012
Mesajlar
Konular


  


Teşekkürler. Böyle konular kimse bakmadan aşağılarda kaybolurken top 15 teki troll konuların yukarda olması çok ilginç.
    


__________________

Computer Engineer.

Software Development Specialist.
Offline
 
Alıntı ile Cevapla
Alt 08-08-2017   #4
  • Offline
  • Yarbay
  • Genel Bilgiler
Üyelik tarihi
Jun 2013
Nereden
Jüpiter
Yaş
1
Mesajlar
Konular


  


Alıntı:
ihan3t´isimli üyeden Alıntı Mesajı göster
Teşekkürler. Böyle konular kimse bakmadan aşağılarda kaybolurken top 15 teki troll konuların yukarda olması çok ilginç.
Maalesef öyle üstad.
Eline sağlık, bi şe anlamasam da konu üstte kalsın . Anlayacak birileri illaki vardır
    


__________________


وَقُلْ جَاءَ الْحَقُّ وَ زَهَقَ الْبَاطِلَ إِنَّ الْبَاطِلَ كَانَ زَهُوقَا.

De ki: Hak geldi batıl zail oldu. Batıl yok olmaya mahkum değil midir? (İsra 83)


Offline
 
Alıntı ile Cevapla
Alt 08-08-2017   #5
  • Offline
  • Teğmen
  • Genel Bilgiler
Üyelik tarihi
Mar 2017
Mesajlar
Konular
8


  


Elinize sağlık merak ettiğim ve çözümünü bir zamanlar aradığım konuydu. Çok karışık görünüyor. Aslında kodlar çok düzenli yazılmış ama yeni başlayan biri için şahsen benim için anlamakta biraz zorluk çekmedim değil
    


__________________

Çok çalışmak yerine aklını kullanmak, seni zamandan kazandırır.
Offline
 
Alıntı ile Cevapla
Alt 08-08-2017   #6
  • Online
  • Yüzbaşı
  • Genel Bilgiler
Üyelik tarihi
Jan 2016
Nereden
777
Mesajlar
Konular


  


Eline sağlık üstad.
    


__________________

Thunder is good, thunder is impressive; but it is lightning that does the work.
Online
 
Alıntı ile Cevapla
Alt 09-08-2017   #7
  • Online
  • Yarbay
  • Genel Bilgiler
Üyelik tarihi
Mar 2017
Mesajlar
Konular


  


elinize sağlık cevabımı aldım
    


__________________

Herşeyi Optimize Ederseniz Çok Mutsuz Olacaksınız.

Online
 
Alıntı ile Cevapla
Alt 09-08-2017   #8
  • Offline
  • Yarbay
  • Genel Bilgiler
Üyelik tarihi
Dec 2015
Nereden
Kocaeli
Yaş
8
Mesajlar
Konular


  


Eline Sağlık Ümstat
    
Offline
 
Alıntı ile Cevapla
Alt 09-08-2017   #9
  • Offline
  • Yarbay
  • Genel Bilgiler
Üyelik tarihi
Jun 2015
Mesajlar
Konular


  


Çok güzel ihracatlar yapıyorsun eline sağlık
    


__________________

Man In The Middle

#Kalbimizdesin Solo-Türk
Offline
 
Alıntı ile Cevapla
Alt 09-08-2017   #10
  • Online
  • Üsteğmen
  • Genel Bilgiler
Üyelik tarihi
Aug 2015
Nereden
init.d
Mesajlar
Konular


  


Ohaa hocam anladim cok sagolun
O konuyu carpitan insanlara takmayin (aranizda gecen konusmalari okudum)

Ve gercekten kod yazmayi farkinda olmasamda sizden ogrendim kodlarim genelde cok karisik oluyordu simdi onlari duzelmeye caliaiyorum cok sagolun
    


__________________

Kod:
if (dev.isBored() || job.sucks()) {
    searchJobs({flexibleHours: True, companyCulture: 100});

}

Konu easyly tarafından (09-08-2017 Saat 00:36 ) değiştirilmiştir..
Online
 
Alıntı ile Cevapla
Cevapla

Bookmarks

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 Kapalı
Pingbacks Kapalı
Refbacks Kapalı


Bilgilendirme Turkhackteam.net/org
Sitemizde yer alan konular üyelerimiz tarafından açılmaktadır.
Bu konular yönetimimiz tarafından takip edilsede gözden kaçabilen telif hakkı olan veya mahkeme kararı çıkmış konular sitemizde bulunabilir. Bu tür konuları bize turkhackteamiletisim [at] gmail.com adresine mail atarak bildirdiğiniz takdirde en kısa sürede konular hakkında gerekli işlemler yapılacaktır.
Please Report Abuse, DMCA, Harassment, Scamming, Warez, Crack, Divx, Mp3 or any Illegal Activity to turkhackteamiletisim [at] gmail.com


Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz.
Turkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Turkhackteam sorumlu değildir. Sitelerinize Turkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.



         

Powered by vBulletin® Copyright ©2000 - 2017

TSK Mehmetçik Vakfı

Türk Polis Teşkilatını Güçlendirme Vakfı



Google Links
instagram Takipçi Hilesi

wau

Search Engine Friendly URLs by vBSEO 3.6.0 ©2011, Crawlability, Inc.