Mon analyseur yacc crée une table de symboles, mais je dois prendre en compte la portée. Comment ferais-je cela? J'ai entendu quelque chose sur la façon dont lorsque vous quittez une portée, la table des symboles est détruite. Toujours pas très clair sur la façon de le faire.Comment prendre en compte la portée lors de la construction d'une table de symboles avec yacc?
Répondre
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.
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.
- 1. Comment obtenir toutes les variables définies dans la portée/table de symboles actuelle?
- 2. Comment prendre le contrôle de la construction d'un WebService
- 3. Points à prendre en compte lors de l'implémentation de la mémoire partagée
- 4. Lors de la préparation d'un diagramme de Gantt, quelles sont les choses à prendre en compte?
- 5. créer la table des symboles
- 6. Lambda Paramètre non inclus dans la portée - lors de la construction de l'expression binaire lambda
- 7. Que prendre en compte lors de la signature d'un nom fort d'une application gérée?
- 8. Comment créer une table de symboles si une grammaire est donnée dans un fichier yacc?
- 9. Étapes à prendre en compte lors de la planification du nouveau projet
- 10. Traitement des symboles et des méthodes obsolètes lors de la construction de plusieurs versions d'iOS
- 11. Comment intégrer NSIS avec un système de construction et prendre en charge la gestion des versions
- 12. Comment accéder à la table des symboles dans Ruby?
- 13. Dégradation progressive - à prendre en compte
- 14. Quand la table de symboles de ce programme est-elle construite
- 15. Avertissements à prendre en compte lors de l'utilisation de threads en Python?
- 16. Nom de ces colonnes dans ma table de symboles
- 17. Opérations avec YACC en C pour un sous-ensemble LISP
- 18. De retour d'une table de symboles de la bibliothèque partagée
- 19. Erreurs de liaison lors de la construction avec Core Plot
- 20. Caractéristiques nécessaires lors de la construction d'un ORM avec PHP?
- 21. Interagir avec la chaîne de portée JavaScript
- 22. Après avoir restreint la portée de Setter, puis appliqué une interface, la portée n'est pas prise en compte!
- 23. Problème de débordement de la table des symboles dans Ruby
- 24. Erreur Xcode lors de la construction
- 25. Problème avec la portée de la variable en Python
- 26. Texte tronqué lors de la construction d'emails avec vmime
- 27. UISearchBar- change la portée sans table grise?
- 28. sgen.exe échoue lors de la construction
- 29. Problème d'Adobe Flex Salesforce lors de la conversion des ID de compte en nom de compte
- 30. Que dois-je prendre en compte lors du déploiement d'une nouvelle batterie de serveurs Web?
Semble comme un 'Stack' de tables de symboles au lieu d'un' List' –
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. –
Ou un arbre, où passer de la bordure à la racine. –