Ich versuche zu verstehen, was unter "deterministisch" in Ausdrücken wie "deterministische kontextfreie Grammatik" zu verstehen ist. (Es gibt eher deterministische "Dinge" in diesem Bereich). Ich würde ein Beispiel mehr schätzen als die ausführlichste Erklärung! Wenn möglich.
Meine Hauptverwirrung ist, dass ich nicht feststellen kann, inwiefern sich diese Eigenschaft einer Grammatik von (Nicht-) Mehrdeutigkeiten unterscheidet.
Am ehesten habe ich herausgefunden, was das bedeutet: Dieses Zitat stammt aus dem Artikel von D. Knuth über die Übersetzung von Sprachen von links nach rechts :
Ginsburg und Greibach (1965) haben den Begriff einer deterministischen Sprache definiert; Wir zeigen in Abschnitt V, dass dies genau die Sprachen sind, für die es eine LR (k) -Grammatik gibt
Das wird kreisförmig, sobald Sie zum kommen Section V
, denn dort heißt es, dass der LR (k) -Parser die deterministische Sprache parsen kann ...
Nachfolgend finden Sie ein Beispiel, anhand dessen ich nachvollziehen kann, was "ambivalent" bedeutet. Schauen Sie sich dies bitte an:
onewartwoearewe
Welches kann analysiert werden als one war two ear ewe
oder o new art woe are we
- wenn eine Grammatik das erlaubt (sagen Sie, es hat alle Wörter, die ich gerade aufgeführt habe).
Was muss ich tun, um diese Beispielsprache (nicht) deterministisch zu machen? (Ich könnte zum Beispiel das Wort o
aus der Grammatik entfernen , um die Grammatik nicht mehrdeutig zu machen).
Ist die obige Sprache deterministisch?
PS. Das Beispiel stammt aus dem Buch Godel, Esher, Bach: Eternal Golden Braid.
Nehmen wir an, wir definieren die Grammatik für die Beispielsprache wie folgt:
S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'
Macht diese Grammatik die Sprache durch das Argument, die gesamte Zeichenfolge analysieren zu müssen, nicht deterministisch?
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'
ist sie nicht mehr eindeutig ...
S
. Durch die Anwendung der Regel erhalten S := ...
wir ...
, ..."