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
4 Réponses :
Si vous définissez la variable globale yydebug code> 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. P>
Utilisez la % μl-Verbose code> 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. P>
Bison recommande % Définir Parse.Error Verbose Code> Maintenant, mais ce qui précède fonctionne toujours!
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. P>
Il y a quelques choses que vous pouvez faire assez facilement. P>
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. P>
L'autre est de compiler avec YACC Déboguement activé, puis allumez-le. Cela nécessite du manuel BISON 2.4.3: P>
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. P>
Il existe plusieurs moyens pour permettre la compilation d'installations de trace: p>
Le macro Définissez le macro L'option Utilisez l'option la directive Ajouter le Nous vous suggérons de toujours activer l'option de débogage afin que le débogage soit toujours possible. P>
La facilité de trace génère des messages avec des appels macro du formulaire 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 Chaque étape prise par l'analyseur lorsque -dyydebug = 1 code> et définir la variable yydebug code> à 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. P>
§8.2 Tracer votre anal h3>
yydebug code> p>
yydebug code> à une valeur non zéro lorsque vous compilez l'analyseur.
Ceci est conforme à Posix Yacc. Vous pouvez utiliser -dyydebug = 1 code> comme compilateur
option ou vous pouvez mettre #define yydebug 1 code> dans le prologue de la grammaire
Fichier (voir section 3.1.1 [Le prologue], page 47). P> li>
-t code>, - débogage code> p>
-t code> lorsque vous exécutez Bison (voir chapitre 9 [Invoquant Bison],
Page 117). Ceci est une conformité de POSIX aussi. P> LI>
% débogage code> p>
% Débogou CODE> 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. P> li>
ul>
yyfprintf (stardr,
Format, Args) Code> où format code> et args code> sont le formulaire printf code> format et arguments variadiques.
Si vous définissez yydebug code> à une valeur non zéro mais ne définit pas yyfprintf code>, yyfprintf code> est défini sur fprintf code>. p>
yydebug code>. 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. P>
yydebug code> est non nul produit une ligne ou deux de trace
Informations, écrites sur stardr code>. Les messages de trace vous disent ces choses: P>
yylex code>, quel genre de jeton a été lu. li>
L'émission des jetons dans Yylex () était la winrar pour moi.
Il y a une confusion ici. P>
Pour que les messages d'erreur soient plus précis (à cet égard, Jonathan est faux), Bison peut em> faire mieux, grâce à "% définir parse.trace" code "est exactement le même que "% debug " code>: 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 code>, voir la documentation gentiment reproduite par Jonathan Leffler). P>
"% Définir erreur-verbose" code>, comme indiqué par Alek. P>