Jawaban di atas memberikan definisi yang cukup bagus tentang apa itu. Mari kita lihat apakah saya dapat menuliskannya dengan kata-kata saya sendiri, sehingga Anda akan memiliki 23 penjelasan, bukan 20. Seluruh tujuan tata bahasa, tata bahasa apa pun, adalah untuk mencari tahu apakah kalimat tertentu adalah kalimat dalam bahasa yang diberikan. Namun, apa yang sebenarnya kita gunakan untuk tata bahasa dan penguraian adalah untuk mencari tahu apa arti kalimat itu. Ini seperti diagram lama dari kalimat yang mungkin Anda lakukan atau tidak pernah lakukan di kelas bahasa Inggris di sekolah. Sebuah kalimat dibuat dari bagian subjek dan bagian predikat, bagian subjek memiliki kata benda dan mungkin beberapa kata sifat, bagian predikat memiliki kata kerja dan mungkin objek kata benda, dengan beberapa kata sifat lagi, dll.
Jika ada tata bahasa untuk bahasa Inggris (dan saya pikir tidak ada, tidak dalam pengertian ilmu komputer) maka itu akan memiliki aturan bentuk berikut, yang disebut produksi.
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
dll ...
Anda kemudian dapat menulis sebuah program dan memberikannya kalimat apa pun, dan program tersebut dapat menggunakan tata bahasa untuk mencari tahu bagian mana dari kalimat setiap kata, dan hubungan apa yang mereka miliki satu sama lain.
Jika dalam setiap produksi, hanya ada satu hal di sisi kiri, maka itu berarti bahwa setiap kali Anda melihat sisi kanan dalam kalimat, Anda diperbolehkan untuk mengganti di sisi kiri. Misalnya setiap kali Anda melihat kata sifat kata benda, Anda bisa mengatakan "Itu Subjek Bagian" tanpa memperhatikan apa pun di luar frasa itu.
Namun, bahasa Inggris (bahkan deskripsi bahasa Inggris yang saya berikan di atas) adalah peka konteks. "Kata benda kata sifat" tidak selalu menjadi SubjectPart, itu bisa menjadi NounPhrase di PredicatePart. Itu tergantung pada konteksnya. Mari kita sedikit mengembangkan tata bahasa pseudo-Inggris kami:
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
Anda hanya dapat membuat "kata sifat kata sifat" menjadi ObjectNounPhrase jika itu datang tepat setelah VerbPhrase.
Pada dasarnya, jika Anda memiliki produksi dan Anda dapat menerapkannya kapan saja Anda inginkan, apa pun yang mengelilinginya, itu bebas konteks.
Anda selalu dapat mengetahui apakah tata bahasa bebas konteks dengan mudah. Cukup periksa apakah ada lebih dari satu simbol di sisi kiri panah.
Bahasa apa pun dapat dijelaskan oleh lebih dari satu tata bahasa. Jika beberapa tata bahasa untuk bebas konteks, bahasa bebas konteks. Dapat dibuktikan untuk beberapa bahasa bahwa tidak ada tata bahasa bebas konteks yang memungkinkan. Saya kira mungkin ada tata bahasa bebas konteks untuk subset pseudo-Inggris yang disederhanakan yang saya jelaskan di atas.
Adapun mengapa itu penting, itu memerlukan jenis program yang lebih sederhana untuk mengurai tata bahasa bebas konteks. Seperti dicatat dalam jawaban lain, itu tidak memerlukan kekuatan penuh dari mesin Turing untuk mengurai tata bahasa bebas konteks. Pengukur LR (1) lookahead (yang merupakan semacam mesin pushdown) untuk tata bahasa bebas konteks tertentu dapat menguraikan kalimat apa pun dalam tata bahasa itu dalam waktu dan ruang yang linear terhadap panjang kalimat. Jika kalimat dalam bahasa, parser akan menghasilkan struktur pohon yang mengidentifikasi apa arti setiap simbol dalam kalimat (atau setidaknya bagian apa yang dimainkannya dalam struktur). Jika kalimat tidak ada dalam tata bahasa, parser akan memperhatikan dan berhenti pada simbol pertama yang tidak mungkin untuk didamaikan dengan tata bahasa dan simbol sebelumnya (pada "kesalahan" pertama).
Apa yang lebih baik adalah bahwa ada program yang dapat Anda berikan deskripsi tata bahasa, dan daftar instruksi tentang apa yang harus dilakukan dengan setiap bagian (dalam arti melampirkan "makna" untuk setiap produksi) dan program akan menulis parser untukmu. Program akan mem-parsing kalimat, menemukan struktur, dan menjalankan instruksi Anda pada setiap bagian struktur. Program semacam ini disebut parser-generator atau compiler-compiler.
Analisis bahasa semacam ini diciptakan untuk analisis otomatis bahasa alami (seperti bahasa Inggris) tetapi ternyata ini yang paling berguna untuk menganalisis bahasa komputer. Seorang perancang bahasa dapat menulis tata bahasa yang menangkap bahasa barunya, kemudian menjalankannya melalui parser-generator untuk mendapatkan program yang mem-parsing bahasanya, dan menerjemahkan, mengartikan, mengkompilasi, mengeksekusi, dll jika ia mau.
Bahkan, dalam banyak kasus Anda tidak dapat benar-benar melakukan ini. Misalnya, tanda kurung yang seimbang adalah bahasa bebas konteks, tetapi bahasa yang mengharuskannya mendeklarasikan semua variabel sebelum Anda menggunakannya adalah peka konteks. Parser adalah bagian dari kompiler, tetapi logika tambahan diperlukan untuk menegakkan persyaratan lain ini. Yang kemudian harus Anda lakukan adalah menulis tata bahasa yang menangkap sebanyak mungkin bahasa Anda, menjalankannya melalui parser-generator, kemudian menulis kode yang memberlakukan sisa persyaratan (simbol table handler, dll).
Kami umumnya tidak menggunakan tata bahasa konteks-sensitif karena mereka jauh lebih buruk didukung. Saya tidak tahu apakah ada yang setara dengan LR (k) parser-generator untuk bahasa konteks-sensitif. Ya, mesin Turing (atau mesin terikat linier) dapat menguraikannya, tapi saya tidak tahu apakah ada algoritma umum untuk mengubah tata bahasa yang sensitif terhadap konteks menjadi program untuk mesin Turing, dalam arti bahwa LR (1 ) generator membuat tabel parse untuk mesin pushdown. Dugaan saya adalah bahwa tabel yang mendasari parser akan secara eksponensial lebih besar. Dalam kasus apa pun, siswa CS (seperti saya, pada zaman dahulu) biasanya diajarkan tata bahasa bebas konteks dan generator pengurai LR (1) seperti YACC.