2010-10-25 28 views
0

Contexte: Je fais un compilateur, le scanner et l'analyseur sont déjà terminés. Nous avons notre grammaire formelle, qui définit un programme:Stockage des variables et des constantes lors de la compilation. (exemple de langage)

program = 
declarations 
procedureDeclarations 
main  ( ){   
    declarations 
    statementSequence 
} 

Vous pouvez remarquer que les déclarations peuvent être soit la principale méthode globale ou locale. Donc, comme je l'analyse, j'ai besoin d'un moyen de stocker ces trois choses: Si l'identifiant entrant est un: Constant ou variable (je peux dire par quelle méthode d'analyse je suis, parseConst() ou parseVar()), globale ou local, son nom actuel, et sa valeur (si je le sais encore).

Je suis un peu confus comment stocker tout cela. Dans ma classe de structures de données, nous n'avons vraiment que 2 choses à stocker, une clé et une valeur. Je voudrais avoir quelque chose comme:

identHashMap<String, String> // where the first string is the ident's name, and the second is if it's a constant or var (this could be a boolean also) 
constantIdentifiers<String, String> // first string is the ident's name, second is whether it's local/global (could be a string) 
varIdentifiers<String, String> // first string is the ident's name, second is whether it's local/global (could be a string) 
identifierValues<String, Integer> // ident's name, Ident's value 

Il semble que wayyy trop de structures de données pour une tâche simple. Dois-je créer une classe, Identifier, et avoir un champ booléen Global/local, ainsi qu'une constante/var boolean? Et puis les mettre tous dans un identifiant hashmap?

Merci!

Répondre

0

Je pense que ce que vous cherchez est des étendues, vous auriez besoin d'étendues pour contenir toutes les variables qui lui sont associées dans une structure semblable à une pile, par exemple. une fonction aurait sa propre portée qui est retirée de la pile quand la fonction est laissée.

+0

Hmm, je vais regarder ça, même si on ne m'a jamais enseigné ça – Dave