Seperti yang Anda tunjukkan, manusia berkomunikasi melalui bahasa "alami" seperti Inggris, Prancis, Jerman, antara satu sama lain. Mereka disebut alami karena kita secara alami mendapatkannya daripada sengaja menciptakannya (Esperanto menjadi pengecualian).
Bahasa formal adalah bahasa yang diciptakan untuk beberapa tujuan atau lainnya. Bahasa pemrograman seperti C, misalnya, adalah bahasa formal yang diciptakan untuk tujuan pemrograman komputer.
Semua bahasa, bisa dideskripsikan menggunakan tata bahasa. Hirarki tata bahasa dijelaskan oleh Noam Chomsky pada tahun 1956. Ini terdiri dari tingkatan-tingkatan berikut:
Tata bahasa Tipe-0 (tata bahasa tidak terbatas). Mereka adalah yang paling umum, dan setara dengan Mesin Turing. Dengan demikian, masalah memutuskan apakah string yang diberikan adalah bagian dari tata bahasa tidak dibatasi tidak dapat diputuskan.
Tata bahasa tipe-1 (tata bahasa konteks-sensitif). Hampir semua bahasa alami seperti bahasa Inggris peka terhadap konteks. Contoh sensitivitas konteks dalam bahasa Inggris adalah dua frasa: "Waktu berlalu seperti panah." dan "Buah terbang seperti pisang." Secara umum, sulit bagi komputer untuk memahami bahasa yang peka konteks.
Tata bahasa tipe-2 (bebas konteks). Bahasa bebas konteks adalah dasar teoretis untuk sintaksis sebagian besar bahasa pemrograman.
Tata bahasa tipe-3 (tata bahasa biasa). Keluarga bahasa reguler dapat diperoleh dengan ekspresi reguler. Bahasa reguler biasanya digunakan untuk menentukan pola pencarian dan struktur leksikal bahasa pemrograman.
Tata bahasa Tipe 2 (bebas konteks) dan tipe 3 (biasa) paling sering oleh komputer karena parser untuk mereka dapat diimplementasikan secara efisien.
BNF (Backus Normal Form atau Backus-Naur Form) adalah teknik notasi untuk tata bahasa bebas konteks, sering digunakan untuk menggambarkan sintaks bahasa yang digunakan dalam komputasi.
Misalnya pengidentifikasi dapat digambarkan sebagai:
<identifier> ::= <letter> { <letter> | <digit> }
yang artinya harus dimulai dengan huruf dan dapat berisi huruf atau angka tambahan.
Sebelumnya, surat didefinisikan sebagai 'a' | 'b' | 'c' dll., dan digit didefinisikan sebagai '0' hingga '9' menggunakan jenis notasi yang sama.
Pernyataan AC "untuk" dapat didefinisikan sebagai:
<for_statement> ::=
'for' '(' <expression> ';' <expression> ';' <expression> ')' <statement>
Analisis leksikal dan parser (tahap pertama dari kompiler atau juru bahasa) kemudian dibangun untuk menerima tata bahasa spesifik yang dijelaskan oleh BNF untuk bahasa tertentu. Analisis leksikal biasanya digunakan untuk memisahkan berbagai token suatu bahasa (seperti kata kunci, pengidentifikasi, atau angka), dan pengurai digunakan untuk mengetahui bagaimana token bekerja bersama, seperti bagaimana pernyataan "untuk" dikonstruksi. .