Nous avons vu comment construire un arbre syntaxique abstrait, et nous avons remarqué qu'il est souvent nécessaire de savoir la position d'un token analysé par YACC [“Yet Another Compiler Compiler”[1]] et Lex[5]
Nous pouvons constater que ces informations sont aussi présentes dans la structure YYLTYPE du fichier y.tab.h[6]
Nous pouvons faire un override cette structure pour ajouter d'autres informations si nécessaire, mais nous avons déjà assez d'informations pour débuter.
A chaque fois que l'analyseur lexical effectuera une réduction selon une règle, il peut stocker dans yylloc la position du nouveau symbole LHS [“Left-Hand Side”[7]] qui sera référencé par @$, et les positions des symboles RHS [“Right-Hand Side”[9]] qui seront référencés par @1, @2, etc.
Comme ce traitement possède un certain coût (en temps et en espace mémoire[11]), ce traitement n'est pas appliqué par défaut, mais nous pouvons demander à YACC de l'activer en ajoutant la directive %locations dans la partie des définitions[12] de notre fichier YACC.
Déterminer la position de fin du symbole terminal est aisé, mais ce n'est pas aussi façile de mémoriser la position du début du symbole car le traitement est effectué après que l'analyseur lexical ait effectué sa réduction.
Nous pouvons définir dans notre fichier Lex[5] une action qui sera effectuée avant de procéder à une réduction : YY_USER_ACTION.
Nous allons donc faire suivre #define YY_USER_ACTION par le code en langage C que nous désirons effectuer avant de renvoyer la constante associée au symbole terminal découvert par l'analyseur lexical.
#define YY_USER_ACTION yylloc.first_line=yylloc.last_line=yylineno;yylloc.first_column=yylloc.last_column=yyTempColumn+yyleng-1;yyTempColumn+=yyleng;
La définition de YY_USER_ACTION n'est pas franchement lisible, et nous pouvons créer notre propre fonction qui retournera la valeur de la constante associée au symbole terminal découvert par l'analyseur lexical après avoir effectué certains traitements, comme le montre l'exemple suivant :
{ yylloc.first_line=yylloc.last_line=yylineno; yylloc.first_column=yylloc.last_column=yyTempColumn+yyleng-1; yyTempColumn+=yyleng; return tokenType; }
Dans nos règles de traductions de la grammaire au sein du fichier Lex[5], nous avions par exemple ceci :
"&&" { return AND; }
Nous pouvons à présent le remplacer par :
"&&" { return processToken(AND); }
cf. exemple de fichier Lex complet.
Nous pouvons demander à YACC de générer des messages d'erreur plus complets en ajoutant la directive %error-verbose dans la partie des définitions de notre fichier YACC.
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.
40 mots clés dont 27 définis manuellement (plus d'information...).
Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.
Error Reporting and Recovery(Août 2009)
Tips for building more user-friendly compilers and interpreters(version 27/07/06)
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.
Recherche (afficher)
Utilisateur (masquer)
Navigation (masquer)
Apparence (afficher)
Stats (afficher)
Citation (masquer)