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. ]
Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
May 11, 2013 Parantezler Sembol Değil mi ? | ||||
---|---|---|---|---|
| ||||
Merhaba Ben lexerimde kullandığım "(" ve ")" parantezlerini isSymbol ile okumaya çalışıyorum ancak bir çıktı yok acaba onlar ayrı kategoride mi değerlendiriliyor ? -- |
May 11, 2013 Parantezler Sembol Değil mi ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to huseyin | 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ış:
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. -- |
May 11, 2013 Parantezler Sembol Değil mi ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | 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 -- |
May 11, 2013 Parantezler Sembol Değil mi ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to huseyin | 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:
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:
-- |
May 11, 2013 Parantezler Sembol Değil mi ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Bende basit bir işlev olsun diyerekten
Yapıp bunu aşağıdaki şekilde ara dedim ancak
Error: rvalue of in expression must be an associative array, not dchar[] -- |
May 11, 2013 Parantezler Sembol Değil mi ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Ben şöyle bir çözüm buldum ama siz de bir görün sağlıklı bir çözüm mü acaba ?
-- |
May 11, 2013 Parantezler Sembol Değil mi ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to huseyin | 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:
Sonra:
Ama tabii kapama tarafıyla da eşleyeceğin için başka çözümlere bakman gerekecek. Ali -- |
May 11, 2013 Parantezler Sembol Değil mi ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to huseyin | Çö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:
Eğer amaç yalnızca içinde bulunup bulunmadığını anlamaksa canFind daha da kolay:
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 -- |
May 12, 2013 Parantezler Sembol Değil mi ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | evet ben bunu parser e almayı düşünmüştüm eğer sizce uygunsa
Şeklinde birşeyler düşündüm umarım doğrudur -- |