Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Flex未编译词法分析器-宏出错_C_Macros_Flex Lexer - Fatal编程技术网

C Flex未编译词法分析器-宏出错

C Flex未编译词法分析器-宏出错,c,macros,flex-lexer,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}({char

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

%%
我用来编译的命令是:

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

有人知道我哪里出了问题吗?

您必须首先定义令牌。flex不生成
冒号
分号
等pp.的定义(即id)。您可以在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 };
%}
我建议这里的ids>257也能够直接从lexer返回ascii字符代码,以便进一步处理。
但是,通常在yacc/bison的解析器文件中也会使用标记名,该文件会生成一个头文件(默认名称为
y.tab.h
)以包含在您的lexer中,该头文件包含为这些标记生成的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 };
%}