Lex / Flex扫描仪不扫描,我不知道为什么

时间:2014-07-13 15:07:20

标签: c flex-lexer lex

我在文件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 _!

我错过了什么?

2 个答案:

答案 0 :(得分:1)

查看您的预期输出,您看到的是定义"dinky"的简单结果 - &gt; MATCH_00

扫描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,依此类推将解决此问题。