2 puan yazan GN⁺ 2024-11-09 | 1 yorum | WhatsApp'ta paylaş

Makrolar

  • Rust makroları, kod tekrarını ortadan kaldırmak ve yinelemeyi azaltmak için kullanılır.
  • sqleibniz içindeki ifade düğümleri Node trait'ini uygulamak zorundadır ve bu da çok fazla kod tekrarına yol açar.
  • Makrolar kullanılarak struct tanımları ve Node trait'i uygulamaları otomatikleştirilebilir.

Kod tekrarını azaltan makrolar

  • Makrolar struct tanımlar, belge yorumları ekler ve Node trait'ini karşılayan fonksiyonları uygular.
  • Makrolar, yinelenen metavariable tanımları aracılığıyla çeşitli alanlar ekleyebilir.

Testler

  • Rust'ta, Go'daki tablo tabanlı testlere benzer bir yaklaşım uygulanabilir.
  • test_group_pass_assert! ve test_group_fail! makroları kullanılarak çeşitli girdi ve beklenen çıktı çiftleri test edilebilir.

Ayrıştırıcı testleri

  • Parser modülünde de benzer makrolar kullanılarak SQL ifadelerinin sonuçları test edilir.
  • EXPLAIN SQL ifadesini test etmek için sql_stmt_prefix fonksiyonu kullanılır.

Makroların dezavantajları

  • rust-analyzer, makroların içinde iyi çalışmaz ve dokümantasyon yetersizdir.

Karakter eşleştirme

  • Rust'ın matches! makrosu kullanılarak karakterler kolayca karşılaştırılabilir.
  • Verilen bir karakterin SQLite sayısı olup olmadığını kontrol eden bir örnek vardır.

Token eşleştirme

  • Lexer, karakter akışını bir token akışına dönüştürdükten sonra parser bunu kullanarak sözdizimi ağacını oluşturur.
  • Token türlerini tanımak için match ifadesi kullanılır.

Hata gösterimi

  • Hata işleme sayesinde kullanıcıya net hata mesajları sunulur.

İsteğe bağlı özellikler

  • Rust'ın Option tipi, bir değerin var olup olmadığını kontrol etmek, koşulları sınamak veya varsayılan değer sağlamak için kullanılabilir.
  • is_some_and, map, map_or gibi metotlar kullanılarak kodun okunabilirliği artırılır.

Yineleyiciler

  • Rust yineleyicileri kullanılarak karakterler filtrelenir ve SQLite'ın sayı ayrıştırma kurallarına uygun şekilde işlenir.

1 yorum

 
GN⁺ 2024-11-09
Hacker News yorumları
  • Rust'ın borrow checker'ı ve bellek yönetiminin zorlukları nedeniyle Rust kullanmakta zorlandı. Rust'ın fonksiyonel programlama (FP) unsurlarını sevdi, ancak başka bir dil aramaya karar verdi. OCaml'ı keşfetti ve bundan memnun kaldı

  • Rust ve PL fikirleri konusunda deneyim eksikliği var gibi görünüyor. AST'yi cebirsel veri tipleri olarak tanımlamanın daha basit olacağını düşünüyor. Makrolar çoğu dilde farklı çalışır, ancak esas olarak kod tekrarını kaldırmak ve yinelemeyi azaltmak için kullanılır

  • Haskell ile yazılmış bir parser, sadelik ve okunabilirlik açısından üstün. Neredeyse BNF gibi okunur ve teknik prosedür neredeyse hiç olmadığı için asıl dilbilgisine odaklanılabilir

  • Ragel, Go, Java, C++, C ile parser yazma deneyimi var. C ile JSON parser yazmak, Rust kodundan daha basit olabilir. Parser altyapısı, eBNF ile parser üretilebilecek doyum noktasına ulaşana kadar gelişti

  • Rust ile bir eBPF disassembler ve emulator yazdı ve Rust'ın parsing işleri için uygun olduğunu düşünüyor. Ancak makro kullanımı, dilin içinde çalışmaktan farklı hissettiriyor

  • Rob Pike'ın Go'da lexical scanning üzerine konuşmasını seviyor. Eğitici ve zarif bir yaklaşım

  • Parser combinator kütüphaneleri kullanılarak yüksek performanslı protocol parser'ları gömülü ortamlara dağıtılabilir. Aynı kütüphaneler gömülü protocol parser'ları yazmak için de kullanılabilir

  • Rust'ta tam bir AST parser'ı yazarken, somut AST tiplerinin hiyerarşisini ifade etmek zordu. Garip type trick'ler ve makrolar kullanmak zorunda kaldı

  • sqlite sözdizimini parse etmek zor bir iş. sqlite ilham verici bir kaynak. Railroad diagram'ları çok faydalı ve Lemon parser generator yeterince takdir edilmiyor

  • Cebirsel veri tiplerine sahip diller, sqlite sözdizimini parse etmek için uygun. TypeScript de iyi bir seçenek olabilir. Rust ile parser yazmanın nasıl yapılacağına dair kısa bir giriş yazdı