PDA

Tam Sürümünü Görmek İçin : Interpreter hakkında bilgi????


sadist_sniper
29/11/2002, 19:27
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!!!


CrazyCat
29/11/2002, 19:43
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.

sadist_sniper
29/11/2002, 20:04
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.

RaiST
30/11/2002, 23:33
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 :) !

sadist_sniper
01/12/2002, 14:25
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?

CrazyCat
02/12/2002, 09:09
Ö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 :)

RaiST
02/12/2002, 12:09
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

sadist_sniper
02/12/2002, 13:26
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.

RaiST
02/12/2002, 15:17
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

CrazyCat
02/12/2002, 17:45
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ı

/* 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:


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 :)



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 :)

RaiST
02/12/2002, 23:35
postfix notation zaten derslerin bir içeriği. şayet bilmeyen arkadaşımız varsa öğretim döneminde ögrenebilir:)

sadist_sniper
03/12/2002, 14:21
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?

CrazyCat
03/12/2002, 15:16
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 :)

sadist_sniper
09/12/2002, 13:01
teşekkürler :)