Ini adalah reformulasi program tata bahasa Are? sebelumnya ditanya oleh Vag dan dengan banyak saran dari para komentator.
Dalam hal apa tata bahasa dapat dilihat sebagai spesifikasi model komputasi? Misalnya, jika kita mengambil tata bahasa bebas konteks sederhana seperti
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
Dengan asumsi bahwa parser tidak membedakan antara terminal dan simbol nonterminal seperti yang saya tunjukkan di sini, maka dimungkinkan untuk melakukan aritmatika sederhana untuk angka hingga 3.
Misalnya, ambil senarnya
"2 + 0 + 1"
Menjalankan LR (1) parser pada string ini harus memberi kita pohon sintaksis beton berikut di mana hasil perhitungan disimpan di akar pohon:
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
Jadi, jika kita mengambil tata bahasa untuk menjadi sebuah program dan generator pengurai menjadi kompiler , dapatkah kita melihat bahasa spesifikasi tata bahasa sebagai bahasa pemrograman ?
Lebih lanjut, dapatkah kita membangun program lengkap Turing dengan menentukan tata bahasa yang mirip dengan bagaimana Anda dapat membangun program lengkap turing celullar automata atau kalkulus lambda ?
Dengan kata lain, diketahui bahwa dalam arti mengenali bahasa, bahasa reguler berhubungan dengan automata keadaan terbatas , bahasa bebas konteks berhubungan dengan push down automata , dan bahasa peka konteks berhubungan dengan automata terbatas linier . Namun, jika kita melihat tata bahasa sebagai perangkat komputasi (yaitu program dalam arti contoh di atas), lalu bagaimana kita mengklasifikasikan kekuatan komputasi masing-masing kelas tata bahasa dalam hierarki Chomsky?
- Tata bahasa biasa
- Tata bahasa bebas konteks
- Tata bahasa yang sensitif terhadap konteks
- Tata bahasa tidak terbatas (untuk bahasa yang berulang secara berulang )
Juga, bagaimana dengan subclass tata bahasa yang kurang dikenal seperti
- Tata bahasa bebas konteks deterministik (juga LR (k) / LL (k) / SLR / LALR dll)
- Tata bahasa kata bersarang
- Tata bahasa sebelah pohon
- Tata bahasa terindeks
EDIT: Ngomong-ngomong, ini adalah nitpick pada pertanyaan saya sendiri tetapi saya tidak menyebutkan bahwa saya tidak memberikan simbol awal untuk contoh tata bahasa dan melambaikan tangan pada kebutuhan untuk membedakan antara terminal dan nonterminals. Secara teknis atau tradisional saya pikir tata bahasanya mungkin harus ditulis dalam bentuk yang lebih rumit seperti ini (di mana S adalah simbol awal dan $ mewakili terminal end-of-stream):
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
... bukan berarti itu benar-benar mengubah apa pun, tetapi saya pikir saya harus menyebutkannya.
EDIT: Hal lain yang terlintas dalam pikiran ketika saya membaca jawaban gasche adalah bahwa setiap cabang di pohon dalam contoh saya mewakili sub-perhitungan. Jika Anda melihat setiap aturan produksi sebagai fungsi di mana LHS mewakili hasil dan RHS mewakili argumennya, maka struktur tata bahasa menentukan bagaimana fungsi disusun.
Dengan kata lain, konteks parser bersama dengan mekanisme lookahead membantu untuk menentukan tidak hanya fungsi yang diterapkan ('agak' seperti parametrik polimorfisme) tetapi bagaimana mereka harus disusun bersama untuk membentuk fungsi baru.
Setidaknya, saya kira Anda bisa melihatnya dengan cara ini untuk CFG yang jelas, untuk tata bahasa lain senam mental agak terlalu banyak bagi saya saat ini.