Y at-il des raisons de commencer à construire la table des symboles au stade lexer?stade approprié pour la table des symboles de construction
Dans le livre flex & bison: Text Processing Tools l'auteur donne un exemple de lexer avec une tentative de construire une table simple symbole. Il existe une solution dans le code suivant pour distinguer une définition de symbole de ses références:
/* declaration keywords */
auto |
char |
int |
/* ... skip ... */
volatile { defining = 1; }
/* ... skip ... */
/* punctuators */
"{"|"<%"|";"
{ defining = 0; }
Cette solution ne fonctionnera pas dans les cas plus complexes, tels que int a = b, c = d;
(symbole c
ne sera pas marqué comme une définition). En plus de cela, les étendues imbriquées ne peuvent pas être manipulées à l'étape du lexer.
Il est noté dans la question lex and yacc (symbol table generation) qu'accéder à la table de symboles de lexer est conventionnel, mais je ne peux toujours pas voir les avantages et pourquoi la table construite dans lexer pourrait être utile plus tard.
Il est une motivation très claire, mais une question reste. Pourquoi mettre le drapeau 'defining' dans les règles lexer? Il semble que l'exemple de l'auteur soit extrêmement simple et que cette solution de contournement soit juste suffisante pour faire avancer les choses. – Unforgiven
@unforgiven: Cet extrait est extrait d'un exemple d'outil construit uniquement avec flex. L'outil tente de croiser les utilisations des symboles avec la définition du symbole. Comme il n'analyse pas réellement le texte source, il s'appuie sur des indices lexicaux pour décider si une utilisation donnée de l'identifiant est une définition ou une utilisation. C'est expliqué dans le texte, ce qui vaut probablement la peine d'être lu en détail. – rici