J'essaie de comprendre ce que l'on entend par «déterministe» dans des expressions telles que «grammaire déterministe sans contexte». (Il y a des "choses" plus déterministes dans ce domaine). J'apprécierais un exemple plus que l'explication la plus élaborée! Si possible.
Ma principale source de confusion est de ne pas pouvoir dire en quoi cette propriété d'une grammaire est différente de (non) l'ambiguïté.
Le plus proche que j'ai pu trouver ce que cela signifie est cette citation de l'article de D. Knuth sur la traduction des langues de gauche à droite :
Ginsburg et Greibach (1965) ont défini la notion de langage déterministe; nous montrons dans la section V que ce sont précisément les langues pour lesquelles il existe une grammaire LR (k)
qui devient circulaire dès que vous arrivez à la Section V
, car là, il est dit que ce que l'analyseur LR (k) peut analyser est le langage déterministe ...
Vous trouverez ci-dessous un exemple que je pourrais trouver pour m'aider à comprendre ce que signifie «ambigu», veuillez jeter un œil:
onewartwoearewe
Qui peut être analysé comme one war two ear ewe
ou o new art woe are we
- si une grammaire le permet (disons qu'elle contient tous les mots que je viens d'énumérer).
Que devrais-je faire pour rendre cet exemple de langage (non) déterministe? (Je pourrais, par exemple, supprimer le mot o
de la grammaire, pour que la grammaire ne soit pas ambiguë).
Le langage ci-dessus est-il déterministe?
PS. L'exemple est tiré du livre Godel, Esher, Bach: Eternal Golden Braid.
Disons que nous définissons la grammaire de l'exemple de langue comme suit:
S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'
Par l'argument d'avoir à analyser la chaîne entière, cette grammaire rend-elle le langage non déterministe?
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'
, alors ce ne sera plus ambigu ...
S
. Par l'application de la règle S := ...
, nous obtenons ...
, ..."