ฉันพยายามที่จะเข้าใจสิ่งที่มีความหมายโดย "deterministic" ในการแสดงออกเช่น "ไวยากรณ์บริบทที่ปราศจากการกำหนด" (มี "สิ่ง" ที่กำหนดขึ้นได้ในฟิลด์นี้) ฉันขอขอบคุณตัวอย่างมากกว่าคำอธิบายที่ซับซ้อนที่สุด! ถ้าเป็นไปได้.
ความสับสนหลักของฉันมาจากการที่ไม่สามารถบอกได้ว่าคุณสมบัติของไวยากรณ์นี้แตกต่างจากความกำกวม (ไม่ใช่ -) อย่างไร
ที่ใกล้เคียงที่สุดที่ฉันจะต้องค้นหาสิ่งที่มันหมายถึงเป็นคำพูดจากกระดาษโดย D. Knuth ในการแปลภาษาจากซ้ายไปขวา :
Ginsburg และ Greibach (1965) ได้กำหนดแนวความคิดของภาษาที่กำหนดขึ้นมา เราแสดงในหมวดที่ 5 ว่าภาษาเหล่านี้เป็นภาษาที่มีไวยากรณ์ LR (k) อยู่จริง
ซึ่งกลายเป็นวงกลมทันทีที่คุณไปถึงที่Section V
นั่นเพราะมันบอกว่าสิ่งที่ตัวแยกวิเคราะห์ LR (k) สามารถแยกวิเคราะห์เป็นภาษาที่กำหนดขึ้น ...
ด้านล่างเป็นตัวอย่างที่ฉันสามารถค้นหาเพื่อช่วยให้ฉันเข้าใจความหมาย "คลุมเครือ" โปรดดู:
onewartwoearewe
ซึ่งสามารถแยกวิเคราะห์เป็นone war two ear ewe
หรือo new art woe are we
- ถ้าไวยากรณ์อนุญาตให้ (บอกว่ามันมีคำทั้งหมดที่ฉันเพิ่งระบุไว้)
ฉันจะต้องทำอะไรเพื่อทำให้ภาษาตัวอย่างนี้ (ไม่ใช่ -) กำหนดขึ้นได้? (ตัวอย่างเช่นฉันสามารถลบคำo
จากไวยากรณ์เพื่อให้ไวยากรณ์ไม่ชัดเจน)
ภาษาข้างต้นเป็นการกำหนดหรือไม่
PS ตัวอย่างมาจากหนังสือ Godel, Esher, Bach: Eternal Golden Braid
สมมติว่าเรากำหนดไวยกรณ์สำหรับภาษาตัวอย่างเช่น:
S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'
โดยการโต้เถียงเกี่ยวกับการแยกสตริงทั้งหมดไวยากรณ์นี้ทำให้ภาษาที่ไม่ได้กำหนด?
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'
จากนั้นจะไม่ชัดเจนอีกต่อไป ...
S
การใช้กฎS := ...
เราได้...
... "