我正在研究编译理论以及如何使用flex,我有几个问题。
我创建了一个包含以下数据的lex文件:
<div idle-countdown="countdown" ng-init="countdown=5" class="modal-body">
这是我能想到的最简单的一个。如果我理解正确,它会在遇到hello令牌时打印GOODBYE,并忽略其他所有内容。
我在这个lex文件上使用了flex来生成一个C文件,现在我应该编译那个C代码来获得这个语法的词法分析器。
问题是生成的C代码没有入口点。它不编译。我的.lex文件不正确吗?我误解了什么吗?
答案 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
。