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.