Düzenli ifadeler


16

Tip 3 Dilbilgisi varsa, aşağı açılan bir otomatta (yığın üzerinde herhangi bir işlem yapmadan) temsil edilebilir, böylece bağlamsız dilleri kullanarak düzenli ifadeleri temsil edebilirim. Ama tip 3 dilbilgisinin ayrıştırma tablosu oluşturmadan , L L ( 1 ) , S L R ( 1 ) vb.LR,(1)LL(1)SLR,(1)

Yanıtlar:


15

Tüm normal dillerde LL (1) dilbilgisi vardır. Böyle bir dilbilgisi elde etmek için, normal dil için herhangi bir DFA'yı alın (belki de normal ifadeden elde edilen NFA'da alt küme yapısını yaparak), daha sonra bunu tekrarlayan düzenli bir dilbilgisine dönüştürün. Bu dilbilgisi LL (1) 'dir, çünkü aynı nonterminal için herhangi bir prodüksiyon ya farklı sembollerle başlar ya da biri ε üretir ve bir ileriye doğru belirteci olarak $' a sahiptir. Sonuç olarak, tüm normal diller de LR (1) 'dir, çünkü herhangi bir LL (1) dilbilgisi LR (1)' dir. Ayrıca, bu makaleden önemli bir sonuç kullanarak , herhangi bir LR (1) dilinin bir SLR (1) dilbilgisi olduğunu, yani herhangi bir normal dilin bir SLR (1) dilbilgisine sahip olduğunu gösterebilirsiniz.

Ancak, normal dillerin tümü LR değildir (0). LR (0) dilleri çok özel özelliklere sahiptir - özellikle de önek içermemelidir. Dolayısıyla, normal dil (a, aa} LR (0) değildir, ancak açıkça düzenlidir (normal ifade a | (aa)). Bununla birlikte, LR (0) dilleri normal dillere uygun şekilde dahil edilmemiştir; {0 n 21 n için bu dilbilgisi | n ≥ 1} LR (0) dır, ancak dil normal değildir:

S -> E
E -> 0E1 | 2

Bu yardımcı olur umarım!


2
Doğru-düzenli dilbilgilerinin tam olarak düzenli dil setini kabul etmesi, genellikle sınıfta (hatta alıştırmalarda) yapılır, bu yüzden cevap çok daha yakındır.
Raphael

2

(Düz eski) normal ifade sözdizimi ("temsil" dediniz) LR (0) 'dır. Normal ifadeyi temsil eden bir dizeyi ayrıştırmak için herhangi bir ileriye ihtiyacınız yoktur. Regexes için bir dilbilgisi üzerinde bir ayrıştırıcı jeneratör çalıştırarak kolayca karar verebilirsiniz: -} Ayrıca regexps için basit bir özyinelemeli iniş (LL (0)) ayrıştırıcı kolayca kodlayabilirsiniz; LL (0) olan herhangi bir şey LR (0) 'dır.

Perl gibi daha karmaşık sözde "regexps" sözdiziminin böyle olup olmadığını bilmiyorum; ancak Perl'in normal ifadeleri normal ifadelerden kesinlikle daha güçlüdür, bu yüzden düz eski normal ifadeler değildir.

Bir dilbilgisinin bir özelliği olup olmadığını belirlemek için bir tür yüklem çalıştırmanız gerekir. (S) LR (k) olup olmadığını belirlemek için, o özelliği kontrol edebilecek bir yüklem çalıştırmanız gerekir. Aslında, bu tür herhangi bir yüklem, tanımlanma biçimleri nedeniyle aslında ayrıştırma tablolarını oluşturmalıdır.


Perl düzenli ifadeleri NFA üzerinde çalışıyor

Soru, Perl normal ifadelerinin nasıl çalıştığıyla ilgili değildi. Regexps'in (Perl?) Regexps'lerinin belirli teknolojiler tarafından ayrıştırılıp ayrıştırılamayacağıyla ilgiliydi. Perl regexps'in, içeriğe duyarlı diğer bazı veri yakalamalarıyla birlikte eşleşmelerini yapmak için bir NFA kullandığına inanabilirim, ancak sorunun ilgisini görmüyorum.

3
-1 normal ifadelerdir değildir (0) LR. LR (0) dilleri önek a|(aa)içermemelidir , ancak normal ifade önek içermeyen bir dili tanımlar. Ek olarak, LR (0) dilleri epsilon yapımları ile dilbilgilerini işleyemez, bu nedenle normal dil {epsilon, a} LR (0) değildir. Ancak normal diller şunlardır normal grammars olarak yazabiliriz çünkü LL (1) ve dolayısıyla hepsi LR (1) bulunmaktadır. Herhangi bir LR (1) dili bir SLR (1) dilbilgisine sahip olduğundan, bu, tüm normal dillerin SLR (1) olduğu anlamına gelir.
templatetypedef

1
LL (0) ile ilgili olarak, tam tersi: LL (0) dilleri, normal dillerin uygun bir alt kümesidir. LL (0), farklı türevler arasında karar vermek için ileriye bakmadığınız anlamına gelir - bu temelde hiçbir karar olmadığı ve dilin tek bir sözcükten oluştuğu anlamına gelir. LR (0), aksine, yararlı bir sınıftır - yine (kararlar için) karar vermek için ileriye bakmıyorsunuz, ancak kaymanın farklı yapımları ayırt edebilmesi nedeniyle hala bazı çeşitlilik var.

1
@ IraBaxter- Normal ifadelerin sözdizimi LR (0) değildir, çünkü normal ifadeler önek içermez. LL (0) da değildir, çünkü LL (0) dilleri yalnızca tek bir dize içerebilir (veya dize içermez).
templatetypedef
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.