Thread overview
Parantezler Sembol Değil mi ?
May 11, 2013
huseyin
May 11, 2013
Salih Dinçer
May 11, 2013
huseyin
May 11, 2013
Salih Dinçer
May 11, 2013
huseyin
May 11, 2013
huseyin
May 12, 2013
huseyin
May 11, 2013

Merhaba

Ben lexerimde kullandığım "(" ve ")" parantezlerini isSymbol ile okumaya çalışıyorum ancak bir çıktı yok acaba onlar ayrı kategoride mi değerlendiriliyor ?
Teşekkürler

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

May 11, 2013

Sanırım, noktalama ile ilgili 1076. satırdaki ''bool'' isPunctuation('dchar' c) '@safe pure nothrow''' (https://github.com/D-Programming-Language/phobos/blob/master/std/uni.d#L1076) işlevini kullanman gerekiyor. Çünkü parantez aç/kapanın koduna listede (http://en.wikipedia.org/wiki/List_of_Unicode_characters) baktığımda 28 ve 29 olduğunu görüyorum. O ise tablePs ve tablePe'de duruyor. Hatta unittest'i de varmış:

   assert(isPunctuation('\u0028'));
   assert(isPunctuation('\u0029'));

Eğer UTF ile çok boğuşmayacaksan bence bunları kullanmana gerek yok. Kendin 'lookup table' yaparsan daha hızlı olacaktr. Baksana ne kadar çok kod üzerinde binary search yapıyorlar. Hatta parantez aç bir tabloda, kapası diğer tabloda. Gereksiz bunlar...:)

Hatta bak benim yeni öğrendiğim yöntem sizlerin çok işine yarayabilir. Geçen gün BufferStack için bir araştırma yapayım dedim. Bugüne kadar Viki'nin yığın maddesini hiç okumamıştım. Bir baktım hazine değerinde bilgiler ile dolu! Şu başlık ilgimi çekti ve zannedersem bu yöntem Talha'nın da ilgisini çekecektir:

Evaluation_of_an_infix_expression_that_is_fully_parenthesized (http://en.wikipedia.org/wiki/Stack_(abstract_data_type)#Evaluation_of_an_infix_expression_that_is_fully_parenthesized)

Hoş, belki de benzer bir şekilde siz zaten yapıyorsunuzdur. Ama kendi uygulamanız için bir yığın sınıfı geliştirip çok güzel ayrıştırma (parser) yapılabilir diye düşünüyorum.

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

May 11, 2013

Hmm o zaman kendim bir fonk üretip bool döndürsem yeterli olacaktır :)

O yöntemi duymuştum ama nasıl yapılacağı konusunda bilgi eksikliği var inceleyeceğim

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

May 11, 2013

Belki aynı yöntemi kullanman hoş olabilir. Sonuçta dili geliştirenler bunun hızlı olduğu neticesine varmışlar. Öyleyse daha sade bir lookup table ile çok daha fazla hız elde etmen mümkün. Modülün en sonunda private olan şu işlevi kullanabilirsin:

bool binarySearch(alias table)(dchar c) @safe pure nothrow
{
   static @property bool checkTableEntry(alias table)()
   {
       foreach(i, entry; table)
       {
           assert(table[i][0] <= table[i][1]);
           if(i < table.length - 1)
               assert(table[i][1] < table[i + 1][0]);
       }
       return true;
   }
   static assert(checkTableEntry!table);

   return binarySearch2(c, table);
}

bool binarySearch2(dchar c, immutable dchar[2][] table) @safe pure nothrow
{
   // Binary search
   size_t mid;
   size_t low;
   size_t high;

   low = 0;
   high = table.length - 1;
   while(cast(int)low <= cast(int)high)
   {
       mid = (low + high) >> 1;

       if(c < table[mid][0])
           high = mid - 1;
       else if(c > table[mid][1])
           low = mid + 1;
       else
           goto Lis;
   }
   Lisnot:
       return false;
   Lis:
       return true;
}

Yukarıda 2 işlev var ve bunlardan ilki yardımcısı, diğer asıl işi yapıyor. Yardımcısı da demeyelim, tabloyu test ediyor. Zaten ikinci işlev de bildiğimiz binary search algorithm. Bunu ise şu şekilde statik bir tablo oluşturarak kullabilirsin:

static immutable dchar[2][] tablomuz = [ //... ];

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

May 11, 2013

Bende basit bir işlev olsun diyerekten

dchar[] tablo=['(',')','.'];

Yapıp bunu aşağıdaki şekilde ara dedim ancak

kod[i] in tablo

Error: rvalue of in expression must be an associative array, not dchar[]
Diye bir hata aldım :)

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

May 11, 2013

Ben şöyle bir çözüm buldum ama siz de bir görün sağlıklı bir çözüm mü acaba ?

bool Sembol(dchar c)
{
	dchar[] tablo=['(',')','.'];
	for(int j=0;j<tablo.length;j++)
	{
		if(c==tablo[j]){goto tr;break;}
	}
	return false;
	tr:
	return true;

}

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

May 11, 2013

Aslında o kadar küçük tablada if-else-if daha hızlı olacaktır.

Hata doğru söylüyor: in'i ancak eşleme tablolarında kullanabiliyoruz. (Senin yaptığını isteyen başkaları da olmuştu.)

true'lara hiç bakılmayacak olduğu için saçma olsa da şu olur:

bool[dchar] tablo=['(':true,')':true,'.':true];

Sonra:

   if (kod in tablo) {

Ama tabii kapama tarafıyla da eşleyeceğin için başka çözümlere bakman gerekecek.

Ali

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

May 11, 2013

Çözüm sağlıklı ama çok daha iyi olabilir. Öncelikle o break hiçbir zaman işletilemez. Ayrıca goto gibi karmaşıklıklar oluşturmak yerine if'in içine doğrudan 'return true' yazılıyor.

Ama daha kolayı var. std.algorithm.find zaten sırayla arar (ama kendisine sortedRange verilirse ikili arar). Tek satır olarak:

   return !find("().", c).empty;

Eğer amaç yalnızca içinde bulunup bulunmadığını anlamaksa canFind daha da kolay:

   return canFind("().", c);

Ama bu tür aramalar işine yarayacak mı gerçekten? Örneğin, herhangi bir sembol olmasından başka, açma parantezine karşılık kapama parantezinin geldiğinden emin olmak isteyeceksin herhalde.

Ali

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

May 12, 2013

evet ben bunu parser e almayı düşünmüştüm eğer sizce uygunsa

if(token[s].tip==Tip.lParen && token[s+1].tip==Tip.rParen)

Şeklinde birşeyler düşündüm umarım doğrudur

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