Bir gramer genellikle olarak tanımlanır Bağlam Ücretsiz dilbilgisi kesin tanım Vikipedi sayfasında verilmektedir, ancak dayanmaktadır PLY, olduğu gibi aynı işleri - Bison sırayla dayanmaktadır, yacc .
Burada PLY'nin bir LALR ayrıştırıcısı kullandığı yazıyor . Bu esas olarak bir olduğunu LR ayrıştırıcı arama tabloları muhtemelen (yani, bir LR ayrıştırıcı bir bağlam bağımsız dilbilgisi ayrıştırabilir), ayrıştırma çakışmaları sokulması LR gramer anlamlılık bir indirgeyici, kondense edilir. Eğer ayrıştırıcıları Bu kolun sınırlamalar ve diğer ayrıştırıcıları olanlar hakkında bilmek istiyorsanız, ayrıştırma teknikleri (LL, LR ve diğerleri) her türlü bir bakış verilir burada .
Sorunuzu cevaplamak için: dil belirsiz olsa da herhangi bir bağlamsız dili ayrıştırma yeteneğine sahip ayrıştırma algoritmaları var (örneğin, girişi yorumlamanın birden fazla yolu var):
O(n3|G|)n|G|
O(n3)O(n2)
Burada , Earley algoritmasının pratik bir uygulamasını (bir uyarlamasını) tartışan bir makale bulabilirsiniz. Sonuca varıyorlar: "Earley ayrıştırmanın LALR (1) ayrıştırmaya göre genelliği göz önüne alındığında ((kabaca PLY'nin yaptığı)) ve PEP'lerin bile ((Earley algoritmasını uyguladıkları)) en kötü zamanın dikkate alınmayacağını düşünerek kullanıcı, bu mükemmel bir sonuç. "
Son ayrıştırıcı türü GLR ayrıştırıcısıdır . Bu, bağlamsız bir dili ayrıştırma yeteneğine sahip LR ayrıştırmanın genelleştirilmiş bir sürümüdür.
GLR'nin olgun bir uygulaması ASF + SDF'dir . Bison, bir GLR ayrıştırıcısı da üretebilir, ancak uygulamaları 'standart' GLR algoritmasından biraz farklıdır. Elkhound algoritması bir GLR / LALR hibrid algoritmasıdır. Herhangi bir grameri hem hızlı hem de ayrıştırma yeteneğine sahip olmak için mümkün olduğunda LALR ve gerektiğinde GLR kullanır.
Bağlamsız dilbilgilerinin ötesinde, içeriğe duyarlı dilbilgileri vardır , ancak bunlar genel olarak ayrıştırılması zordur ve çok fazla ifade katmazlar: ayrıştırmadıkça onlarla daha fazlasını yapabilirsiniz; doğal bir dil.
Son adım olarak sınırsız gramerler var . Bu noktada dilbilgisi Turing tamamlandı, bu nedenle çoğu ayrıştırma uygulamasında istenmeyen belirli bir dili ayrıştırmanın ne kadar süreceği konusunda verilebilecek bir sınır yok. Ekstra güç neredeyse hiç gerekli değildir. Tüm bu gücü kullanmak istiyorsan, mevcut dil makinesi var.
Son olarak, kendi çözümleyici jeneratörünüzü uygulamak, özellikle hızlı olması için önemsiz bir mesele değildir. Şahsen kendi esnek versiyonumu (lexer generator) yapmayı bitirdim ve bu nispeten basit algoritmik problemlerde bir egzersiz gibi görünse de, özellikle Unicode'u desteklemeye çalıştığımda, doğru olmak oldukça karmaşık bir hal aldı. Kendinizinkini yazmak yerine önceden var olan bir uygulamayı kullanmayı düşünün.