“Bağlamsız dilbilgisi” teriminde “bağlamsız” ne demektir?


55

Bağlam içermeyen bir gramerin (CFG) ne olduğunu açıklamaya çalışan materyal miktarı göz önüne alındığında, çok azının (örneğime göre, 20'de 1'den az) bu gramerlerin neden "bağlam" olarak adlandırıldığına dair bir açıklama getirdiğini şaşırtıcı buldum. Beleş". Ve aklımda, hiç kimse bunu başaramaz.

Sorum şu: neden bağlamsız gramerler bağlamsız olarak adlandırılıyor? "Bağlam" nedir? Bağlamın halihazırda analiz edilen yapıyı çevreleyen diğer dil yapıları olabileceğine dair bir fikrim vardı, ancak bu durum böyle görünmüyor. Birisi kesin bir açıklama yapabilir mi?


4
Bağlam-düşkünlüğün neden kullanışlı olduğunu size öğretecek C ++ için "en sinir bozucu ayrıştırma" konusuna bakın
cırcır ucube

6
Bazı Googled tanımlarını okuyana kadar bağlamsız bir gramerin ne olduğunu bildiğimi sanıyordum. Şimdi keşke bir taslak çizme ve yumuşak bir boşluk olsaydı ... belki de dışarıya çıkarım ... +1 iyi bir soru için. Bazı anlaşılır cevaplar bekliyorum!
BrianH

Sezgileriniz, “şu anda analiz edilen yapıyı çevreleyen diğer dil yapıları” nın resmi tanımı uygun bir şekilde eğlence olsa bile, benim anladığım şeydir. Ama bunu cevap olarak gönderecek kadar emin değilim .
Telastyn

1
Bağlamsız dilbilgisi ve Chomsky hiyerarşisi ile ilgili açıklamalara bakınız . Uygulamada programlama dili ayrıştırma işleminin bazı bağlamları vardır, genellikle "
bağlamsız

1
Burada, bir xkcd referansı var: xkcd.com/1090
CaptainCodeman

Yanıtlar:


61

Tüm üretim kurallarının sol tarafında tek bir terminali olmadığı anlamına gelir .

Örneğin, eşleşen parantezlerin dizelerini tanıyan bu dilbilgisi ("()", "() ()", "(()) ()", ...) bağlamsızdır:

S → SS
S → (S)
S → ()

Her kuralın sol tarafı, tek bir terminalden oluşmaz (bu durumda her zaman S, ancak daha fazlası olabilir).

Şimdi , {a ^ nb ^ nc ^ n: n> = 1} biçimindeki dizeleri tanıyan bu diğer gramerleri göz önünde bulundurun (örneğin, "abc", "aabbcc", "aaabbbccc"):

S  → abc
S  → aSBc
cB → WB
WB → WX
WX → BX
BX → Bc
bB → bb

Eğer terminal olmayan terminal B, terminal / değişmez karakterden önce cgeliyorsa, bu terimi yeniden yazarsınız, WBancak önceliği varsa b, bbbunun yerine genişlersiniz . Muhtemelen, içeriğe duyarlı dilbilgilerinin bağlam-duyarlılığının ne anlama geldiğidir.

Bağlamsız bir dil, aşağı açılan bir otomat olarak tanınabilir . Bir sonlu durumlu makine, hiçbir yardımcı depo kullanmıyorsa, yani kararı sadece mevcut durumuna ve girişine dayanıyor olsa da, bir aşağı açılır otomat da emrinde bir istif içerir ve karar almak için istifin üstüne bakabilir.

Bunu görmek için iç içe parantezleri, soldan sağa doğru hareket ettirerek ve sol parantezleri bir taneyle karşılaştığınız her seferde bir yığına iterek ve doğru parantezlerle karşılaştığınız her seferde patlatabilirsiniz. Asla boş bir yığından çıkarmaya çalışmazsanız ve kümenin sonunda yığının boş olması durumunda, dize geçerlidir.

