Coco/R  aracının Temelinde Scanner işlemi yatıyor. Scanner Bufferdaki veriyi byte byte gezerek anlamlı parcacıklar (token) yakalamaya çalışır.Scanneri yonlendiren bu işaretçiler için yazılan herşeye Scanner Specifications denir.

Character Sets:
Scanner’i  tokenlar içinde yönlendiren temel tanımlamalardır.  Regular Expressiondaki “[ ]” prantezine benzetebiliriz.
“[A-Z]+” ifadesi   için “ABCDEFGHIJKLMO” ayrılmaz bir bütündür scanner hiç durmadan bu terimler üzerinde  gezip bunu tek parça olarak alır.

Örnek Set Tanımlama:

digit       =  “0123456789″.
hexDigit = digit + “ABCDEF”.
letter = ‘A’ .. ‘Z’.
noDigit = ANY – digit.

Örnekten anlaşılabileceği gibi token ve set tanımlamaları object oriented yapısını da destekliyor. digit + “ABCDEF” ile hex blocklarını tanımladık. noDigit kısmında kullandığımız COCO Sabiti “ANY” içine herşey girer. bunlardan digit blokunu cıkardıktan sonra geriye kalan karakterler de içinde rakam geçmeyen yapılar olmuş oluyor

Coco/R aracının grameri derledikten sonra oluşturduğu temel sınıflar :

  • Buffer – UTF8Buffer
  • Errors
  • FatalError
  • Parser
  • Scanner
  • Token

Buffer:
  V Parse edilecek blockları tutan streamdir. Karakterler byte dizisi (byte[]) olarak tutulur ve Scanner sınıfı bu dizide gezerek Token (Dilin anlamlı en küçük parçası) yakalamaya çalışır. yakaladığı her tokenı Parser sınıfında biriktirir ve her yakalamadan sonra “OPERAND” adını verdikleri ana işlemciye gonderir.ve her Operand işleminde bir sonraki token ile yakalanan token beraber işlem görür. UTF8Buffer aracı sayesinde de unicode destekli parserlar yazabilmemize olanak sağlıyor.

Errors:
Collection tabanlı bu sınıf  Scanner tarafından yakalanan syntax hatalarını ve bizim kontrollerimizle oluşan Semantik hataları biriktirir. Sytax hatalarını coco/r  çok güzel yazabiliyor. mantıksal hataları da bizim kontrol etmemiz gerekiyor . Dilin yapısını (Gramer) yazıyoruz coco/r aracı dilin mantığını bilmiyor çünkü.

FatalError:
Errors sınıfından farklı olarak Exception türünden bir sınıftır. Bu hatalar Scanner ya da Parser sınıfının devam edemeyeceği durumlarda fırlatılır Errors collection içine birikmez.

Parser:
İlk okunduğunda parcalama işlemini yapan sınıf gibi gelse de değil. Scanner tarafından yakalanan Tokenları anlamlı blocklara dönüştüren sınıftır. Bu blockları da yorumlayan işlemler yine bu sınıf içinde yapılır.

Scanner:
Buffer üzerinde dolaşarak Token yakalamaya çalışan sınıftır. yakaladığı her token için biriktirme yapmadan  parsera gönderir. Parser kuyruktaki Token’ları yorumlamak için Scanner’i bekler.

Token:
Uygulama kodlarını oluşturan anlamlı en küçük parcaya denir. birbirinden ayrılabilen her parça bir Token kabul edilirken, Token’ların bir araya gelmesiyle oluşan blocklara da Token denilebilir.

Token Tanımlama ile devam edecektir.. İyi çalışmalar…

