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)
你的错,正如你所猜测的,是主程序中的错字。
%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)
你的错,正如你所猜测的,是主程序中的错字。