Bağlama duyarlı bir dil için, bir PDA yeterli değildir. Teybi sınırsız olmayan bir Turing Makinesi gibi doğrusal sınırlı bir otomat'a ihtiyacınız olacak (mevcut bant miktarı girişle orantılı olsa da). Bunun bilgisayarları oldukça iyi tanımladığına dikkat edin - biz onları Turing Machines olarak düşünmekten hoşlanıyoruz, ancak gerçek dünyada, program ortasında rasgele daha fazla RAM alamayacaksınız. Bir LBA'nın PDA'dan daha güçlü olduğu size açık değilse, LBA kasetinin bir kısmını yığın olarak kullanarak bir PDA'yı taklit edebilir, ancak kasetini başka şekillerde kullanmayı da seçebilir.

(Bir Sonlu Durum Makinesinin neyi tanıyabileceğini merak ediyorsanız, cevap normal ifadelerdir. Ancak, program gruplarında gördüğünüz arka arkaya bakma grupları ve yakalama grupları olan steroidler üzerindeki regexler değil; gibi operatörleri ile [abc], |, *, +, ve ?. Bunu görebilirsiniz abbbznormal ifadeyle eşleşir ab*zsadece hayır yığın gerekli dize ve regex geçerli konumunuzu tutarak.)


14
Çok güzel bir açıklama. Bir Turing makinesinin bandının sonsuz olması gerekmez, ancak sınırsız olması gerekir. Her iki uçta da bir bant fabrikası olabilir, bu makinenin içine çarptığında daha fazla bant yapar. Bu şekilde, herhangi bir zamanda, sonludur.
Mike Dunlavey,

2
@MikeDunlavey Açıklama için teşekkürler, düzeltildi.
Doval

10
Ancak, bant fabrikası sonsuz bant yapma malzemeleri ya da sonsuz bant yapma malzemeleri yapma malzemeleri ya da ... [yığın taşması]
flamingpenguin

8
@Mehrdad: İki yığını kullanarak istediğiniz sayıda yığını simüle edebilirsiniz: tüm yığınları üst üste yığılmış bir yığın üzerinde tutun ve bazı yığınlara daha fazla erişmeniz gerektiğinde üstteki yığınları çıkarın ve ikinci yığının üzerine itin. Bu, n> 2 yığınlarının 2 yığından daha güçlü olmadığını kanıtlar. Şimdi, 2 yığının 1 yığından daha güçlü olup olmadığını bilmiyorum. Sezgilerim hayır diyor, ama bu tam olarak yığın ilkellerinin ne olduğuna bağlı olabilir.
Jörg W Mittag

10
@ JörgWMittag: İki yığın bir kaset kadar iyidir. El hareketi: mevcut konumunuza göre, bir yığını bandın sol tarafı, diğer yığını da sağ taraf olarak kullanın. Yani 2 PDA bir Turing makinesidir. İlkeller için, sadece bir yığından bir değer açıp diğerine bastırabilmeniz gerekir, bu şekilde kaset boyunca hareket edersiniz.
Steve Jessop

20

Diğer cevaplar doğru ve doğru olsa bile oldukça uzundur. Bu kısa versiyon.

Bir karakter dizginiz varsa (terminaller ve nonterminaller) ve dizedeki bir nonterminali değiştirmek istiyorsanız, bağlamsız bir dilbilgisi, nonterminali çevreleyen karakterlerden bağımsız olarak bunu yapmanızı sağlar.

Aşağıdaki kuralları göz önünde bulundurun (küçük harfler terminal, büyük harfler normal değildir):

A -> a
AB -> a

İlk kuralda, A etrafında ne olduğuna bakılmaksızın (bağlam) değiştirebilirsiniz. İkinci kuralda, Atakip etmedikçe değiştiremezsiniz B. Her iki nonterminal bu durumda değiştirilecek olsa da, önemli olan, Amaddeyi saran nonterminallerin olmasıdır . Kişi BAile değiştirilemez aya da Bile değiştirilemez a: sadece Abunu izler, Bçünkü sıralı olmayanların bağlamı önemlidir. Bu, birinci kural bağlam içermezken, ikinci kuraldaki nonnterminal bir konuların bağlamı, onu bağlam duyarlı kılar.


