2017-10-20 10 views
1

フレックスで書かれた字句解析ツールに問題があります。私はそれをコンパイルしようとすると、exeファイルが作成されていないと私は多くのエラーを取得します。Lexical Analyzerをコンパイルしていないフレックス - マクロのエラー

%{ 
#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); 

%% 

これらは私が受け取るエラーです:

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); 

そして、私はコンパイルするために使用していたコマンドは次のとおりです。どこ

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

誰でも見ることができます以下は、フレックスファイルです間違っている可能性がありますか?

+0

ご参考までに、 ";"あなたのマクロでは既に1つで呼んでいるように –

答えて

2

トークンを最初に定義する必要があります。フレックスによってCOLON,SEMICOLONなどの定義(すなわちID)は生成されない。あなたのレクサーファイルの先頭に列挙型でそれを定義することができます。

%{ 
#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 }; 
%} 

私も直接、さらなる処理のためレクサーからASCII文字コードを返すことができるように、ここで> 257のIDを示唆しています。しかし、通常、トークン名は、yacc/bisonのパーサファイルでも使用されます。これは、レクサーに含めるヘッダファイル(デフォルト名はy.tab.h)を生成し、パーサ関数にも一致するトークンに対して生成されたIDを含みます。

+0

今は感謝しています! – user8786494

関連する問題