2017-10-01 43 views
0

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.

Répondre

1

L'une des raisons est la gestion de la mémoire. Il est classique de faire passer une copie des chaînes de jetons de lexer à l'analyseur (au moins dans le cas des jetons d'identification), mais les identificateurs apparaissent généralement plus d'une fois dans le texte source et une seule copie est vraiment nécessaire.

Plutôt que d'effectuer la copie à chaque fois, il peut être pratique de « stagiaire » la chaîne dans une table de hachage des identifiants et il suffit de passer l'entrée de table de hachage. De cette façon, les apparitions secondaires et subséquentes de chaque symbole n'entraînent aucune allocation dynamique. En outre, l'ensemble du stockage de chaîne peut être conservé dans le cadre de la structure de données de la table de chaînes, ce qui peut simplifier la logique de libération du stockage alloué dynamiquement.

Ce n'est pas exactement une table de symbole, car il n'a pas (encore) comporte aucune information sémantique ou la portée. Mais la table de chaînes pourrait certainement être la structure de base qui contient la table de symboles, au moins assez pour être qualifiée de "début [de] la construction de la table de symboles". Dans certaines langues - C étant l'exemple canonique - le lexeur pourrait vouloir être en mesure de consulter les informations sémantiques dans la table des symboles, de sorte que le partage pourrait être plus imbriqué. Mais même sans ce piratage, le partage du mécanisme d'index de base peut s'avérer utile et ne rompt pas nécessairement le concept de séparation des préoccupations.

+0

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

+3

@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