Bu gerçekten iyi bir açıklama, ancak doğruluğu veya eksiksizliği konusunda kefil değilim. Hepsi orada mı?
rick

1
Bilgisayar gramerleri Chomsky hiyerarşisinin bir parçasıdır . Bu makale başlamak için iyi bir yer. Ayrıca, bu konu bilgisayar bilimlerindeki herhangi bir lisans programının bir parçası olmalıdır . En azından, üniversiteler programcıların karşılaşabileceği dillerin ezici çoğunluğunu oluşturduğu için düzenli ve bağlamsız gramerleri öğretmelidir.

@Snowman: Eğer "size elde edemez söylersek Çok crisp.It iyi olurdu adan ABsürece Atakip eder Bsen yerini alamaz diyerek yerine ' Aaslında değiştirmekte olduğunuz çünkü mümkün olmayabilir hangi' ABdeğil o?
justin

@justin doğru. Bu konuda daha net olması için cevabımı güncelledim.

@Snowman: Değiştirmeye ifade ediyor Aya AB? İkinci kural (bağlama duyarlı) 'de Hala değiştirmeye çalışıyorsanız düşünmek Agibi cevabını söyledi.
justin,

7

Ayrımı ve terminolojiyi daha iyi anlamak için, bir n b n gibi bağlamsız bir dili n n b n c n gibi bir içeriğe duyarlı olanla karşılaştırmak iyi bir fikirdir . (Gösterim: a, b ve c buradaki değişmezlerdir ve üs n , değişmez n kere, n > 0, yani söyler.) Mesela, ikinci dilde değildir aabbcveya aabbbccdeğildir aabbcc.

Bağlamdan bağımsız dil için bir alıcı bir n b n bir çift kapabilirler ave bbakılmaksızın (yani ne olursa olsun ab göründüğü bağlamı) etrafında ne ve dilinde sadece dizeleri kabul edip başka bir şey reddeden doğru şekilde çalışır yani dilbilgisi S -> aSb | ab. Olduğuna dikkat edin üretimi (ler) sol tarafında bir terminaller . (İki üretim kuralı vardır, ancak bunları yalnızca küçük harflerle yazıyoruz.) Alıcı, temel olarak yerel, bağlamsız bir karar verebilir.

Bunun tersine, bağlama duyarlı dili bir için bu gibi şeyler yapamaz n b n c n ikincisi için kasılmalarla eşleştirmek için ne kaç ab kasılmalar yani içinde bulunduğumuz nasılsa bağlamı, hatırlamak gerekir çünkü, bc İkinci dil için bir gramer

S -> abc | aBSc
Ba -> aB
Bb -> bb

Son iki kuralda hem terminallere hem de terminallere sahip olmadığınızı unutmayın. Soldaki terminaller, terminal olmayanların genişletilebileceği bağlamdır.


“Sözleşmeye” ve “genişlemeye” terminolojisine vb. İlişkin önyükleme notu: biçimsel gramerler [resmen, hah] üretken olsalar da, gerçekte ayrıştırıcılara uygulanma biçimleri gerçekte indirgemecidir, yani her şeyle terminal olmayan, temel olarak Kuralların "tersine" uygulanması, bu nedenle yukarıda verilen ilk dilbilgisi bile bir programda pratik değildir (bu, hangi kuralı uygulayacağınıza karar veremediğiniz için size ünlü vardiya azaltma çatışmasını verir) gramerler, bağlamsız ve bağlama duyarlı arasındaki ayrımı göstermek için yeterlidir. Bağlamsız dilbilgileri konusundaki belirsizlik konusu oldukça karmaşıktır ve aslında bu sorunun konusu değildir, bu yüzden burada daha fazla söyleyemem, özellikle Vikipedi'nin bu konuda iyi bir makalesi olduğu ortaya çıktı .. Bağlam içermeyen ve özellikle de bağlam duyarlı dil hakkındaki makalelerin aksine! @ # $ @! # $, Özellikle konuya yeniyseniz ... Sanırım bu daha çok TODO listemde.


