Gramática:
Statement
= "{" __ !Statement Statement __ "}"
__
= [ \t\r\n]*
Entrada:
{x}
Com o cache de resultados desativado, o acima produz este erro:
Esperado "{" ou [\ t \ r \ n] mas "x" encontrado.
Com o cache de resultados ativado, o erro muda para:
Esperado [\ t \ r \ n] mas "x" encontrado.
Os erros devem ser os mesmos em ambos os casos.
Estou contando com os expressivos SyntaxError
s pegjs lançados para construir a conclusão da sintaxe para os usuários.
No entanto, esse problema me impede de fazer isso para gramáticas mais complicadas:
Outra gramática à qual o erro se aplica:
Start
= Char+ End
End
= "e"
Char
= (!End [a-z])+
Entrada:
a
Com o cache de resultados desativado, o acima produz este erro:
Esperado "e", [az] ou não "e", mas fim da entrada encontrado.
Com o cache de resultados ativado, o erro muda para:
Esperado [az], mas final da entrada encontrado.
O erro de cache desabilitado está correto, pois ae
corresponde à gramática.
Casos de teste com falha adicionados com # 555
O motivo desse problema parece ser:
durante a avaliação inicial de uma regra, peg$expect
é chamado para registrar os tokens esperados. Em certos casos ( peg$silentFails > 0
) os tokens estão sendo ignorados.
durante a avaliação em cache , o resultado em cache está sendo restaurado. Nesse ponto, o analisador não deve apenas restaurar o novo estado de análise, mas também reproduzir as chamadas relevantes para peg$expect
. Caso contrário, ele perde os tokens esperados. Isso se manifesta nas mensagens de erro incompletas vistas acima.
Em um protótipo local baseado em [email protected]
, consegui corrigir esse problema gravando e reproduzindo chamadas para peg$expect
. No entanto, com as mudanças introduzidas em https://github.com/pegjs/pegjs/commit/669f782a5f3928a2958147992eb07df5b0ecf54a, essas coisas ficaram muito mais complicadas.
Eu poderia tentar consertar pegjs@dev
. Apenas me perguntando se estou indo na direção certa.
Algum comentário @Mingun , @futagoza?
Você pode me mostrar seu protótipo local baseado em [email protected]
?
Você pode dar uma olhada em uma correção aqui .
Ele ainda não funciona corretamente para elementos silenciados aninhados:
Gramática:
Start
= Char+ End
End "end"
= "e"
Char
= !End [a-z]'
Entrada:
a
Mensagem esperada:
Fim esperado, ou [az] mas fim da entrada encontrado.
Mensagem real:
Fim esperado, "e" ou [az] mas fim da entrada encontrado.
Cf. caso de teste com falha .
@nikku Isso deve ser resolvido agora (graças a você 🙇), com todos os 3 casos de teste sendo aprovados (incluindo o terceiro para elementos silenciados aninhados).
A correção está presente na versão mais recente de pegjs@dev
acaba de ser enviada ao NPM, [email protected]
(https://github.com/pegjs/pegjs#latest).
Obrigado.
Eu testei suas mudanças hoje.
Pelo que vejo https://github.com/pegjs/pegjs/commit/f5b323b40124e9ebe1336b509af0716d5a31ce55#diff -cd2c6b13fdcedf68a390c8bb6ea65cafR148 introduz uma alteração de quebra, pois ele efetivamente remove peg$silentFails === 0
--no-cache
parsers .
Opa, isso foi um erro estúpido. Vou consertar isso em breve, obrigado pelo aviso
Tentei criar um caso de teste, mas falhou: cry :
Restaurou a proteção em https://github.com/pegjs/pegjs/commit/d06a5b52efcf0fa4b9e5bf21f97607786c1c7db5 e enviou as alterações para pegjs@dev
, diga-me se isso corrige o problema
@nikku Está consertado ou você ainda está tendo esse problema? Só quero saber se devo reabrir esta edição.
Está consertado.
@nikku - Não foi corrigido. Nada foi divulgado. npm
ainda tem 0.10.0
, e isso foi mesclado com um branch de 0.11.0
que ryuu disse que nunca será lançado
Parei de esperar pegjs e procurei outro lugar há muito tempo exatamente por esse motivo.
Sem liberação = ninguém pode realmente usá-lo. Pegjs tem sido historicamente ruim com lançamentos.
Espero mudar o ciclo de liberação do pino:
0.12.0
de 0.10.0
,0.11.0
branch,Se algo assim acontecesse, sob qualquer par de mãos, e então os lançamentos realmente começassem, você daria outra chance?
Desejo a você muita sorte para conseguir isso.
obrigado 😁
Veremos.
Comentários muito úteis
Você pode dar uma olhada em uma correção aqui .