Pegjs: Différentes erreurs renvoyées lorsque le cache est activé/désactivé

Créé le 28 août 2016  ·  20Commentaires  ·  Source: pegjs/pegjs

Grammaire:

Statement
  = "{" __ !Statement Statement __ "}"
__
  = [ \t\r\n]*

Contribution:

{x}

Avec le cache des résultats désactivé, ce qui précède produit cette erreur :

"{" ou [ \t\r\n] attendu mais "x" trouvé.

Lorsque le cache des résultats est activé, l'erreur devient :

Attendu [ \t\r\n] mais "x" trouvé.

Les erreurs doivent être les mêmes dans les deux cas.

Rapport original

bug

Commentaire le plus utile

Vous pouvez consulter un correctif ici .

Tous les 20 commentaires

Je m'appuie sur les lancers pegjs assez expressifs de SyntaxError s pour construire la complétion de la syntaxe pour les utilisateurs.

Cependant, ce problème m'empêche de le faire pour des grammaires plus compliquées :

  • avec le cache activé, il supprime les correspondances possibles
  • sans cache, l'analyse ralentit de plusieurs ampleurs, la rendant inutilisable

Une autre grammaire pour laquelle l'erreur s'applique :

Start
    = Char+ End

End
    = "e"

Char
    = (!End [a-z])+

Contribution:

a

Avec le cache des résultats désactivé, ce qui précède produit cette erreur :

"e", [az] attendu ou pas "e" mais fin de l'entrée trouvée.

Lorsque le cache des résultats est activé, l'erreur devient :

[az] attendu mais fin de l'entrée trouvée.

L'erreur de désactivation du cache est correcte, car ae correspond à la grammaire.

Échec des cas de test ajoutés avec # 555

La raison de ce problème semble être :

  • lors de l'évaluation initiale d'une règle, peg$expect est appelé pour enregistrer les jetons attendus. Dans certains cas ( peg$silentFails > 0 ) les jetons sont cependant ignorés.

  • pendant l' évaluation mise en peg$expect . Sinon, il manque les jetons attendus. Cela se manifeste dans les messages d'erreur incomplets vus ci-dessus.

Dans un prototype local basé sur [email protected] j'ai pu résoudre ce problème en enregistrant et en rejouant les appels à peg$expect . Cependant, avec les changements introduits dans https://github.com/pegjs/pegjs/commit/669f782a5f3928a2958147992eb07df5b0ecf54a, ces choses sont devenues beaucoup plus compliquées.

Je pourrais tenter un correctif pour pegjs@dev . Je me demande juste si je vais dans la bonne direction.

Des commentaires @Mingun , @futagoza ?

Pouvez-vous me montrer votre prototype local basé sur [email protected] ?

Vous pouvez consulter un correctif ici .

Cela ne fonctionne pas encore correctement pour les éléments silencieux imbriqués :

Grammaire:

Start
  = Char+ End
End "end"
  = "e"
Char
  = !End [a-z]'

Contribution:

a

Message attendu :

Fin attendue, ou [az] mais fin de l'entrée trouvée.

Message réel :

Fin attendue, "e" ou [az] mais fin de l'entrée trouvée.

Cf. cas de test en échec .

@nikku Cela devrait être résolu maintenant (merci à vous 🙇 ), avec les 3 cas de test réussis (y compris le 3ème pour les éléments silencieux imbriqués).

Le correctif est présent dans la dernière version pegjs@dev est juste poussé vers NPM, [email protected] (https://github.com/pegjs/pegjs#latest).

Merci.

J'ai testé vos modifications aujourd'hui.

D'après ce que je vois https://github.com/pegjs/pegjs/commit/f5b323b40124e9ebe1336b509af0716d5a31ce55#diff -cd2c6b13fdcedf68a390c8bb6ea65cafR148 introduit un changement de rupture, car il élimine efficacement le peg$silentFails === 0 garde avec --no-cache parseurs générés .

oups, c'était une erreur stupide. Je vais régler ça bientôt, merci pour l'avertissement

J'ai essayé de créer un cas de test mais a échoué : cry:. Je vois cependant que cette ligne a un impact sur l'une de mes grammaires les plus compliquées.

Restauré la garde dans https://github.com/pegjs/pegjs/commit/d06a5b52efcf0fa4b9e5bf21f97607786c1c7db5 et poussé les modifications à pegjs@dev , dites-moi si cela résout le problème

@nikku Est-ce résolu ou rencontrez-vous toujours ce problème ? Je veux juste savoir si je dois rouvrir ce problème.

C'est réparé.

@nikku - Ce n'est pas corrigé. Rien n'a été libéré. npm toujours 0.10.0 , et cela a été fusionné avec une branche de fonctionnalité 0.11.0 qui, selon ryuu, ne sera jamais réellement publiée

J'ai cessé d'espérer des pegjs et j'ai cherché ailleurs il y a longtemps exactement pour cette raison.

Pas de version = personne ne peut réellement l'utiliser. Pegjs a été historiquement mauvais avec les sorties.

J'espère changer le cycle de libération des chevilles en :

  1. demander au propriétaire d'origine de me permettre de recouper un 0.12.0 partir de 0.10.0 ,
  2. de choisir et de publier régulièrement des fonctionnalités à partir de la branche 0.11.0 maintenant morte,
  3. supprimer les outils et la configuration peu communs, au profit d'une configuration de développement standard, et
  4. pour placer la bibliothèque dans un endroit où l'ajout de fonctionnalités est facile pour la communauté

Si quelque chose comme ça se produisait, sous n'importe quel jeu de mains, puis que les sorties commençaient réellement, lui donneriez-vous une autre chance ?

Je vous souhaite bonne chance pour y parvenir.

merci

On verra.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

futagoza picture futagoza  ·  13Commentaires

mikeaustin picture mikeaustin  ·  7Commentaires

audinue picture audinue  ·  13Commentaires

richb-hanover picture richb-hanover  ·  7Commentaires

marek-baranowski picture marek-baranowski  ·  6Commentaires