Flex不编译词法分析器 - 宏发生错误

时间:2017-10-20 09:30:03

标签: c macros flex-lexer

我在使用flex编写的词法分析器时遇到问题。当我尝试编译它时,没有创建exe文件,我收到很多错误。以下是flex文件:

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

任何人都可以看到我可能出错的地方吗?

1 个答案:

答案 0 :(得分:2)

您必须先定义令牌。 COLONSEMICOLON等的定义(即ids)不是由flex生成的。您可以在词法分析器文件顶部的枚举中定义它:

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

我建议ids&gt;这里也可以直接从词法分析器返回ascii字符代码以进行进一步处理。 但是,通常,令牌名称也用于yacc / bison的解析器文件中,该文件生成一个头文件(默认名称为y.tab.h)以包含在词法分析器中,其中包含生成的ID,这些标记也匹配解析器功能。