SORU
8 AĞUSTOS 2011, PAZARTESİ


D'in dilbilgisi gerçekten bağlam-ücretsiz mi?

D haber grubu birkaç ay önce bu gönderdiniz, ama nedense, cevabı asla gerçekten beni ikna etti, ben burada sormak düşündüm.


The grammar of D is apparently context-free.

The grammar of C , however, isn't (even without macros). (Bu yazıyı dikkatlice okuyun lütfen!)

Verilen şimdiHiçbir şey bilmiyorum(resmi olarak) tarafından kullanılan lexers ve ayrıştırıcıları. Biliyorum tüm web öğrendiğim kadarıyla.
Ve burada, çok teknik lingo: konuyla ilgili tam anlamadım ne olduğunu

Bir dilin dilbilgisi bağlam-ücretsizEğer ve sadece eğerher zaman anlamını (mutlaka kesin bir davranış olsa da) "" başka. bir yere bakmaya gerek kalmadan onun belirli bir kod parçasının anlayabilirsin

Ya da, biledaha azrigor:

Dilbilgisi ise sadece bakarak ifade türünü söylemem gerekirse-free bağlam olamaz.

Bu yüzden, örneğin, C bir bağlam-ücretsiz test başarısız oluranlamconfusing<sizeof(x)>::q < 3 > (2)bağlıdırdeğerq.

Şimdiye kadar, çok iyi.

Benim sorum şimdi: D aynı şey söylenebilir mi?

D, hashtables örneğin Value[Key] bir bildirim yoluyla oluşturulabilir

int[string] peoplesAges;   // Maps names to ages

Statik bir dizi benzer bir sözdizimi tanımlanabilir:

int[3] ages;   // Array of 3 elements

Ve şablonlar onları da karmaşık hale getirmek için kullanılabilir:

template Test1(T...)
{
    alias int[T[0]] Test;
}

template Test2(U...)
{
    alias int[U] Test2;  // LGTM
}

Test1!(5) foo;
Test1!(int) bar;
Test2!(int) baz;  // Guess what? It's invalid code.

Bu ben demektirolamaz sadece T[0] U anlamını bakarak söyle(yani bir sayı olabilir, bir veri türü olabilir, ya da Tanrı-bilir-ne) bir demet olabilir. Bile ifade dilbilgisi açısından geçerli (int[U] kesinlikle ... değil beri anahtarları veya değerleri dizilerini bir karma tablo olamaz) olup olmadığını söyleyemem.

Test için yapmayı deniyorum herhangi bir ayrıştırma ağacıbaşarısızmantıklı düğüm karşı değişmez bir veri türü veya bir tanımlayıcı olup olmadığını bilmek gerekir beri) olmadığı sürecegecikmelerT değeri kadar sonuç belli (bu bağlam-bağımlı hale getirmek).

Verilen bu D aslında bağlamdan ya da kavramı yanlış mıyım?

Neden/neden olmasın?


Güncelleme:

Ben sadece yorum istedim: gerçekten ilginç cevaplar görmek beri:

  • Bazı cevaplar C ve D iddia ediyorolamazücretsiz bağlama
  • Bazı cevaplar C ve D olduğunu iddia ederlerher ikisi debağlam-ücretsiz
  • Bazı cevaplar D değil C bağlama duyarlı olduğu iddiasını destekliyor
  • Henüz hiç kimse C D bağlam-duyarlı iken, bağlamdan olduğunu iddia etti :-)

Eğer bir veya daha fazla kafam karışmaya öğreniyorum söyleyemem, ama her iki şekilde de, bu... cevap için zaman ayırdığınız için teşekkürler, herkese sordum çok memnunum!

CEVAP
8 AĞUSTOS 2011, PAZARTESİ


Bağlam özgür olmanın ilk üretken gramer özelliğidir. Bunun anlamı ne, bir terminal olabilir oluşturmaz bağlıdır kapsamında olan non-terminal görünür (non bağlam-ücretsiz üretici dil bilgisi, çok kavramı "dize oluşturulan tarafından verilen terminal" genel olarak zor tanımlamak için). Bu değil önlemek aynı dize sembolleri olmak tarafından oluşturulan olmayan iki terminalleri (yani aynı dizeleri sembollerin görünür şekilde iki farklı içerikler ile farklı bir anlam ve işle hiç ilgisi yok tür denetleme.

Ortak bir dil varsa en az bir bağlam serbest dilbilgisi nitelendirerek varsa ÜCRETSİZ içerik olduğunu belirten bir dil için gramer bağlam-ücretsiz tanımını genişletmek için.

Pratikte, hiçbir programlama dili açık kaynak kodlu, çünkü şey gibi "değişken bildirilmesi gerekir önce kullanılan" olamaz kontrol ederek bir bağlam serbest dilbilgisi (onlar olabilir kontrol tarafından başka türlü gramer). Bu kadar da kötü değil, pratik kurallar için kontrol edilir bölünmüş iki o ile istediğinizi seçin dilbilgisi ve o sana bakmak bir anlam pass (ve bu bölüm aynı zamanda izin için daha iyi hata raporlama ve kurtarma, bu yüzden bazen ister kabul et daha fazla dilbilgisi daha ne olabilir Olası sipariş vermek için kullanıcılar daha iyi teşhis).

İnsanlar C kapsamında ÜCRETSİZ bu bölümü yaparak rahat bir şekilde mümkün değildir olmadığını belirten (. ne demek ^em>uygungibi kriterleri "izler neredeyse resmi dil tanımı" ve "benim parser generator aracı destekleyen bir çeşit bölünme"; izin dilbilgisi için belirsiz ve belirsizlik için çözülmüş semantik Çek bir nispeten kolay bir yol yapmak için kesmek için C ve takip edecek oldukça C standart, ama uygunsuz zaman size güvenerek araçları yok izin belirsiz gramer, ne zaman var bu tür araçlar, uygun).

Bilmiyorum hakkında yeterli D olup olmadığını bilmek ya da değil uygun bir kesim dil kuralları içinde bir bağlam serbest dilbilgisi semantik kontrol eder, ama ne olduğunu göstermek daha kanıtlayan bir durum yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ExcelIsFun

    ExcelIsFun

    16 ŞUBAT 2008
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007
  • SaMmM123

    SaMmM123

    3 Mayıs 2006