2017-10-20 28 views
1

Je rencontre un problème avec mon analyseur lexical écrit en flex. Quand j'essaye de le compiler il n'y a aucun dossier d'exe créé et j'obtiens beaucoup d'erreurs. Ce qui suit est le fichier flex:Flex ne compile pas Lexical Analyzer - erreur avec macro

%{ 
#ifdef PRINT 
#define TOKEN(t) printf("Token: " #t "\n"); 
#else 
#define TOKEN(t) return(t); 
#endif 
%} 

delim  [ \t\n] 
ws   {delim}+ 
digit  [0-9] 
id   {character}({character}|{digit})* 
number  {digit}+ 
character [A-Za-z] 
%% 
{ws}   ; /* Do Nothing */ 


":"    TOKEN(COLON); 
";"    TOKEN(SEMICOLON); 
","    TOKEN(COMMA); 
"("    TOKEN(BRA); 
")"    TOKEN(CKET); 
"."    TOKEN(DOT); 
"'"    TOKEN(APOS); 

"="    TOKEN(EQUALS); 
"<"    TOKEN(LESSTHAN); 
">"    TOKEN(GREATERTHAN); 

"+"    TOKEN(PLUS); 
"-"    TOKEN(SUBTRACT); 
"*"    TOKEN(MULTIPLY); 
"/"    TOKEN(DIVIDE); 

{id}   TOKEN(ID); 

{number}  TOKEN(NUMBER); 

'{character}' TOKEN(CHARACTER_CONSTANT); 

%% 

Ce sont les erreurs que je reçois:

spl.l: In function 'yylex': 

spl.l:19:7: error: 'COLON' undeclared (first use in this function) 
":" TOKEN(COLON); 
    ^

spl.l:5:25: note: in definition of macro 'TOKEN' 
#define TOKEN(t) return(t); 
         ^

spl.l:19:7: note: each undeclared identifier is reported only once for each function it appears in 
":" TOKEN(COLON); 
    ^

spl.l:5:25: note: in definition of macro 'TOKEN' 
#define TOKEN(t) return(t); 
         ^

spl.l:20:7: error: 'SEMICOLON' undeclared (first use in this function) 
";" TOKEN(SEMICOLON); 
    ^

spl.l:5:25: note: in definition of macro 'TOKEN' 
#define TOKEN(t) return(t); 

Et les commandes que je utilise pour compiler sont:

flex a.l 
gcc -o newlex.exe lex.yy.c -lfl 

Quelqu'un peut voir où je peut-être aller mal?

+0

BTW vous ne devriez pas avoir besoin de ";" dans votre macro comme vous l'appelez déjà avec un –

Répondre

2

Vous devez d'abord définir les jetons. Les définitions (c'est-à-dire les ids) pour COLON, SEMICOLON, etc. ne sont pas générées par flex. Vous pouvez le définir dans un ENUM en haut de votre fichier lexer:

%{ 
#ifdef PRINT 
#define TOKEN(t) printf("Token: " #t "\n"); 
#else 
#define TOKEN(t) return(t); 
#endif 

enum { COLON = 257, SEMICOLON, COMMA, BRA, CKET, DOT, APOS, EQUALS, 
     LESSTHAN, GREATERTHAN, PLUS, SUBTRACT, MULTIPLY, DIVIDE, 
     ID, NUMBER, CHARACTER_CONSTANT }; 
%} 

Je suggère ids> 257 ici pour pouvoir aussi revenir directement des codes de caractères ascii du lexer pour un traitement ultérieur. Habituellement, cependant, les noms de jetons sont également utilisés dans un fichier analyseur pour yacc/bison, qui génère un fichier d'en-tête (y.tab.h par défaut) à inclure dans votre lexer, qui contient les identifiants générés pour les fonctions d'analyseur .

+0

Merci qui a du sens maintenant! – user8786494