2011-12-15 16 views
5

Bir çözümleyici oluşturmak için Bison kullanıyorum. Anlaşmak için LALR yerine GLR kullanmak için gerçekten Bison'a ihtiyacım olan bir vardiya/azaltma şansım var. Ama ben %glr-parser yönergesini geçtim ve kaynak dosya hala bir LALR ayrıştırıcısı olduğunu belirtiyor. Hatta bir GLR C++ ayrıştırıcısı olduğunu ve %skeleton "glr.cc" kullanarak çıktıyı değiştirmediğini öneren bir "glr.cc" iskeleti buldum. Bison, tüm hedef dilleri için tüm algoritmaları göndermiyor mu?C++ Bison ile GLR ayrıştırıcıları

+0

bison ücretsiz bir yazılımdır, bu yüzden soruları kodunuzu inceleyebilir ve geliştirebilirsiniz. Bu arada, ANTLR gibi başka bir ayrıştırıcı jeneratörü kullanmayı düşündünüz mü? –

+1

@Basile: Dilbilgisi LL değil. Kaynak kodunu iyileştirmek için, demek istediğim, altı milyar destek aracıyla kamyon almak istiyorsam. – Puppy

+0

ANTLR, bazı LL olmayan dilbilgisi türleriyle uğraşmak için çeşitli kesmelere sahiptir. –

cevap

1

Sadece bir GLR çözümleyici almak için %glr-parser gerekir. GLR ayrıştırıcılarının STILL'lerin çatışmaya (kayma/azaltma veya azaltma/azaltma) sahip olabileceğini, sadece oluşturulan çözümleyicinin her iki alternatifi de deneyip sonucu birleştireceğini unutmayın.

Çakışmalarla ilgili iletileri kapatmak istiyorsanız, %expect ve %expect-rr'u kullanabilirsiniz. Sadece, tüm çatışmaların ne olduğunu anlayamadığınız bir GLR çözümleyicisini körü körüne kullanmaktan çekinmeyin. Sonuçta ortaya çıkan ayrıştırıcı, dikkatli değilseniz bazı girişleri ayrıştırabilir veya çalışma zamanında size belirsizlik hataları verebilir.

+0

Bu gerçekten soruya cevap değil - Ben '% glr-parser' – Puppy

+0

@DeadMG denedim dedi: o zaman bir GLR çözümleyici var. Sadece bu GLR ayrıştırıcıları LALR ayrıştırıcıları ile çatışmaları aynı şekilde değiştirir/azaltır ve azaltır/azaltır, sadece onlarla farklı bir şekilde ilgilenirler. –

+0

Ben bir tane yoktu demedim çünkü hala çatışmalar rapor etti, ben hala bir tane vardı çünkü kaynak dosyanın yorumları hala öyle söyledi. – Puppy

1

"%skeleton "glr.cc" çıktıyı değiştirmediğini" ne demek istediğimi bilmiyorum, çünkü bunu yapıyor! Çıkışı gerçekten değiştirdiğinden emin misin? Eğer yaptıysanız, lütfen daha fazla bilgi verin.

$ echo "%% exp: '0'" > /tmp/f.y 
$ bison -S lalr1.cc /tmp/f.y -o f1.cc 
$ bison -S glr.cc /tmp/f.y -o f2.cc 
$ ls -l f1.cc f2.cc 
-rw-r--r-- 1 akim wheel 28373 30 oct 09:29 f1.cc 
-rw-r--r-- 1 akim wheel 82767 30 oct 09:29 f2.cc