Jump to page: 1 24  
Page
Thread overview
February 16, 2013

RhS'de matematiksel işlemlerdeki işlem önceliğini dikkate alarak hesaplama yapabilmek için bir algoritma geliştirdim.

Kodların çok başarılı olduğunu düşünmüyorum belki siz değerli hocalarım bu konuda bana yol gösterebilirsiniz :)

Kodları https://github.com/Rhodeus/Script2.0 adresine attım.

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 16, 2013

Önceki sürüm ile karşılaştırdığımızda ilk olarak;

const int tokencount = COMMENT + 1;

Satırını eklediğini gördüm. Tabi isimsiz bir enum'a sahip olduğun için böyle yapmak zorunda kaldığını düşünüyorum. Bundan önceki başlıkta bahsettiğim gibi buna bir isim vermelisin. Belki o zaman her şey daha kolay ve düzenli olur. En azından test çıktıları daha anlaşılır olacağı kanaatindeyim. Bu durumda, o satıra ihtiyaç duymaz veya şunun gibi dinamik bir hale getirebilirdin:

const int tokencount = cast(int)lx.max + 1;

Tamam, şimdi diyeceksin ki o zaman isimsizleri pratik bir şekilde tıpkı C'deki #define gibi kullanabiliyorken ne gerek var buna...:)

Oysa iki yere with koymak seni fazla uğraştırmayacaktır:

 :   :   :

	this(){
		chars= ['n': '\n', 't': '\t', 'r': '\r', 'a': '\a','f': '\f', 'b': '\b', 'v': '\v', '\"': '\"','?': '?', '\\': '\\', '\'': '\''];

	with(lx) {
		lexmap = [
			'+': LexMap(PLUS, [
				'+': LexMap(PLUSPLUS),
				'=': LexMap(PLUSEQUAL)
			]),

 :   :   :

			';': LexMap(SEMI),
			':': LexMap(COLON),
		];
 } // <---- bunu unutma

 :   :   :

	Token[] lexy(){
		auto c = codes.ptr;
		string tmp;

		while (c<size) with(lx) { // <--- bu şekilde olunca kapama gerekmeyecek...

 :   :   :

Token yapısının son hali de aşağıdaki gibi olmuş. Görünüşe göre val diye bir işaretçi dışında türleri ilk değerlerine eşitlemişsin. Bence bir eşitlik vermeye gerek yok çünkü C'den farklı olarak varsayılan ilk değerleri tanımlandığı için yapı kurulurken ilkleniyorlar. Tabi val'ı nerede kullandığını göremedim. Herhalde ilerisi için düşünülüyor. Ayrıca bunu class içine mi almaya çalıştın? Çünkü fazladan bir kapama karakteri ( } ) gördüm de...

	struct Token{
		ulong line = 0;
		uint typ = 0;
		string value = "";
		void* val;
	}

Son olarak dediklerimi yaparsan şu test kodu çok işimize yarayabilir:

import lexer;

void main(){
	auto lexer = new Lexer();
	lexer.load("2 + 2\n a += a++ + 2");
	auto lexed = lexer.lexy();
	"#\tSatır\tTür\t\tİçerik".writeln;
	foreach(i, lex; lexed) {
	  (i+1).write('\t');
	  lex.line.write('\t');
	  writef("%s\t\t", cast(lx)lex.typ);
	  writef("%s\n", lex.value);
	}
}/*
#	Satır	Tür		İçerik
1	1	    NUMBER		2
2	1	    PLUS		+
3	1	    NUMBER		2
4	1	    NEWLINE

5	2	    WORD		a
6	2	    PLUSEQUAL		+=
7	2	    WORD		a
8	2	    PLUSPLUS		++
9	2	    PLUS		+
10	2	   NUMBER		2
*/

Başarılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 17, 2013

Diğer konuya mesaj yazdığınızı görmemişim :) haklısınız hız olarak bir fark olur diye düşündüm o yüzden isim vermemiştim :)

