flex - 没有入口点

flex - no entry point

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

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

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

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

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

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

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

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

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

The problem is that the generated C code has no entry point. It does not compile.

不,它不会link

Is my .lex file incorrect?

没有

Am I misunderstanding something?

是的。

"entry point" 是 link 人对函数 main() 的说法。 Flex 只为一个词法分析器函数生成代码,所以如果你想要一个完整的程序那么你需要单独提供 main。这是合适的,因为大多数情况下,词法分析器函数用于较大程序的上下文中,其中词法分析器函数是 Flex 唯一需要或想要的东西。

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