Un schéma est non déterministe quand il y a deux branches qui commencent par le même élément - de sorte que vous ne pouvez pas dire quelle branche à prendre sans regarder en avant après cet élément. Un exemple simple est ab|ac
- lorsque vous voyez un a
, vous ne savez pas quelle branche prendre. Pour les boucles, la "branche" consiste à répéter la boucle ou à continuer après. Un exemple de ceci est a*a
- une fois que vous êtes dans la boucle, et vous lisez un a
, vous ne savez pas s'il faut répéter la boucle, ou continuer.
En regardant votre exemple de schéma, imaginez qu'il vient d'analyser un <till>
, et qu'il doit maintenant analyser un <from>
. Vous pouvez l'analyser avec la boucle <from><till>
ou avec la version finale <from>
. Vous ne pouvez pas dire quelle branche utiliser, juste en regardant cela <from>
. Vous pouvez seulement dire avec plus de perspicacité.
Mauvaises nouvelles: Je pense que votre exemple de schéma est très rare, qu'il est impossible d'exprimer de manière déterministe!
Voici les documents XML que vous voulez accepter (j'utilise une seule lettre pour chaque élément, où a
= <from>...</from>
et b
= <to>...</to>
.
*empty*
a
ab
aba
abab
ababa
ababab
...
... vous avez l'idée Le problème est que toute lettre peut être la lettre finale dans la séquence ou il peut faire partie de la boucle.Il est impossible de dire ce qu'il sera, sauf en regardant en avant à la lettre suivante. que vous ne faites pas ce lookahead (par définition), la langue que vous voulez ne peut pas être exprimée de façon déterministeSimplifiant votre schéma, il tente une approche similaire à (ab)*a?
- mais les deux branches commencent par a
. Une autre approche est a(ba)*b?
- maintenant les deux branches commencent par b
. Nous ne pouvons pas gagner!
Techniquement, l'ensemble de tous les documents acceptés par un schéma est appelé . S'il n'existe pas de schéma déterministe pouvant exprimer un langage, le langage est appelé "un ambigu".
Pour une discussion théorique, voir la série de documents par Brüggemann-Klein (par exemple Deterministic Regular Languages et One-Unambiguous Regular Languages). Elle inclut un test formel pour les langues non ambiguës.
Ce n'est pas tout à fait la réponse que j'espérais, mais je suppose que c'est le meilleur que je vais avoir, alors merci :) –