Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Interpreter hakkında bilgi????

Konu, 'C / C++' kısmında sadist_sniper tarafından paylaşıldı.

  1. sadist_sniper

    sadist_sniper Daimi Üye

    Kayıt:
    29 Kasım 2002
    Mesajlar:
    500
    Beğenilen Mesajlar:
    0
    Meslek:
    Öğrenci
    Şehir:
    Ankara
    verilmiş olan dosyada şu komutlar bulunmakta;

    function f(int a)
    begin
    int b = 5;
    int c = 2;
    ((b*c)+a);
    end
    function main()
    begin
    int a = 1;
    int b = 2;
    int c = 8;
    ((5 + f(c) ) * b);
    end

    Interpreter olarak kullanılacak bir program yazmam gerekiyo.
    yazdığım program yukarıda, dosyada bulunan kodları alacak ona göre işlemleri yapacak. Bana yardım edebilecek olan varsa bi zahmet. şimdiden teşekkürler!!!
     
  2. CrazyCat

    CrazyCat Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    653
    Beğenilen Mesajlar:
    0
    Meslek:
    lecturer
    Şehir:
    Adana
    Anlamaya çalışıyorum. fakat belki biraz daha yardımcı olabilirsiniz :)

    yeni bir yorumlayıcı mı yazacaksınız?

    kaynak olarak kullanacağın dosya C dili yazım kurallarına göre diil gördüğüm kadarı ile. istediğiniz yeni bir dili mi yorumlamak yada Pascal benzeri (gördüğüm kadarıyle) kaynak dosyayı yorumlamak mı?

    kaynak programda sadece yukarıdaki kodlar mı olacak yoksa bütünüyle yazım kuralları ve komutları içeren bir dil yapısında herhangi bir program da olabilir mi?

    Eğer fonksiyonel bir dil için yeni bir yorumlayıcı yazacaksanız işiniz biraz uzun. ama sadece yukardaki kodlar yorumlanacaksa şu aşamada sadece biraz fikir verebilirim.
     
  3. sadist_sniper

    sadist_sniper Daimi Üye

    Kayıt:
    29 Kasım 2002
    Mesajlar:
    500
    Beğenilen Mesajlar:
    0
    Meslek:
    Öğrenci
    Şehir:
    Ankara
    evet yeni bir yorumlayıcı yazmak istiyorum daha dorusu hocalar istiyo!!
    Yorumlayıcıyı C dilinde yazmam gerekiyo, ama verilen dosya yukarıda yazdığım şekilde yazılmış durumda.
    Olay şu:
    Bize yukarıdaki dosya veriliyo, C de bir yorumlayıcı yazman isteniyo. Bu yorumlayıcı yukarıdaki işlemin sonucu gösterecek.

    Ama bazı yerlerde takıldım.
    Mesela ben dosya içindeki değişkenleri nası tanıtacam?
    Ayrıca fonksiyon cağırma olayına nası becericem?

    Söğlediğim gibi stack yapısı da kullanıcam
    Bir nevi System Stack gibi bişey yapmam gerekiyo!!!
    Fikir verirsen çok sevinirim.
     
  4. RaiST

    RaiST Daimi Üye

    Kayıt:
    24 Temmuz 2002
    Mesajlar:
    1,932
    Beğenilen Mesajlar:
    0
    Meslek:
    linuxrocker
    Şehir:
    krynn
    bak bak kimler varmış burda!
    ben anlatim olayi (nede olsa benimde yapmam lazım!)

    bize verilmiş olan çok basit bir dil yapısı var. amaç onun için basit bir interpreter. verilen dilde basit..

    bu arada sadistcim şu system_stack lafına çok kıl oluyorum. lütfen kullanma :) !
     
  5. sadist_sniper

    sadist_sniper Daimi Üye

    Kayıt:
    29 Kasım 2002
    Mesajlar:
    500
    Beğenilen Mesajlar:
    0
    Meslek:
    Öğrenci
    Şehir:
    Ankara
    raist sen anlat abicim.
    abi orası tamam da verilen dildeki fonksiyonları kullanma şeklini nası yapacağı(z)m?
    nası tanıtcaz biz değişkenleri.
    verilen programda var ya "int a" fln demiş adam.
    onu normal programda nası kullanacağız?
    Sen başladın mı yazmaya?
     
  6. CrazyCat

    CrazyCat Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    653
    Beğenilen Mesajlar:
    0
    Meslek:
    lecturer
    Şehir:
    Adana
    Öncelikle iki adres vereyim bi inceleyin:

    http://root.cern.ch/root/Cint.html

    http://www.ddj.com/articles/

    ikinci adreste arattırmayı deneyin..

    Birkaç Öneri:

    - Nesneye yönelik bir tasarım kullanın. programın tamamı fonksiyonlardan oluştuğu için her fonkisyonu bir nesne olarak düşünün. Fonksiyon problemini ortadan kaldırır.

    - Fonksiyonlar için bir sınıf oluşturursunuz.
    kaynak kodu okutulduğunda her fonksiyon için fonksiyon sınıfından kendi adında nesne yaratırsınız.

    - Hernesnenin bir "Calistir()" metodu olur. kaynaktaki fonksiyonun tipine göre bir değer döndürebilmesi için "fonksiyon ek kullanımı" düşünülebilir.

    - Program işletilirken (yorumlayıcı nın main fonksiyonunda) önce main isimli nesnenin "Calistir" metodu çalıştırılır. kaynaktaki ana fonksiyonda alt fonksiyonlar çağırılıyorsa her fonksiyonun isminin geçtiği kısım fonksiyon->Calistir() olarak değerlendirilir.

    geriye kalan kaynak kodlarını okuturken fonksiyonları ayırıp onlara ait nesneleri oluşturmak. ve her nesneye kendisi ile ilgili kaynak kodlarını aktarmak. için metotlar yazmak.

    Birde Çalıştır metotdunun nasıl işleyeceğine karar vermek.

    ...

    Bunlar sadece bir fikir :) ama başlangıç için fonksiyonlara bir bakış açısı getiriyor.

    Zaman bulabilirsem biraz daha toparlayıp ayrıntılı yazabilirim. Yada kaynak bulabilirsem gönderirim :)
     
  7. RaiST

    RaiST Daimi Üye

    Kayıt:
    24 Temmuz 2002
    Mesajlar:
    1,932
    Beğenilen Mesajlar:
    0
    Meslek:
    linuxrocker
    Şehir:
    krynn
    herşeyden önce okul projeleri yapmak için program yazarken tamamen hocanın sitiline uymak zorunlugulu var.
    ikincisi kullanılan dil C. nesne yonelimli calısmamız mumkun değil. dediğin gibi öyle olsa C++ ile yazsak bariz avantajlar elimize geçecekti.

    ben çözümü bulmak üzereyim
     
  8. sadist_sniper

    sadist_sniper Daimi Üye

    Kayıt:
    29 Kasım 2002
    Mesajlar:
    500
    Beğenilen Mesajlar:
    0
    Meslek:
    Öğrenci
    Şehir:
    Ankara
    Saol Crazy Cat, çok teşekkür ederim ama object oriented dil kullanmamaktayız raist in de sölediği gibi.

    Raist, bulmak üzere olduğun çözümü bulursan bi zahmet gözüm.
    bu arada ben bi yöntem buldum gibi.
    Her satırı ayrı bi string e kopyalasak ona göre değişkenleri bi stack e, değerlerini bi stack e atsak nası olur?
    ondan sonra infix i postfix e çeviririz ordan da yaparız olayı nası fikir?
    Tekrar Teşekkürler.
     
  9. RaiST

    RaiST Daimi Üye

    Kayıt:
    24 Temmuz 2002
    Mesajlar:
    1,932
    Beğenilen Mesajlar:
    0
    Meslek:
    linuxrocker
    Şehir:
    krynn
    benim hakandan öğrendiğime göre şöyle bir yöntem izlemiş hakan ile veli..

    bir stack kullanmışlar ama stack olmayan bir stack :)
    bir linked list kullanmışlar daha dogrusu..
    butun degiskenleri ve degerlerini stack benzeri linked liste:) atmislar.
    2. bir gercek stackde ise aritmetik islem yapılarak cozum saglanabilir
     
  10. CrazyCat

    CrazyCat Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    653
    Beğenilen Mesajlar:
    0
    Meslek:
    lecturer
    Şehir:
    Adana
    Kaynak dildeki matamatiksel işlemleri icra etmek için Sondan Gösterim(postfix representation) yönteminden faydalanabilirsiniz. Sanırım nasıl olduğunu biliyorsunuzdur.
    Bu yöntemi kullanmak için bir yığıt yapısı oldukça uygun. Yığıt kullanarak yapacaksanız algoritma şöyle olabilir:

    1) Verilen ifadenin birinci elemanından sonuncu elemanına kadar:

    1.1) Sıradaki eleman eğer bir arguman ise,

    1.1.1) Bu elemanı yığıta koy.

    1.2) Sıradaki eleman bir operatör ise,

    1.2.1) Yığıttan sırayla iki eleman al.

    1.2.2) Bu iki eleman üzerinde operasyonu uygula.

    1.2.3) Sonucu tekrar yığıta koy.

    Hatta size basit bir örnek verebilirim.

    Örnek Yığıt Yapısı
    Kod:
          /* STACKSIZE yığıtın en fazla alabileceği eleman sayısını gösteren sabit */      
    #define STACKSIZE 100            
    struct Stack{                     
             int top;                                     
             int nodes[STACKSIZE];                                  
             };                   
    struct Stack *create_stack(struct Stack *ps);          
    void push(struct Stack *ps,int i);          
    int pop(struct Stack *ps);          
    int empty(struct Stack *ps);          
    int full(struct Stack *ps);
    
    Yığıt yapısının gerçekleştirimi:

    Kod:
    struct Stack *create_stack(struct Stack *ps)       
    {
             ps=malloc(sizeof(struct Stack));
             ps->top=-1;         return ps;
    }
    void push(struct Stack *ps,int i)
            {
                if ( full(ps) )
                 printf("Yığıt dolu, eleman yerleştirilemedi.\n") ;
                 else 
                   { ps->top++; ps->nodes[ps->top] = i;}
            }
    int  full(struct Stack *ps)
               {return (ps->top== (STACKSIZE -1));}
    int  pop(struct Stack *ps)
            {
                  if ( empty(ps) )
                       printf("Yığıt boş, eleman alınamadı.\n") ;
                   else
                       { int t= ps->nodes[ps-> top] ; ps->top--; return t;}
            }               
    int empty(struct Stack *ps)
            {return (ps->top== -1);}
    
    
    postfix representation kullanımı için örnek program.

    expression ların hepsi bir dizide toplanır dizinin adıda expression[] olur :)

    her bir ifadenin içreikleri ise value[] dizisindedir

    Örneğin

    expression[]="DB*FD-/"
    value[]="123465"

    aşağıdaki kod yukarda tanımlı stack yapısını kullanarak işlemin sonucunu verir :)

    Kod:
    
    for (i=0; i < expr_size; i++)
    switch (expression[i])    
    {
    case '+' :
        O1 = pop(S1);
        O2 = pop(S1);
        push(S1,O1+O2);
        break;
    case '*' :
        O1 = pop(S1);
        O2 = pop(S1);
        push(S1,O1*O2);
        break;
    case '-' :
        O1 = pop(S1);
        O2 = pop(S1);
        push(S1,O2-O1);
        break;
    case '/' :
        O1 = pop(S1);
        O2 = pop(S1);
        push(S1,O2/O1);
        break;
         default : // push the argument back to stack
        push(S1,value[ expression[i] - 'A' ]);
    }
    printf("result: %d\n" pop(S1));
    
    
    sizin yapacağıız şey kaynak koddaki ifadeleri postfix representation a çevirmek :)

    tabi fonksiyon kullanımı için nene yönelimli çözümü ısrar etmek isterdim :D ama yapısal olarak da yapmak mümkün.

    yukardaki anlatım (gerçek :D) stack yapısı kulanarak parantezli ifadelerin postfix representation (sondan gösterim) metodu ile hesaplanması için sadece.

    kaynak kodu okuyup sondan gösterime çevirmek için ise yapacağınız iş çok basit anahtar kelimeleri ve işaretleri attıktan sonra paratezleri yok sayıp her operatörü ikili argumanın arasından çıkarıp sonuna yerleştirerek expression dizisine atmak gibi bişey.

    Umarım istediğiniz bunun gibi bişey dir.
    kolay gelsin :)
     
  11. RaiST

    RaiST Daimi Üye

    Kayıt:
    24 Temmuz 2002
    Mesajlar:
    1,932
    Beğenilen Mesajlar:
    0
    Meslek:
    linuxrocker
    Şehir:
    krynn
    postfix notation zaten derslerin bir içeriği. şayet bilmeyen arkadaşımız varsa öğretim döneminde ögrenebilir:)
     
  12. sadist_sniper

    sadist_sniper Daimi Üye

    Kayıt:
    29 Kasım 2002
    Mesajlar:
    500
    Beğenilen Mesajlar:
    0
    Meslek:
    Öğrenci
    Şehir:
    Ankara
    saol crazy cat,
    peki:
    function f(int a)
    begin
    int b = 5;
    int c = 2;
    ((b*c)+a);
    end
    function main()
    begin
    int a = 1;
    int b = 2;
    int c = 8;
    ((5 + f(c) ) * b);
    end
    verilen bu kodda, fonksiyon main fonksiyonundan bi değer alıyo gördüğün gibi, bu değeri fonksiyona nasıl tanıtacağım?
    Yani postfix ifadeye çevirdikten sonra işlem yaparken nasıl bir yol izlemek zorundayım?
     
  13. CrazyCat

    CrazyCat Daimi Üye

    Kayıt:
    25 Temmuz 2002
    Mesajlar:
    653
    Beğenilen Mesajlar:
    0
    Meslek:
    lecturer
    Şehir:
    Adana
    fonksiyonları da birer operator olarak dusun. !

    Vakit bulursam ayrıntılı bişeler yazmaya çalışırım. Ama Fonksiyonları birer operator olarak kabul edersen doğru bir yol bulabilirsin.

    kolay gelsin :)
     
  14. sadist_sniper

    sadist_sniper Daimi Üye

    Kayıt:
    29 Kasım 2002
    Mesajlar:
    500
    Beğenilen Mesajlar:
    0
    Meslek:
    Öğrenci
    Şehir:
    Ankara
    teşekkürler :)