5

Yukarıdaki cevaplar ne olduğu konusunda oldukça iyi bir tanım veriyor. Bakalım, kendi kelimelerimle yazıp yazamayacağımı göreyim, böylece 20 yerine 23 açıklamaya sahip olacaksınız. Dilbilgisinin tüm amacı, herhangi bir dilbilgisi, belirli bir cümlenin verilen dilde bir cümle olup olmadığını anlamaktır. Ancak, gerçekte gramerleri ve ayrıştırmayı kullandığımız şey cümlenin ne anlama geldiğini bulmaktır. Okuldaki İngilizce dersinde geri almış olabileceğiniz veya vermeyeceğiniz bir cümlenin eski şemaları gibidir. Bir cümle bir konu bölümü ve bir tahmin bölümü, bir konu bölümü bir isim ve belki bazı sıfatlardan oluşur, bir ön bölüm, bir fiil ve belki de bir nesne sıfat, bazı sıfatlar vb.

İngilizce için bir gramer olsaydı (ve bilgisayar bilimi anlamında olmadığını sanmıyorum), o zaman yapımlar denilen aşağıdaki biçimde kuralları olurdu.

Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun

vb...

Daha sonra bir program yazıp herhangi bir cümleyi verebilir ve program, cümlenin hangi kısmının ne olduğunu ve birbirleri ile olan ilişkilerini bulmak için dilbilgisini kullanabilir.

Her yapımda, sol tarafta yalnızca bir şey varsa, o zaman cümle içinde sağ tarafı gördüğünüzde, sol tarafa geçmenize izin verildiği anlamına gelir. Örneğin, sıfat ismini gördüğünüzde, bu cümlenin dışındaki hiçbir şeye hiç dikkat etmeden, "Bu bir SubjectPart" diyebilirsiniz.

