LL (k) ve LR (k) dilbilgisi arasında ayrım yapmanın bir yolu var mı?


12

Son zamanlarda Derleyiciler tasarımı üzerine çalışıyorum. Biri LL gramer, diğeri LR gramer olmak üzere iki tür gramer hakkında bilgi sahibi oldum.

Ayrıca her LL dilbilgisinin LL dilbilgisi olan LR olduğunu, LR dilbilgisinin uygun bir alt kümesi olduğunu da biliyoruz. Birincisi yukarıdan aşağıya ayrıştırmada, ikincisi yukarıdan aşağıya ayrıştırmada kullanılır.

Fakat verilen bir dilbilgisinin LL veya LR olduğunu söyleyebilmemiz için herhangi bir yol var mı?


3
ve L R ( k ) tablolarını oluşturmak için kanonik teknikleri kullanmaya ve bunların çakışma içerip içermediğini kontrol etmeye ne dersiniz ? L L ( 1 ) ve L R ( 1 ) genellikle ayrıştırma üzerine herhangi bir standart ders kitabında işlenir; L L ( k ) ve L R ( k ) teknikleri biraz daha bulmak için değil, aynı zamanda iyi bilinmektedir. LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
Alex ten Brink

@AlextenBrink Bu bir cevap verebilir gibi geliyor! (Tekrar hoş geldiniz, kaçırdınız!)
Raphael

Bir dilbilgisinin LL veya LR olup olmadığını kontrol etmek için kanonik teknik kullanmak uzun ama doğru bir yöntemdir. Aho-Lam-Sethi-Ullman'ın Derleyiciler kitabında bulduğum küçük bir yolu bulmaya çalışıyorum.
Deb

Yanıtlar:


11

LL(k)LR(k)LL(k)LR(k)ve bunlar için tablo oluşturabildiğimiz için (ayrıştırma tabloları girdi dizelerini ayrıştırmak için kullanılır). Bu iki sınıf için, ayrıştırma tablosuna sahip olmanın derhal gramerlerin sınıflarda olup olmadığını kontrol etmenize izin verdiğini unutmayın, çünkü bu sadece ve eğer tablolar hata içermiyorsa böyledir. Ayrıca, evet, bir ayrıştırma tablonuz varsa verimli bir şekilde ayrıştırabileceğimiz ancak varsa tabloyu oluşturamayacağımız gramer sınıfları vardır.

LL(1)LR(1)SLR(1)LL(k)LR(k)

LL(k)LR(k)LL(1)kLL(k)LR(k)ya da polinom zamanında çalışma (tablo oluşturma üsteldir). Ayrıntılar için yukarıdaki ders kitabını okuyun. Birçok durumda, tablonun makul büyüklükte olduğunu unutmayın, bu nedenle teste gerek yoktur.

kkLL(k)LR(k)LR(k)kLL(c)ck( ayrıntılar için buraya bakın).


Bir dilin LR (k) olup olmadığını test etmek için polinom-zaman algoritmasının ayrıntılarını nerede bulabileceğimi biliyor musunuz (ders kitabını satın almak dışında)?
user541686

2

Sadece bir dilbilgisinin LL olup olmadığını kontrol etmeliyiz çünkü her LL dilbilgisi LL olan LR'dir, LR'nin uygun alt kümesidir. Eğer bir dilbilgisi LL ise, o zaman LR olmalıdır, ancak her LR LL değildir.

A-> C | D olduğunda dilbilgisi G LL'de bulunur, aşağıdaki koşul geçerli olmalıdır:

  1. İlk (C) ve İlk (D) ayrık kümelerdir.
  2. Boş İlk (D) 'de ise, İlk (C) ve Takip (A)' nın ayrık kümeler olduğu gibi boş İlk (C) 'de olur.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.