c - Bison和Flex到达EOF时不会停止,只说 "Reading a token:"并等待输入

标签 c parsing bison flex-lexer eof

好吧,我已经搜索了我的问题很长一段时间,但一无所获。我在下面看到的问题无法帮助我的情况:

bison end of file

Lex/Flex - Scanning for the EOF character

Flex/Bison EOF propagation from stdin vs a file

END OF FILE token with flex and bison (only works without it)

情况描述:

  1. 我使用Bison和Flex来解析客户语言,假设该语言的名称是MYLAN;

  2. 在 MYLAN 语法中,我写了 %start system_declsystem_decl:module_decls{...};在 bison 文件 .ypp 中,如您所见,没有表示“系统开始”或“系统结束”的标记,系统只是模块的组合。用 MYLAN 编写的文件可能如下所示:

    module
    ...
    end
    module
    ...
    end
    module
    ...
    end
    
  3. 解析器对于 .ypp 中描述的所有语法都工作得很好,但是当它到达文件末尾时(应该是 EOF 但我不确定,因为我尝试了 <<EOF>> 但问题仍然存在存在),它无法停止,它一直在等待 token :

    [MYLANParser] $ ./MYLANParser example.mylan
    ...
    Stack now 0 3
    Entering state 6
    Reducing stack by rule 50 (line 458):
    $1 = nterm module_decls ()
    $2 = nterm module_decl ()
    $$ = nterm module_decls ()
    Stack now 0
    Entering state 3
    Reading a token:
    

它只是卡在这里,解析器不会停止,任何人都可以帮忙吗?非常感谢!

最佳答案

Reading a token:字符串在解析器调用 yylex 之前立即打印。之后yylex返回时,它将打印返回的 token (或 EOF),因此似乎发生的情况是您的词法分析器在到达 EOF 时挂起。

发生类似情况的最可能原因是 <<EOF>>规则或 yywrap函数告诉词法分析器继续从输入读取,但实际上并没有将输入重置为指向其他内容(因此它只是读取另一个 EOF 并再次调用 <<EOF>> 规则或 yywrap 函数,从而导致无限循环.)

显示你的词法分析器(.l 文件和 yywrap 函数),有人可能会告诉你它出了什么问题。

关于c - Bison和Flex到达EOF时不会停止,只说 "Reading a token:"并等待输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20825045/

相关文章:

c - 将结构存储在共享内存中是一种好习惯吗?

c - 在 GDB 中打印多个变量?

c - C 中解析器组合器的更好方法?

c - 在 lex 和 yacc 代码中 printf 在 yacc 文件中不起作用

c - getopt 的多个整数参数?

c - main 的所有命令行参数

python - 从/proc/net/tcp6 解析 IPv6 地址(python 2.7)

iphone - 在 iphone 中解析字符串 json 值?

c++ - 在 flex、bison、c++ 中实现 Wolfram 语言

c - 为什么 yyparse() 会导致我的程序崩溃?