我在文件myscanner.l
中编写了一个简单的lex扫描程序,其中testlex.h只是一堆#defines作为整数(MATCH_0 == 0等)
%{
#include "testlex.h"
%}
%%
"dinky" return MATCH_0;
"pinky" return MATCH_1;
"stinky" return MATCH_2;
[ \t\n] ;
. printf("unexpected character\n");
%%
int yywrap(void)
{
return 1;
}
使用lex创建lex.yy.c文件后,我使用这个C文件实现代码
#include <stdio.h>
#include "myscanner.h"
extern int yylex();
extern int yylineno;
extern char* yytext;
int main(void)
{
int l = yylex();
while (l)
{
printf("%d\n", l);
l = yylex();
}
return 0;
}
当我传递此输入流:dinky pinky stinky stinky pinky dinky
时,绝对没有输出。我期待的输出看起来像这样:
0
1
2
2
1
0
甚至不是“意外的角色”。我知道我的堆栈设置正确,因为我编译了其他人的例子,他们都正确扫描,但出于一些不可思议的原因我的代码_will_not_scan _!
我错过了什么?
答案 0 :(得分:1)
查看您的预期输出,您看到的是定义"dinky"
的简单结果 - &gt; MATCH_0
为0
。
扫描l
后,0
的第一个值现在变为dinky
。所以while(l)
是while(0)
,并且该块甚至不执行一次。随后您的主要人员立即返回0
。
所以不要将任何标记定义为0
,然后写:
int main(void)
{
int token;
while (token = yylex())
{
printf("%d\n", token);
}
return 0;
}
说实话,我很惊讶你自己没找到。只需尝试其他输入就可以立即提供线索。并且,应该很容易发现yylex()
在EOF返回0
。
l
作为变量名称,因为它与1
几乎相同。
答案 1 :(得分:1)
您的代码无法打印任何内容的原因是您的第一个输入恰好是"dinky"
,它返回MATCH_0
。根据您的预期输出,MATCH_0
为零。因此,代码将在进入循环之前立即退出。
将MATCH_0
重新定义为1,将MATCH_1
重新定义为2,依此类推将解决此问题。