6
votes

Sortie d'erreur de bison

J'utilise Bison et j'ai généré une grammaire assez complexe. Le problème est que mon premier cas de test échoue - mais le bison ne dira que «une erreur de syntaxe». Y a-t-il un moyen de demander à Bison de produire la règle qui a échoué et le jeton qui est un problème? J'ai utilisé

%define parse.trace true


0 commentaires

4 Réponses :


2
votes

Si vous définissez la variable globale yydebug sur une valeur non zéro, bison produira des informations de débogage car elle est en cours d'exécution, qui contient des informations sur ce que la pile d'analyse ressemble, quel état il est dans ce que les règles utilisent-elles , etc. C'est comme ça que je vais habituellement de déboguer ces sortes d'erreurs.


0 commentaires

7
votes

Utilisez la % μl-Verbose directive pour vous aider à sortir. Cela vous donnera un soupçon de quelles attentes l'analyseur s'attendait. Notez qu'il peut y avoir plus d'une règle potentielle qui n'a pas pu correspondre.


1 commentaires

Bison recommande % Définir Parse.Error Verbose Maintenant, mais ce qui précède fonctionne toujours!



9
votes

Aucun des parsers basés sur le YACC ne fait quelque chose de beaucoup mieux que «Erreur de syntaxe» quand il y a un problème; C'est en grande partie à vous de vous améliorer sur cela.

Il y a quelques choses que vous pouvez faire assez facilement.

On est d'instruminer votre analyseur lexical afin qu'il imprime les jetons qu'il trouve comme il les renvoie à l'analyseur approprié. Cela vous dit quel jeton la grammaire échoue et quels jetons ont été fournis à l'avance.

L'autre est de compiler avec YACC Déboguement activé, puis allumez-le. Cela nécessite -dyydebug = 1 et définir la variable yydebug à une valeur non nulle (classiquement 1). La première étape compile les informations supplémentaires dans la grammaire; La deuxième étape permet la sortie.

du manuel BISON 2.4.3:

§8.2 Tracer votre anal

Si une grammaire de bison compile correctement mais ne fait pas ce que vous voulez quand il court, le La fonctionnalité Yydebug Parser-Trace peut vous aider à déterminer pourquoi.

Il existe plusieurs moyens pour permettre la compilation d'installations de trace:

  • Le macro yydebug

    Définissez le macro yydebug à une valeur non zéro lorsque vous compilez l'analyseur. Ceci est conforme à Posix Yacc. Vous pouvez utiliser -dyydebug = 1 comme compilateur option ou vous pouvez mettre #define yydebug 1 dans le prologue de la grammaire Fichier (voir section 3.1.1 [Le prologue], page 47).

  • L'option -t , - débogage

    Utilisez l'option -t lorsque vous exécutez Bison (voir chapitre 9 [Invoquant Bison], Page 117). Ceci est une conformité de POSIX aussi.

  • la directive % débogage

    Ajouter le % Débogou DIRECTIVE (voir la section 3.7.12 [Résumé de la déclaration de bison] page 72). Ceci est une extension de bison, qui s'avérera utile lorsque Bison sera Les analyseurs de sortie pour les langues qui n'utilisent pas de préprocesseur. Sauf si Posix et YACC La portabilité compte pour vous, c'est la solution préférée.

    Nous vous suggérons de toujours activer l'option de débogage afin que le débogage soit toujours possible.

    La facilité de trace génère des messages avec des appels macro du formulaire yyfprintf (stardr, Format, Args) format et args sont le formulaire printf format et arguments variadiques. Si vous définissez yydebug à une valeur non zéro mais ne définit pas yyfprintf , est automatiquement inclus et yyfprintf est défini sur fprintf .

    Une fois que vous avez compilé le programme avec des installations de trace, la façon de demander une trace est Pour stocker une valeur non zéro dans la variable yydebug . Vous pouvez le faire en faisant le code C il (en main, peut-être), ou vous pouvez modifier la valeur avec un débogueur C.

    Chaque étape prise par l'analyseur lorsque yydebug est non nul produit une ligne ou deux de trace Informations, écrites sur stardr . Les messages de trace vous disent ces choses:

    • Chaque fois que l'analyseur appelle yylex , quel genre de jeton a été lu.
    • Chaque fois qu'un jeton est décalé, la profondeur et le contenu complet de la pile d'état (voir Section 5.5 [États d'analyses], page 95).
    • Chaque fois qu'une règle est réduite, ce qui règle, et le contenu complet de l'état pile après.


1 commentaires

L'émission des jetons dans Yylex () était la winrar pour moi.



2
votes

Il y a une confusion ici.

"% définir parse.trace" "% debug ": il instruit l'analyseur généré pour les traces d'exécution, montrant l'analyseur au travail (mais Vous devez toujours régler la variable yydebug , voir la documentation gentiment reproduite par Jonathan Leffler).

Pour que les messages d'erreur soient plus précis (à cet égard, Jonathan est faux), Bison peut faire mieux, grâce à "% Définir erreur-verbose" , comme indiqué par Alek.


0 commentaires