2009-12-19 4 views
0

est-il un organisme qui peut dire comment créer la table des symboles pour le compilateur en utilisant C.créer la table des symboles

+1

Vous voulez dire que le compilateur est écrit en C? Ou compile-t-il le code C? – zedoo

+1

ı besoin d'asymbol table en utilisant la table de hachage pour stocker la déclaration, les types de fonction, etc – iva

Répondre

2

La norme Stack ressources de débordement pour les compilateurs de construction et d'interprètes est Learning to write a compiler

+0

Cela appartient à un commentaire. Et la plupart de ces ressources supposent que le programmeur en sait assez sur son langage d'implémentation pour ne pas avoir à poser cette question de base. – dmckee

0

C'est la partie la plus facile imo, une fois vous avez votre parser fonctionnant, quand vous rencontrez des identifiants dans votre grammaire vous avez déjà toutes les informations sur eux, les types, s'ils font partie d'une règle de grammaire de fonction ou non, et s'ils font partie d'une déclaration/définition de fonction , vous avez tous les paramètres avec leurs types. Une fois que vous avez identifié toutes ces informations, la table de symboles la plus basique (globales uniquement) consiste à construire une liste de syndicats d'un nom et d'un type (une variable) ou un nom, un type et une liste de noms. type combos (fonction). Vous pouvez les séparer avec un drapeau ou quelque chose. Une fois cela fait, vous pouvez l'imbriquer davantage pour les fonctions et plus tard sur la portée, créant ainsi une table de symboles de style c. À la fin, pendant la phase de génération du code, c'est là que vous allez écrire les registres/étiquettes que vos symboles utiliseront, alors assurez-vous qu'il est facilement extensible; vous allez revenir beaucoup à ce référentiel pour ajouter des données de comptabilité. La partie la plus délicate est la migration de l'information pendant que vous analysez toujours votre grammaire. Cela se fait généralement avec une grande structure que vous remplissez lorsque vous le lisez. Prenez une déclaration int f(int x, int y) de style C: une fois que vous avez analysé int f, vous ne savez pas si vous analysez encore une fonction ou une variable, vous devez donc remplir votre structure avec juste le nom et le type, puis la transmettre au Abaissez les noeuds de l'arbre (dans le cas d'un analyseur de descente récursif) et laissez-les y faire face, puis une fois qu'ils ont terminé, retournez la structure à l'appelant afin qu'ils aient l'information complète, même si vous, dans les fonctions spécifiques, N'avez aucune idée de ce que vous êtes en train d'analyser.

1

Absolument la chose la plus simple que vous pouvez faire est de fournir un tableau de structures. Quelque chose comme:

typedef struct { 
    char *name; 
    char type; /* i for int, s for string ... */ 
    value union { 
    int i; 
    char c; 
    char *s; 
    float f; 
    } 
} symbol; 
symbol stable[MAX_SYMBOLS]; 
int symbolCount=0; 

et un ensemble de routines pour le manipuler.

Vous aurez besoin:

int isDefined(char *name); /* returns trye if the named symbol already exists */ 
symbol* addSymbol(char *name, char type); /* Adds a symbol; returns a pointer to it */ 
symbol* getSymbol(char *name); /* returns a pointer to the named symbol or NULL */ 

Une fois que cela fonctionne, vous voulez

  1. Débarrassez-vous de la table de symboles globale, et en faire un paramètre à tout ce que vous routines
  2. remplacer le tableau fixe méchant et inefficace avec un arbre ou une table de hachage
0

Rechercher comment faire ah table en frêne claveté sur ficelle. C'est la façon standard de le faire.

Questions connexes