【问题标题】:flex - no entry pointflex - 没有入口点
【发布时间】:2017-04-10 12:58:25
【问题描述】:

我正在研究编译理论以及如何使用 flex,但我遇到了几个问题。

我创建了一个包含以下数据的 lex 文件:

%%
"hello"     printf("GOODBYE");
.   ;
%%

这是我能想到的最简单的一个。如果我理解正确,它会在每次遇到 hello 令牌时打印 GOODBYE,并忽略其他所有内容。

我在这个 lex 文件上使用了 flex 来生成一个 C 文件,我现在应该编译那个 C 代码以获得这个语法的词法分析器。

问题是生成的C代码没有入口。它不编译。我的 .lex 文件不正确吗?我是不是误会了什么?

【问题讨论】:

  • 你必须提供你自己的main函数
  • 你必须定义一个主函数。看看this tutorial
  • 提供 main 函数的一种方法是与 flex 的运行时库 libfl 链接。 (事实上​​,这是与 libfl 链接的唯一原因。)
  • 谢谢大家。你当然是对的。它现在正在工作。

标签: c compiler-errors flex-lexer lexical-analysis


【解决方案1】:

您只需在此文件中声明自己的main(),在第二个%% 之后或将此.c 与声明main() 的其他.c 文件链接。

%%
"hello"     printf("GOODBYE");
.   ;
%%

int main()
{
    yylex();
    return 0;
}

【讨论】:

  • 啊,是的,我明白了。它现在正在工作。非常感谢您,好心的先生。
【解决方案2】:

问题是生成的C代码没有入口点。它无法编译。

不,它没有链接

我的 .lex 文件不正确吗?

没有。

我是不是误会了什么?

是的。

“入口点”是链接器表示函数main() 的方式。 Flex 只为词法分析器函数生成代码,所以如果你想要一个完整的程序,那么你需要单独提供main。这是合适的,因为大多数情况下,词法分析器函数用于大型程序的上下文中,其中词法分析器函数是 Flex 唯一需要或想要的东西。

如果您希望程序执行的所有操作都由您的词法分析规则描述,那么您需要一个重复调用词法分析函数yylex() 的主函数,直到它返回非零值。您可以自己编写,但您不需要这样做——flex 带有一个运行时库 libfl,其主要目的是提供这样的main。您只需要链接它,可能通过在编译/链接命令的末尾添加-lfl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 2019-07-02
    相关资源
    最近更新 更多