FLEX 扫描仪 - 无法 return 正确的令牌号

FLEX scanner- unable to return the correct token number

%option noyywrap
%{
#include<stdlib.h>
#define INTEGER 1
#define PLUS 2
struct data
{
    int value;
}dataObj;
%}
%%
[0-9]+ dataObj.value=atoi(yytext);return INTEGER;
[+] return PLUS;
%%
int main()
{
    int ret_value;
    while(ret_value = yylex() !=0)
    printf("value:%d \t token type:%d\n",dataObj.value,ret_value);
}

如果我使用表达式 3+5,它会将 3 和 5 的值设为 1,这是正确的,但它会将 [+] 的值设为 1,而应该是 2。我使用的是 flex 版本 2.5。 4

正如您在评论中所解释的,但不是很清楚,错误出在while循环中。如果您 运行 您最初发布的代码,使用在 flex 中启用的调试,将产生以下输出:

--(end of buffer or a NUL)
3+5
--accepting rule at line 13 ("3")
value:3          token type:1
--accepting rule at line 14 ("+")
value:3          token type:1
--accepting rule at line 13 ("5")
value:5          token type:1
--accepting default rule ("
")

--(end of buffer or a NUL)
--EOF (start condition 0)

不过如果主程序改成这样:

int main()
{
    int ret_value;
    while((ret_value = yylex()) !=0)
    printf("value:%d \t token type:%d\n",dataObj.value,ret_value);
}

生成如下输出,是正确的:

--(end of buffer or a NUL)
3+5
--accepting rule at line 13 ("3")
value:3          token type:1
--accepting rule at line 14 ("+")
value:3          token type:2
--accepting rule at line 13 ("5")
value:5          token type:1
--(end of buffer or a NUL)

你的错,正如你所猜测的,是主程序中的错字。