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?
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 .Jawaban:
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:
... 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).
sumber
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.
sumber
Tata bahasa adalah seperangkat aturan untuk mendefinisikan bahasa. Sebaliknya, tata bahasa menggambarkan sintaks dan semantik . Suatu bahasa mungkin memiliki dua tata bahasa yang berbeda:
Sebagai contoh, bagian dari tata bahasa di C mungkin terlihat seperti:
Berarti:
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".
sumber