Sözdizimi ve dilbilgisi arasındaki fark nedir?


14

Sözdizimi ve anlambilim arasındaki farkı anlıyorum -

Sözdizimi : geçerli bir ifade veya ifade oluşturmak için sembollerin nasıl birleştirildiği.
Anlambilim : bir ifade veya ifade oluşturan sembollerin anlamı.

Ama dilbilgisi nedir? Örneğin: bazen insanların bazı yapıların "dilbilgisel olarak yanlış ama sözdizimsel olarak doğru" olduğunu söylediğini duyuyorum. Bu ne demek?


FWIW, bu bana saçma geliyor. Dilin dilbilgisi kod parçasını kabul ederse, sözdizimiyle uyumludur. Belki birisinin çok geniş (ve standart dışı) bir "sözdizimi" tanımı vardır. Bağlam / kaynak?

@delnan. Doğru değil. Örneğin int;dilbilgisel olarak geçerlidir, ancak C ++ 'da sözdizimsel olarak kötü biçimlendirilmiştir. Dilbilgisinin bu kodla ilgili bir sorunu yoktur, ancak sözdizimi kısıtlamaları, bir bildirimin ilk bölümünde sınıf belirleyici veya numara belirleyici ya da C ++ 11'de arkadaş belirleyici içermiyorsa bir ad verilmesini gerektirir .
Johannes Schaub - litb

@ JohannesSchaub-litb: Dilbilgisinin bunu geçerli kılan kısmından bahsetmek ister misiniz?

@Johanes Bu sorudaki durumun tersidir.
Nicole

2
@ Johannes Schaub: Hangi kuralı "int" yapar? geçerli? Dilbilgisi sözdizimini tanımlar.
Casey Patton

Yanıtlar:


6

Dilbilgisi, belirli bir dilin sözdizimini tanımlayan bir dizi kuraldır.

İnsanlar özel olarak bir ayrıştırıcı hakkında konuşurken (özellikle yacc, Byacc, ANTLR, vb. Gibi bir ayrıştırıcı oluşturucu ile üretilir), biraz daha saç bölme yapabilir ve özellikle jeneratör bir kurala eklenmiş kodla ayrı ayrı uygulanan parçalar. Örneğin, bir dizi tanımladığınızda C'de, dizi için belirttiğiniz boyut kesinlikle pozitif olmalıdır (sıfır değil). Dilbilgisi kuralı temelde şöyle bir şey söyleyebilir:

typename var_name '[' unsigned_int ']'

... ve sonra ayrı olarak, unsigned_int öğesinin sıfır olmadığını kontrol etmek için biraz kod olurdu. Bu durumda, sözdizimi ve dilbilgisi gereksinimleri hakkında birbirinden ayrı olarak konuşmak biraz mantıklı olabilir , ikisi biraz farklı gereksinimlere sahiptir (birlikte uygulandığında, dilin kendisinin gereksinimlerini karşıladığımızı varsayarız).


3

Fark bulanık ve çok fazla endişelenmeye değmez.

İnsanlar bazen sözdizimsel doğruluk şemsiyesi altında bağlama duyarlı kısıtlamalar içerecektir . En yaygın örnek bir tür sistemidir. Bir diğeri Java'nın "dönüşten sonra ifade yok" kuralıdır. Bu resmi tartışmayı basitleştirir: sözdizimi, anlambilimin alanı olan bir dil (bir cümle / ifade / program kümesi) verir; başka bir şey "bir program değildir" ve anlambilimin onunla uğraşmasına gerek yoktur.

Aksine, "dilbilgisi" tipik olarak bağlamdan bağımsız dilleri tanımlamaya yönelik bir yöntemi ifade eder (buna rağmen nitelik dilbilgileri).

Çok endişelenmeye değmemesinin nedeni, yazı sistemlerinin bir dilin " doğruluk için sözdizimsel bir disiplini " oldukları için sıklıkla "statik anlambilimi " olarak kabul edilmesidir . Ve bazen bir dilin uygun bir bağlamsız dilbilgisi yoktur; Örneğin C, ayrıştırıcıdan bilgileri lexere geri beslemelidir.

Pragmatik olarak, "sözdizimsel" ve "dilbilgisel" arasında bir ayrım yapan herkes böyle söylese ve ne demek istediğini açıklasa iyi olur.


Aradaki farkın neden bulanık olduğunu anlamıyorum. Dilbilgisi sözdizimini açıklar.
Casey Patton

1
@Casey, hayır, "sözdizimi" kelimesinin bir kullanımına göre, dilbilgisi sözdiziminin bir üst kümesini belirtir .
Ryan Culpepper

0

Dilbilgisi, bir dili tanımlayan bir dizi kuraldır. Aksine, dilbilgisi sözdizimi ve anlambilimi açıklar . Bir dilin iki farklı dilbilgisi olabilir:

  • Sözdizimi dilbilgisi (dilde sembollerin sıralamasını açıklayan bir dizi kural)
  • Anlambilim dilbilgisi (bu sembollerin geçerli anlamsal yerleşimini ve kullanımını açıklayan bir dizi kural)

Örneğin, C dilbilgisinin bir kısmı şöyle görünebilir:

if statement -> if_keyword "(" expression ")" if_block
if_keyword -> "if"
logical_statement -> some other stuff here...

Anlamı:

an if statement is made of an if keyword followed by a parenthesis followed by an expression followed by a parenthesis followed by an if block
an if keyword is ....

Gramer tanımlamanın bu şekline bir göz atın . Dilbilgisini gerçekten merak ediyorsanız , temel olarak bir dilin dilbilgisini tanımlamak için bir araç olan GNU Bison'a bir göz atın .

"Dilbilgisi açısından yanlış ama sözdizimsel olarak doğru" çok fazla mantıklı değil. Belki bir dilin anlambilimini tanımlayan bir gramerden bahsediyorlar. Yine de "anlamsal olarak doğru değil" demek kesinlikle daha mantıklı olacaktır.


7
Hayır, dilbilgisi anlambilim tanımlamaz ve egzotik bir şey olmadıkça bunu asla yapmamalıdır, ör. Contextfreeart.org
SK-logic
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.