Я пытаюсь понять, что подразумевается под «детерминистическим» в выражениях, таких как «детерминистическая контекстно-свободная грамматика». (Есть более детерминированные «вещи» в этой области). Я был бы признателен за пример более, чем самое сложное объяснение! Если возможно.
Мой основной источник путаницы - неспособность понять, чем это свойство грамматики отличается от (не) двусмысленности.
Самое близкое, что я нашел, - это цитата из статьи Д. Кнута « О переводе языков слева направо» :
Гинзбург и Грейбах (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 := ...
...