Dilbilgisi ayrıştırıcı için, ben "oynamak" için kullanılır Bizon Artıları / eksileri olan
Geçen hafta, fark ettim SqLite motorun başka bir dilbilgisi ayrıştırıcısıyla yapıldığı site: Limon
İnce belgeleri okuduktan sonra harika geliyor.
Bu ayrıştırıcı hakkında bazı geri bildiriminiz var mı?
Google ve Wikipedia'da ilgili bilgileri gerçekten göremiyor (sadece birkaç örnek, aynı ders) Çok popüler görünmüyor. (hayır yok Limon Yığın Taşması etiketinde [ed: şuan var: P])
İlginç bulmak! Aslında kullanmamıştım, bu yüzden yorum belgeleri okumaktan ibaret.
Yeniden tasarlama böylece sözcüksel çözümlemenin ayrıştırmadan ayrı olarak yapılması, derhal yeterlidir. Özellikle, çoklu veya iç içe kaynak dosyaları işleme gibi işlemleri basitleştirme potansiyeline sahiptir. Lex tabanlı
yywrap() Mekanizma idealden daha azdır. Tüm global değişkenlerden kaçınması ve dikkatli bir bellek tahsisi ve ayrılma kontrolünün kendi lehine olması gerektiğine inanmaktadır (bu, en azından çalışmayı benimsediğim ortamlarda, bellek tahsisinin her zaman bir sorun olduğu yerlerde), ayrıştırıcı ve borç ayırıcı seçimine büyük ölçüde yardımcı olur. .
Kuralların nasıl organize edildiğini ve terminallerin nasıl tanımlandığının yeniden düşünülmesi iyi bir fikirdir.
Sonuçta, Bison'un iyi düşünülmüş tasarımı gibi görünüyor.
Başvurulan web sayfalarına göre kamu malıdır.
Firmware projemizde Limon kullandığımız nedenler:
- Oluşturulan kodun küçük boyutu ve bellek ayak izi. Bulduğum en küçük ayrıştırıcıyı üretir (esnek, bizon, ANTLR ve Limon tarafından üretilen benzer karmaşıklıktaki parserleri karşılaştırdım);
- Gömülü sistemlerin mükemmel desteği: Limon standart kütüphaneye bağlı değildir, harici bellek yönetimi işlevlerini belirtebilirsiniz, hata ayıklama günlüğü kaldırılabilir.
- Genel alan adı lisansı. GPLv2 kapsamında lisanslı olan ve viral lisans nedeniyle ihtiyaçlarımıza uygun olmayan ayrı bir Limon çatalı bulunmaktadır. Bu yüzden en yeni sqlite kaynaklarını alıyoruz ve Limon'u bunlardan derliyoruz (sadece iki dosyadan oluşuyor);
- Pull-ayrıştırma. Flex / Bison ayrıştırma kodundan daha anlaşılması ve korunması için kodu daha kolay hale getirir. Iplik-güvenlik ek bir bonus olarak hayranım.
- Jetonlarla basit entegrasyon. Bizim proje doğası değişken belirteçleri ile ikili akışının tokenleştirilmesini gerektirir. Uygulanan bir tokenizer kullanımı oldukça kolaydı ve sadece 3 fonksiyon ve bir feedback içerik değişkeni ile parser API ile entegre edildi. Limonun re2c ve Ragel ile bütünleşmesinin yollarını araştırdık ve bunların uygulanmasını oldukça kolay bulduk.
- Öğrenmek için çok basit bir sözdizimi.
- Limon, tokenizer ve sözcüksel analizcinin (ayrıştırıcı) gelişimini açıkça ayırır. Geliştirme akışım, ayrıştırıcı dilbilgisinin tasarlanmasıyla başlar. Bu ilk aşamada birkaç Ayrıştırıcı (...) çağrısı ile örtülü belirteç dizisi içeren karmaşık kuralları kontrol edebiliyorum. Tokenizer daha sonra uygulanır.
Şüphesiz Limon gümüş mermi değildir, sınırlı uygulama alanı vardır. Dezavantajları arasında:
- Limon, basitleştirilmiş sözdizimi nedeniyle Bison'a kıyasla daha fazla kural yazmayı gerektirir: tekrarlama ve isteğe bağlı, kural başına bir eylem, vb.
- LALR (1) ayrıştırıcı sınırlamalarının komple kümesi.
- Sadece C dili.
Seçiminizi yapmadan önce artıları ve eksileri tartın. Benim yaptım ;-)