flex - 没有切入点

时间:2017-04-10 12:58:25

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

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

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

<div idle-countdown="countdown" ng-init="countdown=5" class="modal-body">

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

  

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

不,它没有链接

  

我的.lex文件不正确吗?

没有

  

我误解了什么吗?

&#34;切入点&#34;是链接器说出函数main()的方式。 Flex仅为词法分析器功能生成代码,因此如果您需要完整的程序,则需要单独提供main。这是合适的,因为大多数情况下,词法分析器函数在较大程序的上下文中使用,其中词法分析器函数是Flex唯一需要或想要的东西。

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