Bununla birlikte, İngilizce (yukarıda verdiğim İngilizce'nin basitleştirilmiş tanımı bile) içeriğe duyarlıdır. "Sıfat isim" her zaman bir SubjectPart değildir, bir PredicatePart'ta bir NoPhrase olabilir. Bu koşullara bağlıdır. Sözde İngilizce gramerimizi biraz daha genişletelim:

Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun

Bir VerbPhrase'dan hemen sonra gelirse, yalnızca bir ObjectNounPhrase içine bir "sıfat" yapabilirsiniz.

Temel olarak, eğer bir üretiminiz varsa ve onu çevreleyen ne olursa olsun, bağlam gerektirmeyen istediğiniz zaman uygulayabilirsiniz.

Dilbilgisinin bağlam içeriğinin kolay olup olmadığını her zaman söyleyebilirsiniz. Sadece okların sol tarafında birden fazla sembol olup olmadığını kontrol edin.

Herhangi bir dil birden fazla gramer tarafından tanımlanabilir. Bir dil için bazı dilbilgisi bağlamsız ise, dil bağlamsızdır. Bağlamsız dilbilgisinin mümkün olmadığı bazı diller için kanıtlanabilir. Sanırım yukarıda anlattığım basitleştirilmiş sözde İngilizce altkümesi için bağlamsız bir dilbilgisi olabilir.

Neden önemli olduğu bağlamında, bağlamsız bir gramerin ayrıştırılması için daha basit bir program gerektirir. Diğer cevaplarda da belirtildiği gibi, bağlamsız bir gramer ayrıştırmak için bir Turing makinesinin tam gücünü gerektirmez. Belirli bir bağlamsız dilbilgisi için bir LR (1) ayrıştırıcısı (bir tür itme makinesi), bu dilbilgisindeki tüm cümleyi zaman ve cümlenin uzunluğuna doğrusal doğrusal olarak ayrıştırır. Cümle dilde ise, ayrıştırıcı cümle içindeki her sembolün ne anlama geldiğini (veya en azından yapıda hangi bölümü oynadığını) belirleyen bir yapı ağacı üretecektir. Cümle dilbilgisi içerisinde değilse, çözümleyici, dilbilgisi ve önceki sembollerle (ilk "hatada") uyuşması mümkün olmayan ilk sembolü fark edecek ve durduracaktır.

Daha da iyisi, bir gramerin açıklamasını verebileceğiniz programlar ve her bir parça ile ne yapılacağına ilişkin bir talimatlar listesi (bir anlamda her bir üretime "anlam" eklemek) ve program ayrıştırıcıyı yazacak olmasıdır. senin için. Program cümleyi ayrıştırır, yapıyı bulur ve yapının her bir parçası için talimatlarınızı çalıştırır. Bu tür bir program ayrıştırıcı-jeneratör veya derleyici-derleyici denir.

Bu tür bir dil analizi, doğal dilin (İngilizce gibi) otomatik analizi için icat edildi, ancak bunun bilgisayar dillerini analiz etmek için en faydalı olduğu ortaya çıktı. Bir dil tasarımcısı yeni dilini yakalayan bir dilbilgisi yazabilir, sonra dilini ayrıştıran bir program elde etmek için ayrıştırıcı-jeneratör üzerinden çalıştırabilir ve isterse çevirir, yorumlar, derler, yürütür, vb.

Aslında, çoğu durumda bunu gerçekten yapamazsınız. Örneğin, dengeli parantezler bağlamsız bir dildir, ancak bunları kullanmadan önce tüm değişkenleri bildirmenin gerekli olduğu bir dil bağlamlara duyarlıdır. Ayrıştırıcı, derleyicinin bir parçasıdır, ancak bu diğer gereklilikleri uygulamak için ek mantık gerekir. O zaman yapmanız gereken, dilinizi mümkün olduğunca yakalayan bir dilbilgisi yazmak, bunu bir çözümleyici-jeneratörden geçirin, ardından gereksinimlerin geri kalanını zorlayan bir kod yazın (sembol tablo işleyicisi, vb.).

Bağlam duyarlı gramerleri genellikle kullanmayız çünkü çok daha kötü desteklenmektedirler. Bağlam duyarlı diller için bir LR (k) ayrıştırıcı-üretecine eşdeğer olup olmadığını bilmiyorum. Evet, bir Turing makinesi (veya doğrusal bağlı makine) bir tanesini çözümleyebilir, ancak içeriğe duyarlı bir dilbilgisini bir Turing makinesi için bir programa dönüştürmek için genel bir algoritma olup olmadığını bilmiyorum, bir LR (1). ) jeneratör, bir itme makinesi için ayrıştırma tabloları yapar. Tahminime göre, ayrıştırıcının altında yatan tablolar katlanarak daha büyük olacaktır. Her durumda, CS öğrencilerine (kendim gibi, gün içinde) genellikle YACC gibi bağlamsız gramerler ve LR (1) ayrıştırıcı üreteçleri öğretilir.


-1

Bağlamsız dilbilgileri üretim kuralları için herhangi bir bağlam düşünmez. Bağlam , terminaller veya terminal olmayanlardır.

Yani: Bağlamsız gramerlerin üretim kurallarının sol tarafında sadece tek bir terminali yok.


3
Bu mevcut cevaplara ne ekler? Ayrıca, sol tarafta iki veya daha fazla terminali olmayan bir üretim kuralı da bağlamsal değildir.

Bence verilen cevaplar çok uzun. Eğer bir TL; DR ekleseydi, bunu silerdim.
Martin Thoma

Güzel! "Bağlam" ın her üretim kuralının ne zaman uygulanabileceğini belirten fazladan karakterler olduğunu söyleyebilir misiniz?
rick
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.