February 10, 2013

Salih hocam öncelikle teşekkür ederim.

Alıntı:

>

dünyada adeta uzaylı havası hakim...

haklısınız :)

bitderle projesini biraz inceledim ama bit işlemlerine hazır olmadığımı fark ettim :( Bit kavramlarına aşina olmam için biraz daha zaman geçmesi gerekiyor sanıım. (Foruma ilk geldiğimde bana yazdığınız kodları o zaman hiç anlamamam gibi :) ) Biraz vakit alacak ama anlayacağım :)

ve her nedense aşağıdaki kodu yazınca hata veriyor bir bug olabilir.

typeof(bit.xData) searchData = [ 1 ];//, 137, 137, 137, 3, 143 ];
immutable keyword1 = 0b0001;

Alıntı:

>

Hatta bu sistem script dillerde hatanın olduğu yeri göstermekte çok kullanılır. Belki ileride Rhodeus Script de bu olayı destekler, ne dersin?

Şu anda dilin hata sınıfı vasat seviyede :) Böyle birşeye kesinlikle ihtiyaç var.

Alıntı:

>

Bu arada Zekeriya'nın yazdığını şu şekilde denedim ama bir sonuç elde edemedim. Nerede hata yapıyoruz?

Sanırım biraz hatalı anlattım. Kodu biraz düzenledim. Orada foreach içerisine soktuğumuz s değişkeni aranılan metnin içeriğini tutuyor. Ve tür uyumsuzluğuyla ilgili olarak ilk ve son elemanın adreslerini karşılaştırarak çözüm getirmiştim buna. Belki de bu şekilde yapmak yanlıştır. Gereksiz yere büyük matematiksel işlem yaptırıyoruzdur belki de yaptırmıyoruzdur :) bilemiyorum. Ama şunu itiraf etmeliyim bu konularla uğraştığımdan beri web programcılığı artık ilgimi çekmiyor. Yeni birşey öğrenmek yerine sadece kodunu optimize etmekle uğraşıyorsun ama burada ise bambaşka birşey var :)

import std.stdio;
void main(){
	char[] yorumÖrneği2 = cast(char[]) "/* abc */";

	string s = "*/";
	char* c = yorumÖrneği2.ptr;
	char* size = yorumÖrneği2.ptr + yorumÖrneği2.length;//Size değişkeni için en son elemanın adresini aldım

	string tmp;
	atla:
   while(c < size){
       foreach(i,l; s){
           if(*(c+i) != l) {
				tmp ~= *c;
				c++;
				goto atla;
           }
       }
       c += s.length-1;
       goto atla2;
   }

atla2:
   writeln(tmp);
	while(1){}
}

Alıntı:

>
bit.xData[++offset1..offset2].ushort2str.writeln;

++ yerine aranılan metnin uzunluğunu toplamak gerekiyor. Aksi takdirde araya gereksiz bir karakter kaçıyor.

Alıntı:

