"결정 론적 맥락없는 문법"과 같은 표현에서 "결정 론적"의 의미를 이해하려고합니다. (이 분야에는 더 결정적인 "사물"이 있습니다). 가장 정교한 설명보다 더 예를 들어 주셔서 감사합니다! 가능하다면.
저의 혼란의 주요 원인은 문법의이 속성이 (비) 모호성과 어떻게 다른지 알 수 없다는 것입니다.
내가 의미하는 바를 가장 가깝게 찾은 것은 D. Knuth의 왼쪽에서 오른쪽으로의 언어 번역에 관한 논문의 인용문입니다 .
Ginsburg와 Greibach (1965)는 결정 론적 언어의 개념을 정의했다. 우리는 섹션 V에서 이것들이 LR (k) 문법이 존재하는 언어 들임을 정확하게 보여줍니다.
이는 곧 당신이 얻을으로 원형이된다 Section V
는 것을 LR (k)를 파서가 구문 분석 할 수있는 것은 결정적 언어이다가 말했다 있기 때문에, ...
아래는 "ambigous"의 의미를 이해하는 데 도움이되는 예입니다.
onewartwoearewe
어느 문법 으로 one war two ear ewe
또는 구문 분석 할 수 있습니다 o new art woe are we
-문법에 허용되는 경우 (예 : 방금 나열된 모든 단어가 있음).
이 예제 언어를 결정적이지 않게하려면 어떻게해야합니까? (예를 들어, o
문법을 모호하지 않게하기 위해 문법 에서 단어 를 제거 할 수 있습니다).
위의 언어는 결정적입니까?
추신. 예는 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 := ...
를 얻을 수 있습니다 ...
."