Quelqu'un peut-il m'éclairer pourquoi un analyseur de descente récursive avec retour arrière qui essaie les productions et (dans cet ordre) ne reconnaît pas le langage formé par la grammaire .
Il semble analyser uniquement les mots de la langue .
J'ai généré un tel analyseur à l'aide de ce générateur d' analyseur ABNF avec la règle de production S = "a" S "a" / "aa"
et l'analyseur ne reconnaît pas le mot aaaaaa
, par exemple.
Je m'attendrais à ce qu'il utilise la production jusqu'à ce que la concaténation des nœuds terminaux de l'arbre d'analyse à partir de la gauche commence par 7 , puis monte dans l'arbre d'analyse en choisissant la production place jusqu'à ce que l'arbre ressemble ce:a
S
/ | \
a S a
/ | \
a S a
/ \
a a
context-free
formal-grammars
compilers
parsers
meribold
la source
la source
aaaaaa
.aaaaaa
doit analyser et ne fonctionne pas. Maisaaaa
analyse. Vous avez apparemment raison sur les pouvoirs de 2. La chose doit être mise sur écoute. il analyse uniquementaa
avecS = "aa" / "a" [S] "a"
. Pouvez-vous retracer ce que fait l'analyseur?Réponses:
Ce n'est pas vraiment une réponse, mais les arbres d'analyse ne correspondent pas aux commentaires normaux.
Votre grammaire doit analyser la chaîne .S→ un Sune | aa a a a a a a
Mais l'arbre d'analyse a la forme suivante:
ou si vous préférez cette présentation, avec les terminaux sur des lignes différentes
J'ai vérifié que le générateur d'analyseur ABNF ne semble pas fonctionner, mais je ne sais pas comment tracer ce qu'il fait.
Il semble en effet recongniser l'ensemble qui n'est pas ce que la grammaire définit.{ a2n | n≥1}
Il est un peu surprenant d'avoir un site aussi élaboré autour d'un analyseur de buggy, qui utilise en outre une technique d'analyse totalement inintéressante.
Après un nouvel examen:
Je pense avoir trouvé une source du problème. Les crochets signifient facultatif .
Donc, votre grammaire doit être écrite soit
S = "a" S "a" / "aa"
ouS = "a" [S] "a"
. Ensuite, cela semble fonctionner correctement.Mais le système est apparemment perdu lorsqu'il a deux fois la même règle sous différentes formes. Je ne suis pas sûr pourquoi.
Je n'ai pas trouvé de page expliquant ces problèmes syntaxiques pour spécifier la grammaire.
Je considère toujours ce buggy.
la source
S ::= 'a'<S>'a' | 'a''a'
aaaaaa
lors de l'utilisationS = "a" S "a" / "aa"
, mais vous semblez avoir raison sur les crochets.S = "a" S "a" / "aa"
... J'ai testé trop vite, et j'ai cliqué sur générer au lieu d'analyser.s1()
true
s()
s2()
Pensez à analyser à
aaaaaa
nouveau le mot . À un moment donné, l'arbre d'analyse ressemblera à ceci:s()
true
S
J'ai tendance à considérer cela comme un problème avec ma mise en œuvre et non avec le retour en arrière des analyseurs de descente récursifs en général, cependant.
la source
C'est une fonctionnalité pas un bug
Examinez de près quand et où le retour en arrière se produit:
Le point crucial ici est que l'analyseur revient en arrière après la position où le dernier caractère correspondant a été trouvé. C'est pourquoi il "saute" de l'arbre 11 avec l = aaaaaaaa au 12ème arbre avec l = aaaa en utilisant S -> aa à l [7].
la source