>
>
> import std.stdio, std.algorithm;
> import std.datetime;
> import std.string;
>
> class bitDerle {
> 	// BS (BiR SIFIR ~ One Zero)
>     struct BS (data_t = ubyte) {
>         data_t[] xData;
>
>         immutable bl = data_t.sizeof * 8;           // bit length (ubyte => 8)
>         immutable lb = (data_t.max / 2) + 1;        // last bit (ubyte => 128)
>
>         auto mask(data_t rol, data_t lOffset, data_t mLength) {
>             auto maske = data_t.max;
>
>             maske >>= bl - mLength;
>             maske <<= lOffset;
>
>             // partial masking (offset/rolling 2/3 => 0b11100111)
>             // if (rol) maske = ~maske; // invert mask
>             for (; rol>0; rol--) {
>                 maske <<= 1;
>                 maske |= 1;
>             }
>
>             return maske;
>         }
>
>         auto reverse(data_t n) {
>             data_t x = 0;
>
>             for(auto i = 0; i < bl; ++i) {
> 				x <<= 1;
> 				x += n % 2;
> 				n >>= 1;
>             }
>
>             return x;
>         }
>
>         auto invert(data_t xPattern, data_t pLength = 0) {
>             // !!! BAKILACAK !!!
>
>             return ~xPattern;
>         }
>
>         void init(data_t[] data) {
>             xData ~= data;
>         }
>
>         bool read(size_t n) {
>             return (xData[n / bl] & (lb >> n % bl)) != 0;/*
>
>             if((xData[n / bl] & (lb >> n % bl)) != 0) return true;
>             return false;//*/
>         }
>
>         data_t find(data_t xBit) {
>             data_t xHead, xMask, x, xSay = xBit;
>
>             for (x = 0; x <= bl; ++x, xSay >>= 1) if (xSay == 0) {
>                 xMask = mask(0, 0, x);
>                 for (auto bs = 0; bs < (xData.length * bl); ++bs, xHead <<= 1) {
>                     if ((xData[bs / bl] & (lb >> bs % bl)) != 0) xHead |= 1;
>                     xHead &= xMask;
>                     if (xHead == xBit) return cast(data_t)(bs - x + 1);
>                 }
>             }
>
>             return 0;  // not found!
>         }
>
>         data_t write(data_t xOffset, data_t xPattern, data_t pLength) {
>             auto pOffset = cast(data_t)(bl - (xOffset % bl));   // pattern offset
>             auto sOffset = cast(data_t)(pLength - pOffset);     // secondary offset
>             auto lOffset = cast(data_t)(bl - sOffset);          // left offset
>             auto rOffset = cast(data_t)(pOffset - pLength);     // right offset
>             auto xByte  = cast(size_t)(xOffset / bl);
>
>             if (xOffset) {
>                 if (pOffset >= pLength) {
>                     if (pOffset == pLength) {
>                         xData[xByte] &= mask(0, pLength, bl);
>                         xData[xByte] |= xPattern;
>                         return 1;   // shift masking
>                     } else {
>                         xData[xByte] &= mask(rOffset, pLength, bl);
>                         xData[xByte] |= xPattern << rOffset;
>                         return 2;   // rotate masking
>                     }
>                 } else {
>                     xData[xByte] &= mask(0, pOffset, bl);
>                     xData[xByte] |= xPattern >> sOffset;
>
>                     xByte++;   // next byte...
>
>                     xData[xByte] &= mask(lOffset, sOffset, bl);
>                     xData[xByte] |= (xPattern & mask(0, 0, sOffset)) << lOffset;
>                     return 3;  // partial masking
>                 }
>             }
>
>             return 0;  // no change...
>         }
>
>         void print(data_t sb, data_t sr = bl) {
>             for (size_t i = 0; i < xData.length * bl; i++) {
>                 if ((i != 0) && (i % sr == 0)) writef("_");
>                 writef(read(i) ? "1" : "0");
>             }
>             writef("\n");
>
>             for (size_t i = 0; i < sb + (sb / sr); i++) writef("-");
>             if (sb) writef("^\n");
>         }
>     }
> }
>
>
> void a1(){
> 	auto z = std.string.indexOf("qwe/* abc */qwe", "/*");
> }
> bitDerle.BS!(ushort) bit;
>
> void a2(){
>     auto offset1 = bit.find(12074);
>
> }
> // bitDerle sınıfının, BS yapısı, ushort türü ile tanımlanır:
>
> void main() {
>     bit.init(str2ushort("qwe/* abc */qwe"));
> 	writeln(benchmark!(a1,a2)(10_000));
> 	while(1){
> 	}
> }
>
> union ushort2char {
> 	ushort bilgi;
> 	char[2] p;
> }
>
> auto ushort2str (ushort veri[]) {
> 	string rslt;
> 	auto veriler = ushort2char(0);
> 	// veriyi parçalayıp ters sırada birleştirir:
> 	foreach(v; veri[]) {
> 		veriler.bilgi = v;
> 		rslt ~= veriler.p[1];
> 		rslt ~= veriler.p[0];
> 	}
> 	return rslt;
> }
>
> auto str2ushort (string veri) {
> 	ushort[] rslt;
>
> 	for(size_t i; i < veri.length - 2; i+=2) {
> 		rslt ~= cast(ushort)veri[i] << 8;
> 		rslt[$-1] |= cast(ushort)veri[i+1];
> 	}
>
> 	if(veri.length % 2 == 0) {
> 		rslt ~= cast(ushort)veri[$-2] << 8;
> 		rslt[$-1] |= cast(ushort)veri[$-1];
> 	} else { // veri uzunluğu tek ise son bitleri 0 ile doldur:
> 		rslt ~= cast(ushort)veri[$-1] << 8;
> 	}
> 	return rslt;
> }
> ```

>

Benchmark testi yaptığımda bitDerle biraz yavaş kaldı belki de kodu eniyileştirmek gerekiyordur.

Yazdığım kod da indexOf fonksiyonuna göre yavaş kaldı. (2 kat). Ama aslında sıkıntı bence burada 				her seferinde tmp ~= *c; kodunun çalıştırılması.

Bir sorum var elimizde 2 tane char* arasında slice yapabilr miyiz? Aslında yapılacak işlem basit gibi görünüyor.
dizi başlangıcı olarak 1.char* daha sonra 2si arasındaki fark çıkartılıp dizi uzunluğu olarak yazılırsa yapılabilir gibi geldi.

Zekeriya

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

Ve son olarak lexerin son hali burada. Salih hocam inceleyip geri dönüş yaparsanız çok sevinirim :)

https://github.com/Rhodeus/Script2.0

Zekeriya

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

February 10, 2013

Çok güzel görünüyor, eline sağlık...

İncelemek için çok vakte ihtiyaç var. Çünkü bu bir lexer...:)

Ancak işleri kolaylaştırmak gerekiyordu çünkü şu çıktıdan ben hiç bir şey anlamıyordum:

Alıntı:

>

[Token(1, 0, "2"), Token(1, 4, "+"), Token(1, 0, "2"), Token(1, 3, "\n"), Token(2, 1, "a"), Token(2, 28, "+="), Token(2, 1, "a"), Token(2, 35, "++"), Token(2, 4, "+"), Token(2, 0, "2")]

O yüzden ben de enum'a bir isim verdim: lx

Alıntı:

>

[Token(1, NUMBER, "2"), Token(1, PLUS, "+"), Token(1, NUMBER, "2"), Token(1, NEWLINE, "\n"), Token(2, WORD, "a"), Token(2, PLUSEQUAL, "+="), Token(2, WORD, "a"), Token(2, PLUSPLUS, "++"), Token(2, PLUS, "+"), Token(2, NUMBER, "2")]

Şimdi daha anlaşılır öyle değil mi?

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

February 23, 2013

Alıntı:

>

Şimdi daha anlaşılır öyle değil mi?

Evet ama int e geri dönmek zorunda kaldım tekrar. Parser içinde Lexer dakı enumu genişletiyorum çünkü.

Zekeriya

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

February 24, 2013

Bence enum'ları kod yazmayı ve ekranda takibini kolaylaştırmak için kullanabilirsin. İşine gelmeyen noktalarda temel türleri imdadına koşuyorsa böyle devam edersin. Sonra gerektiğinde zaten enum ile karşılıkları alınabilir...

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

1 2
Next ›   Last »