SORU
28 EKİM 2008, Salı


Neden't C(1) LR parser ile ayrıştırılabilir?

Ayrıştırıcıları ve ayrıştırıcı jeneratör hakkında okuyordum ve wikipedia bu deyimi LR ayrıştırma-sayfa buldu

Birçok programlama dilleri ayrıştırılmış LR parser bazı varyasyon kullanılarak yapılabilir. Bunun bir istisnası C .

Neden böyle? Ne özel mülkiyet C imkansız LR ayrıştırıcıları ile ayrıştırmak için neden olur?

Google kullanarak, ben sadece C mükemmel LR(1) ile ayrıştırılabilir buldum ama C LR (I. g) gerektirir.

CEVAP
17 HAZİRAN 2009, ÇARŞAMBA


LR ayrıştırıcıları belirsiz dilbilgisi kuralları, tasarım ile başa çıkamaz. (Fikirler işe yaradı olduğu 1970'lerin teori kolaylaştırdı).

C ve C aşağıdaki ifadeyi sağlar:

x * y ;

İki farklı çözümler vardır:

  1. X türü için bir işaretçi olarak y Bildirgesi olabilir
  2. X çarpma ve bir y, cevap atmak olabilir.

Şimdi, ikincisi aptal ve göz ardı düşünebilirsiniz. Çoğu; ancak, olabilir durumlar vardır katılıyor yan etki (çarpma aşırı örneğin,). ama konu bu değil. Nokta variki farklı ayrıştırır, ve bu nedenle bir program farklı şeyler anlamına gelebilir ne kadar bağlı bugerekirayrıştırılır.

Derleyici gerektiğini kabul etmek uygun bir altında uygun koşullar, ve yokluğunda diğer bilgileri (örneğin, bilginin tip x) gerekir toplamak amacıyla her iki karar daha sonra ne yapacağımı. Böylece bir dilbilgisi bu izin vermelidir. Ve bu gramer belirsiz hale getirir.

Böylece saf LR ayrıştırma bunu kaldıramaz. Ne de yaygın olarak kullanılabilir diğer birçok ayrıştırıcı jeneratör, Antlr, JavaCC, YACC, ya da geleneksel Bizon, ya da PEG-stili ayrıştırıcıları gibi, bir "" şekilde. saf olarak kullanılabilir

Daha karmaşık durumlarda (şablon sözdizimi ayrıştırma LALR(k) en k belirteçleri de önüne bak ise keyfi ilerleme gerektirir) vardır, ama sadece tek counterexample aşağı çekmek için alırsafLR (veya diğerleri) ayrıştırma.

En gerçek C/C ayrıştırıcıları bazı kullanarak bu örnek, kolu fazladan hack ile biraz deterministik ayrıştırıcı: onlar iç içe sembol tablo ile ayrıştırma koleksiyon... "x" ile karşılaştı çözümleyici eğer x türü ise bilmiyor ya da değil, ve böylece iki Olası çözümler arasında seçim. Bir çözümleyici ama işte bu nedenle, özgür değildir, ve ayrıştırıcıları LR yapar (saf olanlar, vb.) (en iyi) kapsamında ücretsiz.

Bir hile ve azaltma önerisi kontrolleri ekleyebilirsiniz LR bu anlam ayrımı yapmak ayrıştırıcıları. Diğer ayrıştırıcı türlerinin çoğu çeşitli noktalarda semantik kontrolleri eklemek için bir anlamı var ayrıştırma, bunu yapmak için kullanılabilir.

Ve eğer yeteri kadar hile yaparsan, LR ayrıştırıcıları için iş yapabilirsiniz C ve C . GCC çocuklar bir süre yaptı, ama o verdi el-kodlu ayrıştırma için, onlar istedi diye düşünüyorum daha iyi hata tanılama.

Güzel ve temiz olan başka bir yaklaşım, ancak, aşağıda ve ayrıştırır C ve C herhangi bir sembol tablo olmadan gayet iyi hackery: GLR parsers. Bu tam bağlam ücretsiz ayrıştırıcıları (etkili olması sonsuzdur ileri yönlü). Yeşil hat tüzüğünü ayrıştırıcıları sadece kabul edinher ikisi deayrıştırır, bir "" (aslında çoğunlukla ağaç gibi yönetti döngüsel bir grafik) ağaç üretimi bu belirsiz ayrıştırma temsil eder. Post-ayrıştırma pas belirsizlikleri gidermek olabilir.

C Bu teknik ve C bizim için ön uçları kullanıyoruz DDS Yazılım Mühendisliği Tookit (Şubat 2014 bu ve lehçelerde MS GNU) tam 14 C kolu. Satır milyonlarca işlemek için kullanılmıştır tam, kesin ayrıştırır kaynak kodunun eksiksiz detayları ASTs üreten büyük C ve C sistemleri.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • adrianisen

    adrianisen

    25 Kasım 2009
  • andony5589

    andony5589

    7 Aralık 2011
  • Gali B

    Gali B

    1 EYLÜL 2006