Saya mencoba memahami apa yang dimaksud dengan "deterministik" dalam ungkapan seperti "tata bahasa bebas konteks deterministik". (Ada lebih banyak "hal-hal" deterministik dalam bidang ini). Saya akan menghargai contoh lebih dari penjelasan yang paling rumit! Jika memungkinkan.
Sumber kebingungan utama saya adalah dari tidak dapat mengatakan bagaimana properti tata bahasa ini berbeda dari ambiguitas (non-).
Yang paling dekat saya menemukan maknanya adalah kutipan dari makalah ini oleh D. Knuth On Translation of Languages dari Kiri ke Kanan :
Ginsburg dan Greibach (1965) telah mendefinisikan gagasan tentang bahasa deterministik; kami menunjukkan dalam Bagian V bahwa ini adalah bahasa yang tepat untuk tata bahasa LR (k)
yang menjadi melingkar segera setelah Anda sampai ke Section V
, karena di sana dikatakan bahwa apa yang dapat diurai LR (k) adalah bahasa deterministik ...
Di bawah ini adalah contoh yang bisa saya temukan untuk membantu saya memahami apa arti "ambigous", silakan lihat:
onewartwoearewe
Yang dapat diuraikan sebagai one war two ear ewe
atau o new art woe are we
- jika tata bahasa memungkinkan itu (katakan itu memiliki semua kata yang baru saja saya daftarkan).
Apa yang harus saya lakukan untuk menjadikan contoh bahasa ini (non-) deterministik? (Saya bisa, misalnya, menghapus kata o
dari tata bahasa, untuk membuat tata bahasa tidak ambigu).
Apakah bahasa di atas deterministik?
PS. Contohnya adalah dari buku Godel, Esher, Bach: Eternal Golden Braid.
Katakanlah, kita mendefinisikan tata bahasa untuk contoh bahasa seperti ini:
S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'
Dengan argumen tentang harus menguraikan seluruh string, apakah tata bahasa ini membuat bahasa menjadi non-deterministik?
let explode s =
let rec exp i l =
if i < 0 then l else exp (i - 1) (s.[i] :: l) in
exp (String.length s - 1) [];;
let rec woe_parser s =
match s with
| 'w' :: 'e' :: [] -> true
| 'e' :: 'w' :: 'e' :: [] -> true
| 'o' :: x -> woe_parser x
| 'n' :: 'e' :: 'w' :: x -> woe_parser x
| 'a' :: 'r' :: 't' :: x -> woe_parser x
| 'w' :: 'o' :: 'e' :: x -> woe_parser x
| 'a' :: 'r' :: 'e' :: x -> woe_parser x
(* this line will trigger an error, because it creates
ambiguous grammar *)
| 'o' :: 'n' :: 'e' :: x -> woe_parser x
| 'w' :: 'a' :: 'r' :: x -> woe_parser x
| 't' :: 'w' :: 'o' :: x -> woe_parser x
| 'e' :: 'a' :: 'r' :: x -> woe_parser x
| _ -> false;;
woe_parser (explode "onewartwoearewe");;
- : bool = true
| Label | Pattern |
|---------+--------------|
| rule-01 | S -> A 'we' |
| rule-02 | S -> A 'ewe' |
| rule-03 | A -> B |
| rule-04 | A -> BA |
| rule-05 | B -> 'o' |
| rule-06 | B -> 'new' |
| rule-07 | B -> 'art' |
| rule-08 | B -> 'woe' |
| rule-09 | B -> 'are' |
| rule-10 | B -> 'one' |
| rule-11 | B -> 'war' |
| rule-12 | B -> 'two' |
| rule-13 | B -> 'ear' |
#+TBLFM: @2$1..@>$1='(format "rule-%02d" (1- @#));L
Generating =onewartwoearewe=
First way to generate:
| Input | Rule | Product |
|-------------------+---------+-------------------|
| '' | rule-01 | A'we' |
| A'we' | rule-04 | BA'we' |
| BA'we' | rule-05 | 'o'A'we' |
| 'o'A'we' | rule-04 | 'o'BA'we' |
| 'o'BA'we' | rule-06 | 'onew'A'we' |
| 'onew'A'we' | rule-04 | 'onew'BA'we' |
| 'onew'BA'we' | rule-07 | 'onewart'A'we' |
| 'onewart'A'we' | rule-04 | 'onewart'BA'we' |
| 'onewart'BA'we' | rule-08 | 'onewartwoe'A'we' |
| 'onewartwoe'A'we' | rule-03 | 'onewartwoe'B'we' |
| 'onewartwoe'B'we' | rule-09 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
| | | 'onewartwoearewe' |
Second way to generate:
| Input | Rule | Product |
|-------------------+---------+-------------------|
| '' | rule-02 | A'ewe' |
| A'ewe' | rule-04 | BA'ewe' |
| BA'ewe' | rule-10 | 'one'A'ewe' |
| 'one'A'ewe' | rule-04 | 'one'BA'ewe' |
| 'one'BA'ewe' | rule-11 | 'onewar'A'ewe' |
| 'onewar'A'ewe' | rule-04 | 'onewar'BA'ewe' |
| 'onewar'BA'ewe' | rule-12 | 'onewartwo'A'ewe' |
| 'onewartwo'A'ewe' | rule-03 | 'onewartwo'B'ewe' |
| 'onewartwo'B'ewe' | rule-13 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
| | | 'onewartwoearewe' |
B -> 'o'
, maka tidak lagi ambigu ...
S
. Dengan penerapan aturan S := ...
, kita dapat ...
, ..."