2009-11-30 5 views

Répondre

2

Il existe plusieurs façons de gérer la portée dans une table de symboles. Un moyen très simple est d'avoir une table séparée pour chaque portée et de maintenir une liste d'étendues actives.

Chaque fois qu'une nouvelle étendue est entrée, vous pouvez créer une table pour elle et l'ajouter au début de la liste d'étendue active. Lorsque vous quittez la portée, supprimez simplement la tête de la liste d'étendue active.

Je trouve généralement que vous ne voulez pas détruire la table lorsque vous avez fini d'analyser une étendue. Vous en aurez peut-être besoin plus tard pour faire une analyse sémantique, générer des informations de débogage, etc.

+0

Semble comme un 'Stack' de tables de symboles au lieu d'un' List' –

+0

A droite, c'est une pile d'étendues. Ou un FIFO d'étendues. Ou une liste d'étendues actives par ordre de pertinence. J'ai choisi de regarder comme ce dernier parce que je traverserais la liste de la tête à la queue pour trouver une portée contenant un symbole qui m'intéresse. –

+0

Ou un arbre, où passer de la bordure à la racine. –

2

Ce problème est indirectement lié à yacc, car vous semblez avoir déterminé correctement. (Tout yacc fait correspondre les chaînes d'entrée aux chaînes de votre grammaire.)

Ainsi, vous pouvez faire tout le traitement des symboles et tous les autres traitements sémantiques dans le code. Vous avez toute structure de données que vous pouvez imaginer à votre disposition.

Quelques réflexions à s'organiser avec:

  • Vous pouvez créer de nouvelles tables de symboles que vous entrez dans les portées imbriquées, puis effectuez simplement plusieurs recherches dans une direction vers l'extérieur jusqu'à ce que vous trouviez un symbole donné.

  • Vous pouvez utiliser une seule table et marquer chaque symbole avec son niveau lexical d'origine. Vous devrez alors gérer les symboles en double qui ne diffèrent que par le niveau lexical et nécessiter une recherche qui pourrait renvoyer plusieurs symboles, mais vous n'aurez besoin que d'une seule table. Si vous ne prévoyez pas de conserver tous les symboles après avoir quitté une portée, cela peut représenter plus de problèmes que de valeur. Si vous faites cela, vous voudrez peut-être conserver une pile séparée contenant un pointeur racine vers les liens qui filent ensemble tous les symboles d'une portée donnée.

Questions connexes