2016-04-09 24 views
0

Haskell dili için ayrıştırılan programın, herhangi bir geçerli Haskell kaynak kodunun herhangi bir ön eki olabileceği ek uyarıyla birlikte bir çözümleyici yazmayı denerim. https://www.haskell.org/onlinereport/syntax-iso.html#sect9.5:Tanımlanmış bir dilin her bir önekini kabul eden Bison dilbilgisi

func x = (x + 

burada Haskell için BNF benzeri özelliği vardır:

Örneğin bu benim durumumda geçerli kaynağıdır.

BNF dilbilgisini böyle bir önek dilini kabul eden bir bizon dilbilgisine dönüştürmenin şematik bir yolu var mı?

Bu alıştırmanın içeriği Emacs editörüdür ve kaynak kodu programın yazılmasıdır, amaç programcı kaynak kodunu yazarken girinti ipuçlarını sağlamaktır.

cevap

1

Bu bir CFG almak ve tüm önekleri maçları bu dil için bir CFG haline dönüştürmek oldukça düz ileri: Her sigara terminali

  • , olmayan ek bir -prefix sürümünü eklemek formun X := A B C her kural için terminali

  • , X_prefix := A B C_prefix | A B | A B_prefix | A | A_prefix

  • tüm terminal_prefix atıfta kuralları ve sonra recursivel silmek formun kurallarını eklemek Y_prefix için Y_prefix'un hiçbir kuralı kalmamış. Eğer LALR (1) ya da bir GLR'yi kullanmak yapmak için gözden geçirmeniz gerekebilir -

Tabii ki, bu yeni YPL LALR (1) kolayca bizon tarafından doğrudan kullanılamaz olmayabilir Uygun birleştirme kuralları ile ayrıştırıcı.

+0

İyi bir fikir gibi görünüyor. Bütün bu XX_prefix prodüksiyonları geri dönmeli mi? –

+0

Geri dönmek istediğiniz her ne olursa olsun, temel kaydırma azaltma çözümleyici, bir dizenin açıklanan dilde olup olmadığını algılar. Bison'un semantik bilgilerini, ayrıştırmaya veya istediğiniz herhangi bir veri yapısına karşılık gelen bir AST oluşturmak için kullanabilirsiniz. –

+0

Bu cevap benim cevabımı kabul etti. Bu _prefix kurallarından ne döneceğimi hala belirsiz, ama bu başka bir araştırmanın konusu. Teşekkürler. –