Pegjs: Erros diferentes retornados quando o cache é habilitado / desabilitado

Criado em 28 ago. 2016  ·  20Comentários  ·  Fonte: pegjs/pegjs

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.

Relatório original

bug

Comentários muito úteis

Você pode dar uma olhada em uma correção aqui .

Todos 20 comentários

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:

  • com o cache habilitado, ele suprime possíveis correspondências
  • sem cache, a análise fica mais lenta em magnitudes, tornando-o inutilizável

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:

  1. pedindo ao proprietário original para me permitir recortar um 0.12.0 de 0.10.0 ,
  2. para escolher e lançar recursos consistentemente rápidos do agora morto 0.11.0 branch,
  3. remover as ferramentas e configurações incomuns, em favor de uma configuração de desenvolvimento padrão, e
  4. para colocar a biblioteca em um lugar onde adicionar recursos seja fácil para a comunidade

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.

Esta página foi útil?
0 / 5 - 0 avaliações