Я пытаюсь понять, что подразумевается под «детерминистическим» в выражениях, таких как «детерминистическая контекстно-свободная грамматика». (Есть более детерминированные «вещи» в этой области). Я был бы признателен за пример более, чем самое сложное объяснение! Если возможно.
Мой основной источник путаницы - неспособность понять, чем это свойство грамматики отличается от (не) двусмысленности.
Самое близкое, что я нашел, - это цитата из статьи Д. Кнута « О переводе языков слева направо» :
Гинзбург и Грейбах (1965) определили понятие детерминированного языка; в разделе V мы показываем, что это именно те языки, для которых существует грамматика LR (k)
который становится круговым, как только вы доберетесь до Section V, потому что там говорится, что синтаксический анализатор LR (k) может анализировать это детерминированный язык ...
Ниже приведен пример, который я могу найти, чтобы помочь мне понять, что означает «неоднозначный», пожалуйста, посмотрите:
onewartwoearewe
Который может быть проанализирован как one war two ear eweили o new art woe are we- если грамматика позволяет это (скажем, в нем есть все слова, которые я только что перечислил).
Что мне нужно сделать, чтобы сделать этот пример языка (не) детерминированным? (Я мог бы, например, удалить слово oиз грамматики, чтобы грамматика не была неоднозначной).
Является ли вышеуказанный язык детерминированным?
PS. Пример взят из книги Гёдель, Эшер, Бах: Вечная золотая коса.
Допустим, мы определяем грамматику для языка примера следующим образом:
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 := ......