Alguém pode me esclarecer por que um analisador de descida recursiva com retrocesso que tenta as produções e S → a a (nessa ordem) não reconhece o idioma formado pela gramática S → a S a | a a .
Parece analisar apenas as palavras do idioma .
Gerei esse analisador usando este ABNF Parser Generator com a regra de produção S = "a" S "a" / "aa"
e o analisador não reconhece a palavra aaaaaa
, por exemplo.
Eu esperaria que ele usasse a produção até que a concatenação dos nós terminais da árvore de análise a partir da esquerda inicie com 7 's, e suba a árvore de análise escolhendo a produção S → a a em vez disso até que a árvore pareça como isso:a
S
/ | \
a S a
/ | \
a S a
/ \
a a
context-free
formal-grammars
compilers
parsers
meribold
fonte
fonte
aaaaaa
.aaaaaa
deve analisar e não. Masaaaa
analisa. Aparentemente, você está certo sobre os poderes de 2. A coisa deve estar com erros. ele analisa apenasaa
comS = "aa" / "a" [S] "a"
. Você pode rastrear o que o analisador faz?Respostas:
Isso não é muita resposta, mas as árvores de análise não se encaixam nos comentários normais.
Mas a árvore de análise tem a seguinte forma:
ou se você preferir esta apresentação, com os terminais em linhas diferentes
Eu verifiquei que o gerador do analisador ABNF parece não funcionar, mas não sei como rastrear o que ele faz.
É um pouco surpreendente ter um site tão elaborado em torno de um analisador de buggy, que além disso usa uma técnica de análise totalmente desinteressante.
Depois de uma análise mais aprofundada:
Eu acho que encontrei uma fonte do problema. Os colchetes significam opcional .
Portanto, sua gramática deve ser escrita
S = "a" S "a" / "aa"
ouS = "a" [S] "a"
. Então parece funcionar corretamente.Mas o sistema aparentemente está perdido ao ter o dobro da mesma regra de formas diferentes. Não sei por quê.
Não encontrei uma página explicando esses problemas sintáticos para especificar a gramática.
Eu ainda considero esse carrinho.
fonte
S ::= 'a'<S>'a' | 'a''a'
aaaaaa
durante o usoS = "a" S "a" / "aa"
, mas você parece estar certo quanto aos colchetes.S = "a" S "a" / "aa"
... testei muito rápido e cliquei em gerar em vez de analisar.s1()
true
s()
s2()
Considere analisar a palavra
aaaaaa
novamente. Em um ponto, a árvore de análise terá a seguinte aparência:s()
true
S
Eu costumo considerar isso um problema com minha implementação e não com o retrocesso de analisadores de descida recursiva em geral.
fonte
É um recurso, não um bug
Veja de perto quando e onde ocorre o retorno:
O ponto crucial aqui é que o analisador retorna atrás da posição, onde o último caractere correspondente foi encontrado. É por isso que "salta" da árvore 11 com l = aaaaaaaa para a 12ª árvore com l = aaaa usando S -> aa em l [7].
fonte