【问题标题】:Lex/Flex Scanner Isn't Scanning and I Have No Idea WhyLex/Flex 扫描仪不扫描,我不知道为什么
【发布时间】:2014-07-13 15:07:19
【问题描述】:

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

我错过了什么?

【问题讨论】:

    标签: c flex-lexer lex


    【解决方案1】:

    查看您的预期输出,您看到的是将"dinky" -> MATCH_0 定义为0 的简单结果。

    在扫描dinky 之后,l 的第一个值现在变为0。所以 while(l)while(0) 并且该块甚至没有执行一次。随后您的 main 立即返回 0

    所以不要定义任何token为0,然后写:

    int main(void)
    {
        int token;
        while (token = yylex())
        {
            printf("%d\n", token);
        }
    
        return 0;
    }
    

    说实话,我很惊讶你自己没有找到这个。简单地尝试其他输入将立即给出线索。而且,应该很容易发现 yylex() 在 EOF 处返回 0

    顺便说一句,我认为最好不要使用l 作为变量名,因为它与1 几乎相同。

    【讨论】:

    • @i-live-in-a-storm-drain 是的,继续吧,祝你好运,让你的代码变得混乱。
    【解决方案2】:

    您的代码不打印任何内容的原因是您的第一个输入恰好是"dinky",它返回MATCH_0。根据您的预期输出,MATCH_0 为零。因此,代码会在进入循环之前立即退出。

    MATCH_0 重新定义为 1,将MATCH_1 重新定义为 2,依此类推将解决此问题。

    【讨论】:

    • 谢谢!哇,我要睡觉了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多