Söylediğiniz değişiklikleri yaptım böyle daha iyi oldu dediğiniz gibi :)

Alıntı:

>

Nereye bakmalıyız?

Github sayfasına :)

Alıntı:

>

Tabi val'ı nerede kullandığını göremedim

Parser içerisinde kullanıyorum.

https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-prn1/560195_143342625829026_777539982_n.png

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 16, 2013

Nereye bakmalıyız? :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 17, 2013

Öncelikle, bende parser.d'nin 107. satırı için küçük bir dönüştürme işlemi gerekti:

   opLevel = opLevels[cast(lx)token.typ];

Sonra zor bir örnek denediğimde beklediğim gibi bir şeyler karıştı...:)
'
[atelyeweb@sdb rhs2]$ dmd main lexer parser
[atelyeweb@sdb rhs2]$ ./main 1+2*(6/2)

Satır Tür İçerik

1 1 NUMBER 1
2 1 PLUS +
3 1 NUMBER 2
4 1 TIMES *
5 1 LPAREN (
6 1 NUMBER 6
7 1 DIVIDE /
8 1 NUMBER 2
9 1 RPAREN )
40 beklenmiyordu
'
Çünkü cevabın 9 olması gerekiyordu. Soldan sağa işlem ve parantez önceliği dikkate alınırsa; toplam ifadesi ve parantez içi ifade 3 olacağı için sonuç 9'dur: http://www.wolframalpha.com/input/?i=6%2F2*%281%2B2%29

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 17, 2013

Hocam algoritmada parentezlerle ilgili birşey yok :) O yüzden parantez kullanamazsınız.
Alıntı:

>

Öncelikle, bende parser.d'nin 107. satırı için küçük bir dönüştürme işlemi gerekti:
opLevel = opLevels[cast(lx)token.typ];

struct Token{
		ulong line;
		lx typ;
		string value;
		void* val;
	}

struct içerisinde typ lx olarak belirtili gerek varmı ona?

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 17, 2013

O tamamsa şu örnek de güzeldir...:)
Alıntı:

>

2 / (3 / 4) * 3 * 2 = 4^2 = 16

Alıntı (zekeriyadurmus):

>

Hocam algoritmada parentezlerle ilgili birşey yok :) O yüzden parantez kullanamazsınız.

Parantez kullanallım o zaman...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 17, 2013

Parantez kullanımı olacak ama şu anki halinde hatalar var hata üstüne hata olmaması lazım :)

Sistem baştan ne kadar sağlam olursa ilerisi için de o kadar iyi olur diye düşünüyorum :)

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 17, 2013

Hocam mesela bir soru sormak istiyorum.

calcd ~= calc(operator, t1, subCalcIt(t2, cOpLevel));
t1 = Token(line, p.calc, "",&calcd[$-1]);

Token'a calc structının adresi gönderiliyor. Ayriyetten

Alıntı:

>

auto calcd = calc(operator, t1, subCalcIt(t2, cOpLevel));
t1 = Token(line, p.calc, "",&calcd);

kodu bu şekilde yazdığımda da hata veriyor çünkü fonksiyon bittikten sonra struct siliniyor.

Buna karşı ne yapılabilir?

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 17, 2013

Alıntı:

>

Ama D için en güzeli, Philippe Sigaud'un Pegged modülü:

Ali hocam böyle hazır bir şey kullanabilirim ama benim işime gelmez çünkü hız, çıktı formatı, giriş değerleri önemli benim için. Ayriyeten bu ifadelerin içerisinde 2 + asd()[a() + 2] + 5 gibi bir ifade olacak kendi yaptığımda bunu ayırt edebilirim.

auto tmp = new calc(operator, t1, calcIt(t2, cOpLevel));
t1 = Token(line, p.calc, "",&tmp);

hocam bunu da denedim ama olmadı :(

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2 3 4