Apa perbedaan antara sintaks dan tata bahasa?

14

Saya mengerti perbedaan antara sintaks dan semantik -

Sintaks : bagaimana simbol digabungkan untuk membentuk ekspresi atau pernyataan yang valid.
Semantik : makna simbol-simbol yang membentuk ekspresi atau pernyataan.

Tapi apa tata bahasanya? Sebagai contoh: kadang-kadang saya mendengar orang mengatakan bahwa beberapa konstruksi "secara tata bahasa salah tetapi secara sintaksis itu benar". Apa artinya?

cpx
sumber
FWIW, ini terdengar seperti omong kosong bagiku. Jika tata bahasa bahasa menerima potongan kode, itu sesuai dengan sintaks. Mungkin seseorang memiliki definisi "sintaksis" yang sangat luas (dan tidak standar). Konteks / sumber?
@nannan. Tidak benar. Sebagai contoh int;secara gramatikal valid, tetapi secara sintaksis tidak terbentuk dalam C ++. Tata bahasa tidak memiliki masalah dengan kode ini, tetapi kendala sintaks mengharuskan nama diberikan jika bagian pertama dari sebuah deklarasi tidak mengandung class-specifier atau enum-specifier atau, dalam C ++ 11, friend-specifier .
Johannes Schaub - litb
@ JohannesSchaub-litb: Mau mengutip bagian dari tata bahasa yang membuat ini valid?
@ Johanes Itu kebalikan dari situasi dalam pertanyaan.
Nicole
2
@ Johannes Schaub: Aturan apa yang menjadikan "int;" sah? Tata bahasanya mendefinisikan sintaksis.
Casey Patton

Jawaban:

6

Tata bahasa adalah seperangkat aturan yang mendefinisikan sintaks untuk bahasa tertentu.

Ketika orang berbicara secara khusus tentang parser (terutama yang dihasilkan dengan generator parser seperti yacc, Byacc, ANTLR, dll.), Mereka mungkin melakukan sedikit lebih banyak pemisahan rambut, dan berbicara secara khusus tentang aturan-aturan sintaksis yang dikodekan menggunakan generator. aturan, vs. bagian-bagian yang diberlakukan secara terpisah oleh kode yang dilampirkan pada aturan. Misalnya, dalam C ketika Anda mendefinisikan sebuah array, ukuran yang Anda tentukan untuk array harus benar-benar positif (bukan nol). Aturan tata bahasa pada dasarnya mungkin mengatakan sesuatu seperti:

typename var_name '[' unsigned_int ']'

... dan kemudian secara terpisah, akan ada sedikit kode untuk memeriksa apakah unsigned_int itu bukan nol. Dalam hal ini, mungkin masuk akal untuk berbicara tentang persyaratan sintaks dan tata bahasa secara terpisah satu sama lain, dengan keduanya memiliki persyaratan yang sedikit berbeda (bahwa, ditegakkan bersama, kami anggap sesuai dengan persyaratan bahasa itu sendiri).

Jerry Coffin
sumber
3

Perbedaannya kabur dan tidak perlu terlalu dikhawatirkan.

Orang kadang-kadang akan memasukkan batasan konteks-sensitif di bawah payung kebenaran sintaksis. Contoh paling umum adalah sistem tipe. Lain adalah aturan "tidak ada pernyataan setelah kembali" Java. Ini menyederhanakan diskusi formal: sintaks menghasilkan bahasa (satu set kalimat / ekspresi / program) yang merupakan domain dari semantik; yang lainnya adalah "bukan program", dan semantik tidak perlu repot dengan itu.

Sebaliknya, "tata bahasa" biasanya merujuk pada metode yang menggambarkan bahasa bebas konteks (meskipun tata bahasa atribut).

Alasan mengapa hal ini tidak perlu dikhawatirkan adalah karena sistem tipe sering dianggap sebagai " semantik statis " dari suatu bahasa karena mereka adalah " disiplin sintaksis untuk kebenaran". Dan terkadang suatu bahasa tidak memiliki tata bahasa bebas konteks yang tepat; C, misalnya, harus memasukkan informasi dari parser kembali ke lexer.

Secara pragmatis, siapa pun yang mengandalkan perbedaan antara "sintaksis" dan "gramatikal" sebaiknya mengatakan demikian dan menjelaskan apa yang mereka maksud.

Ryan Culpepper
sumber
Saya tidak mengerti mengapa perbedaannya kabur. Tata bahasanya menjelaskan sintaksis.
Casey Patton
1
@Casey, tidak, menurut satu penggunaan kata "sintaks", tata bahasa menentukan superset dari sintaks.
Ryan Culpepper
0

Tata bahasa adalah seperangkat aturan untuk mendefinisikan bahasa. Sebaliknya, tata bahasa menggambarkan sintaks dan semantik . Suatu bahasa mungkin memiliki dua tata bahasa yang berbeda:

  • Tata bahasa sintaks (seperangkat aturan yang menjelaskan urutan simbol dalam bahasa)
  • Tata bahasa semantik (seperangkat aturan yang menggambarkan penempatan semantik yang valid dan penggunaan simbol-simbol itu)

Sebagai contoh, bagian dari tata bahasa di C mungkin terlihat seperti:

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

Berarti:

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 ....

Lihatlah cara mendefinisikan tata bahasa . Jika Anda benar-benar ingin tahu tentang tata bahasa, lihatlah GNU Bison , yang pada dasarnya adalah alat untuk menggambarkan tata bahasa.

"Secara tata bahasa salah tetapi benar secara sintaksis" tidak masuk akal. Mungkin mereka mengacu pada tata bahasa yang menggambarkan semantik bahasa. Akan lebih masuk akal untuk mengatakan "tidak benar secara semantik".

Casey Patton
sumber
7
Tidak, tata bahasa tidak mendefinisikan semantik dan tidak boleh melakukannya, kecuali itu adalah sesuatu yang eksotis, seperti contextfreeart.org
SK-logic