【问题标题】:Unable to compile output of lex无法编译 lex 的输出
【发布时间】:2010-04-10 05:40:04
【问题描述】:

当我尝试编译这个琐碎的 lex 程序的输出时:

# lex.l
integer   printf("found keyword INT");

使用:

$ gcc lex.yy.c

我明白了:

Undefined symbols:
  "_yywrap", referenced from:
      _yylex in ccMsRtp7.o
      _input in ccMsRtp7.o
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

lex --version 告诉我我实际上使用的是“flex 2.5.35”,尽管 ls -fla `which lex` 不是符号链接。任何想法为什么输出无法编译?

【问题讨论】:

    标签: gcc lex lexer


    【解决方案1】:

    来自the Flex manual

    我收到关于 undefined yywrap() 的错误。

    您必须提供自己的 yywrap() 函数,或链接到 libfl.a(提供一个),或使用

    %option noyywrap
    

    在你的源代码中说你不想要一个 yywrap() 函数。

    Also:

    当扫描仪收到 文件结束指示 YY_INPUT,然后检查 yywrap() 函数。如果 yywrap() 返回 false(零),则假定 函数已执行并设置 yyin 指向 另一个输入文件,扫描继续。如果它返回 true(非零),然后扫描器终止,返回 0 给它的调用者。请注意,在任何一种情况下,开始条件 化保持不变;它不会恢复为 INITIAL。

    【讨论】:

    • +1 用于提及与 libfl.a 的链接,它提供了一个简单的 main() 以及 yywrap():只需使用 $ gcc lex.yy.c -lfl 构建即可。
    • Mac有libl.a,作用和libfl.a一样,所以用-ll编译
    【解决方案2】:

    正如 Eli 的回答所暗示的,这不是一个简单的 lex 程序。它是一个微不足道的 lex 文件,因此是程序的一部分,但它(就像任何 lex 文件一样)需要与一些 C 代码结合才能构成一个完整的程序。特别是,你仍然需要一个main 函数(你用 C 或 C++ 或其他东西在一个单独的文件中编写),你还需要编写一个 yywrap 函数来提供 lex 代码和其余的 C 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多