Question

Comment les productions d'erreur sont-elles généralement ajoutées?Je rencontre le problème que mes productions d'erreur sont trop superficielles: lorsque l'analyseur commence à afficher des états sur une erreur dans une instruction, il apparaît jusqu'à ce qu'il atteigne la production d'erreur pour la section dans laquelle il se trouve, et affiche une erreur non valideun message.

Est-ce une bonne idée d'ajouter simplement une production d'erreur descriptive à chaque non terminal?

Était-ce utile?

La solution

Les productions d'erreurs consistent à récupérer après une erreur afin de tenter de continuer à traiter l'entrée, pas à imprimer des messages d'erreur raisonnables ou utiles.Pour cela, ils doivent être utilisés à des points de la grammaire où il est probable que vous puissiez reconnaître et resynchroniser correctement le flux d'entrée.Par exemple, si votre langage consiste en une séquence de constructions se terminant par des caractères ;, une bonne production d'erreur est quelque chose comme construct: error ';', qui récupérera des erreurs dans un construct (quoi que ce soit) en sautant l'entrée d'un ; et en essayantpour continuer à partir de là.

Mettre de nombreuses règles de récupération d'erreur est généralement une mauvaise idée, car l'analyseur ne récupérera que vers la plus proche, et ce sont souvent les plus globales au niveau supérieur qui sont les plus susceptibles d'être utiles et d'essayer d'utiliser une granularité plus fineentraînera simplement des cascades d'erreurs car les règles de récupération d'erreur ne peuvent pas se resynchroniser correctement avec l'entrée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top