2015-09-12 3 views
1

J'essaie de construire un compilateur et je suis assez perdu pour le moment. J'ai une classe principale et que vous souhaitez être en mesure de déclarer des classes supplémentaires avec l'héritage, i.e. class newClass extends classThatHasBeenDeclaredBefore { } Mon entrée ressembleObtenir la liste en grammaire

input:  
    class_main class_list { /* New program created */ } 

et mon class_list se compose de toutes mes classes dans mon programme, il peut aussi être vide.

Une classe simple est déclarée comme ceci:

class_decl: 
    CLASS_KWORD CLASS_ID 
     OPENCURLYBRACE 
      attributes_list 
      method_list 
     CLOSEDCURLYBRACE { /* Ok new class is created */} 

    | CLASS_KWORD CLASS_ID EXTENDS_KWORD CLASS_ID 
     OPENCURLYBRACE 
      attributes_list 
      method_list 
     CLOSEDCURLYBRACE { /* Has CLASS_ID Number 2 been declared before? */ } 
; 

Est-il possible que je peux vérifier si le second CLASS_ID a déjà été déclarée ou utilisé avant d'une certaine manière? Ma pensée est que mon class_list est inaccessible d'où j'essaye d'ajouter ma nouvelle classe, mais je suce chez OCaml.

Répondre

1

Une manière simple de gérer des problèmes de ce type consiste à créer un arbre de syntaxe abstraite à partir de l'entrée. Ensuite, vous pouvez appliquer des contrôles sémantiques à votre guise.

Si vous voulez faire toutes vos vérifications pendant l'analyse, vous devrez définir votre grammaire avec soin pour l'autoriser, et passer en revue les structures de données définissant ce que vous avez vu jusqu'ici.