Merhaba arkadaşlar,
En büyük ilgi alanım olan parsing işlemleri hakkında araştırma yaparken bulduğum ve günlerdir üzerinde araştırmalar denemeler yaptığım bir aracı sizinle paylaşmak istedim. Coco/R  Coco ismi ” Compiler Compiler “‘dan geliyor.compiler yazan bir compiler (:. sonradan kazandırılıan gerçek recursice compiling özelliği ile de /R (recursive descent) ekini almış. Johannes Kepler Üniversitesi Sistem Yazılım Enstitüsü tarafından geliştirilen bu yapı dünyada kabul görmüş ve hemen hemen tüm dillerde (C#, Java, C++, Delphi, Modula-2, Oberon) bu yazılmış . C# versiyonunu denemekte olduğum cocor gerçekten çok yetenekli. özel operatörleri sayesinde compiler yazarken c# dilinden de yararlanabiliyoruz  (C ile yazdığım her kodu istediğimiz dilde compiler kodlarına cevirebiliyor fakat diğer dillerde yazıcaksak o dil için hazırlanmış olan cocor aracını kullanmalıyız ). Yazılım kalıplarında gördüğümüz prototipler syntax şabolonlarını derleyerek bize derleyici kaynak kodlarını yazabilen bir araç .

Cocor ile ilgili aşağıdaki linkleri ziyaret etmenizi tavisye  ederim. Şuan için üzerinde çalıştığım örnekleri buraya yazacağım.

  • Coco/R homepage
  • Coco/R page of Pat Terry
  • Coco/R user manual
  • Coco/R tutorial slides (by Hanspeter Mössenböck)
  • Coco/R Addin for Visual Studio (by Prabir Shrestha)
  • iyi çalışmalar…

    Merhaba arkadaşlar, linq sınıfımda kullandığım metodlarda bugün değişiklikler yaptım. while ile foreach kalıplarını teste soktum . galibimiz forech. while ile yazdığım tüm kalıpları foreach’e dönüştürdüm.  For yerine while tercih ederdim hep daha hızlıdır diye ama bu testimizde for yok. freach ve while var.  150 bin elemanlı bir dizi ile denedim we ikisinde de  aynı işlemleri yaptım şimdi test sonuclarına bakalım.

    ilk önce dizimizi oluşturalım

    0
    
    $bigarray = range(1,150000);

    while($array = each($bigarray)) kalıbını test edelim

    0
    1
    2
    3
    
     while($array = each($bigarray))
        {
          $a = count($bigarray);
        }

    0.457 sn.

    araya list() işlemi de girince pek birşey farketmiyor
    while(list($key,$value) = $array = each($bigarray) ) bu  yapının süresi de  0.492 sn

    şimdi galibimiz foreach’i test edelim aynı dizi üzerinde.

    0
    1
    2
    3
    
    foreach ($bigarray as $key=>$val)
        {
            $a=count($bigarray);
        }

    Sonuç : 0.166 sn bence cok büyük bir fark. iyi çalışmalar…

    Uzun zmandır kullandığım ama birtürlü yayınlanabilir sürümünü yazamadığım ribbonu dün yazdım  (:   şuan için ribbon menünün her özelliğini taşımasa da başlangıc adına yeterli düzeye geldi . sınıf phpclassesta onaylanınca adresini buraya yazacağım. şimdilik bir görüntü ile kaynak kodları vereyimm.

    Örnek Kullanım :

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    include 'd3ribbon.php';
     
    / Ribbon objesi create işlemi
        $ribbon=new d3ribbon();
     
        // stil klasorunun adı
        $ribbon->stlye='blue';
     
        // Ana Kategori
        $main_cat = $ribbon->add_category('D3 Ribbon Main Cat','index.php?component=main_component','main_component');
        // Ana Kategori Grupları
        $grp  = $ribbon->add_group($main_cat,'Group Name',250,'grpid');
        $grp2 = $ribbon->add_group($main_cat,'Group Name 2',250,'grp2');
        // Gruplar içine Butonlar
        $ribbon->add_button($grp,'Users','index.php?component='.$main_cat.'&module=users','image yok','users');
        $ribbon->add_button($grp,'Empooleys','index.php?component='.$main_cat.'&module=employees','image yok','employees');
     
        /**
        * Seçili Kategori ve Butonu işaretleyelim
        */
        $ribbon->selected_category_id = isset($_GET['component']) ? $_GET['component'] :'main_component' ;
        $ribbon->selected_button_id = isset($_GET['module']) ? $_GET['module'] : null;
     
      //ribbon menüyü ekrana basalım
     
    $ribbon->build(false);

    ribbon menünün tüm özelliklerini ve görselliğini kazandırabilmek için yardımcı olabilecek arkadaşlar olursa memnun olurum.
    kaynak kodlar :
    D3Ribbon PHP

    © 2012 Tufan Suffusion theme by Sayontan Sinha