2010-09-11 23 views
2

Je dois créer un analyseur syntaxique et lexical pour un langage de type c. Dans ce langage nous définissons comme commentaire "tout ce qui existe après le symbole% jusqu'à la fin de la ligne". Les déclarations suivantes sont-elles correctes?Définir un commentaire et une citation dans les erreurs flex et bison et lexicales

Flex 
... 
[%][^\n]*[\n] { return T_COMMENT; } 
[\n] { return T_NEWLINE; } 

Bison 
... 
comment:com text newline; 
text: |name text|digit text; 

... 
com: T_COMMENT { printf("%s",yytext); }; 
newline: T_NEWLINE { printf("%s",yytext); }; 

Je dois aussi définir le symbole de citation ». Est-ce correct suivant (flex)?

"\"" { return T_QUOTE; } 

Il n'y a pas d'erreur de compilation dans les fichiers d'entrée flex et bison, mais quand j'utilise un programme écrit dans ce langage de type c comme une entrée de test je reçois comme résultat l'erreur lexicale dans la ligne 1. Il n'y a pas d'erreur lexicale dans cette ligne Mon programme doit commencer comme ceci: PROGRAMME name_of_program et une nouvelle ligne compalsory I faire les déclarations suivantes: Flex

"PROGRAM" { return T_PROGRAM; } 

Bison

%start programma 
%token T_PROGRAM 
... 
programma:PROGRAM name newline function STARTMAIN dec_var command ENDMAIN eof; 
... 
PROGRAM: T_PROGRAM { printf("%s",yytext); }; 
... 

(mots en majuscules sont définis comme le programme car ils font partie de la langue) -je écrire quelque chose de mal? Je pense que le problème est avec la définition de Newline mais je ne suis pas sûr.

Merci d'avance pour toute réponse. Désolé pour le long message.

Répondre

2

Généralement, les commentaires sont traités par le lexeur et ne sont pas transmis à l'analyseur. Si votre langage est vraiment un C, alors dans la plupart des cas, un retour à la ligne doit être traité comme n'importe quel autre espace. Les commentaires et les chaînes de caractères sont les exceptions notables. Les chaînes de caractères citées sont généralement capturées par le lexeur en utilisant les états de départ et transmises à l'ensemble du parseur.

Votre code flexible utilise trop de jeux de caractères. Vous n'avez pas besoin de créer un ensemble si vous voulez seulement faire correspondre un personnage particulier; il suffit de mettre le personnage, avec une barre oblique inverse si nécessaire. De plus, . signifie tout caractère non-nouvelle ligne.

En outre, vous n'avez aucune définition du jeton name_of_program. En supposant qu'il s'agit d'un identifiant de style C, vous pouvez déclarer un modèle d'identificateur et un jeton dans flex et le transmettre à bison. Enfin, vous pouvez adopter la convention de dénomination de l'utilisation de toutes les majuscules pour les jetons transmis à bison de flex, et en minuscules pour les jetons utilisés dans bison.

Donc, de ce que vous avez décrit, je donne les résultats suivants:

example.l:

%% 

\%.* /* comment */ 
\n { return T_NEWLINE; } 
\' { return T_QUOTE; } 
PROGRAM { return T_PROGRAM; } 
[A-Za-z_][A-Za-z0-9_]* { yylval.id = yytext; return T_IDENTIFIER; } 

%% 

example.y:

%% 

programma: T_PROGRAM T_IDENTIFIER T_NEWLINE function STARTMAIN dec_var command ENDMAIN eof; 

text: 
    | name text 
    | digit text; 

%% 

Je ne suis pas sûr que vous besoin du jeton eof là-dedans.

J'espère que cela aide.