Bu, gramer programlarının yeniden düzenlenmesi midir? önceki Vag tarafından sordu ve yorumculardan birçok öneri ile.
Bir dilbilgisi bir hesaplama modelini ne şekilde tanımlayabilir? Örneğin, aşağıdaki gibi bağlam içermeyen basit bir dilbilgisi alırsak,
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
Ayrıştırıcının burada gösterdiğim gibi terminal ve terminal olmayan semboller arasında ayrım yapmadığını varsayarsak, 3'e kadar sayılar için basit aritmetik yapmak mümkündür.
Örneğin, dizeyi
"2 + 0 + 1"
Bu dizede bir LR (1) ayrıştırıcısı çalıştırmak , hesaplamanın sonucunun ağacın kökünde depolandığı aşağıdaki somut sözdizimi ağacını vermelidir :
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
Biz olmak için bir dilbilgisi alırsak Böylece programı ve bir ayrıştırıcı jeneratör, bir olmaya derleyici , bir olarak dilbilgisi şartname dili görebiliyordu programlama dili ?
Ayrıca, selüllar otomatları veya lambda hesabı ile turlama tam programlarını nasıl oluşturabileceğinize benzer gramerler belirterek Turing tamamlanmış programlar oluşturabilir miyiz ?
Başka bir deyişle, anlamında olduğu bilinmektedir tanıyan bir dil, düzenli diller karşılık sonlu durumlu otomata , bağlam-bağımsız diller karşılık otomata aşağı itmek ve bağlama duyarlı diller karşılık sınırlı otomata doğrusal . Ancak, dilbilgisine hesaplama araçları (yani yukarıdaki örnek anlamındaki programlar ) olarak bakarsak , Chomsky hiyerarşisindeki her dilbilgisi sınıfının hesaplama gücünü nasıl sınıflandırırız ?
- Düzenli dilbilgisi
- Bağlamdan bağımsız gramerler
- Bağlama duyarlı dilbilgisi
- Sınırsız dilbilgisi ( özyinelemeli olarak numaralandırılabilir diller için )
Ayrıca, daha az bilinen gramer alt sınıflarına ne dersiniz?
- Deterministik bağlamsız gramerler (ayrıca LR (k) / LL (k) / SLR / LALR vb.)
- İç içe sözcük gramerleri
- Ağaç bitişik dilbilgisi
- Dizinlenmiş dilbilgisi
EDIT: Bu arada, bu benim kendi sorum bir nitpick ama örnek dilbilgisi için hiçbir başlangıç sembolü vermedi bahsetmedim ve terminaller ve terminaller arasında ayrım yapmak ihtiyacında el salladı. Teknik veya geleneksel olarak, dilbilgisinin muhtemelen bu gibi daha karmaşık bir biçimde yazılması gerektiğini düşünüyorum (burada S başlangıç sembolüdür ve $ , akış sonu terminalini temsil eder):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
... gerçekten hiçbir şeyi değiştirmediği için değil, ama bundan bahsetmem gerektiğini düşündüm.
DÜZENLEME: Gasche'ın cevabını okuduğumda akla gelen başka bir şey, örneğimdeki ağaçtaki her dalın bir alt hesaplamayı temsil etmesi. Her üretim kuralına LHS'nin sonucu temsil ettiği ve RHS'nin argümanlarını temsil ettiği bir işlev olarak bakarsanız, dilbilgisinin yapısı işlevlerin nasıl oluşturulduğunu belirler.
Başka bir deyişle, ayrıştırıcının gözetleme mekanizmasıyla birlikte bağlamı, sadece hangi işlevlerin uygulanacağını (parametrik polimorfizm gibi) değil, aynı zamanda yeni işlevler oluşturmak için nasıl bir araya getirilmeleri gerektiğini belirlemeye yardımcı olur.
En azından, açık bir CFG için bu şekilde bakabilirsiniz, diğer gramerler için zihinsel jimnastik şu anda benim için biraz fazla.