【问题标题】:Compiling an ANTLR 3 grammar in C用 C 编译 ANTLR 3 语法
【发布时间】:2009-11-18 16:43:33
【问题描述】:

我一直在尝试学习 ANTLR 并使用 this 教程(在 this 问题中也提到)让它与 C 输出代码一起工作。我成功地让 ANTLR 将词法分析器和解析器生成为 C 源代码,但我无法让它们在 Mac OS X Snow Leopard (i686-apple-darwin10-gcc-4.2.1) 上使用 gcc 进行编译。下面是我尝试编译“SimpleCalcLexer.c”时的结果。

dyn-72-33-132-199:Desktop bf$ gcc -o lexer SimpleCalcLexer.c
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
  "_antlr3LexerNewStream", referenced from:
      _SimpleCalcLexerNewSSD in ccjXa6NU.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

SimpleCalcLexer.c 文件在任何地方都没有引用“main”(也没有定义),但是解析器确实定义了它,所以我尝试编译它:

dyn-72-33-132-199:Desktop bf$ gcc -o parser SimpleCalcParser.c
Undefined symbols:
  "_antlr3CommonTokenStreamSourceNew", referenced from:
      _main in ccn8ZVhk.o
  "_antlr3ParserNewStream", referenced from:
      _SimpleCalcParserNewSSD in ccn8ZVhk.o
  "_SimpleCalcLexerNew", referenced from:
      _main in ccn8ZVhk.o
  "_antlr3AsciiFileStreamNew", referenced from:
      _main in ccn8ZVhk.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

这么几个问题:
1)我做错了什么?我很确定正在找到这些库,因为在代码中还发现了其他 antlr 函数和定义。我是否错误地调用 gcc? (我以前从未在命令行上编译过这么复杂的东西。)
2) 什么是ccn8ZVhk.o?我可以说它是一个目标代码文件,但我在我的系统上找不到它(locate 和mdfind)。

【问题讨论】:

    标签: c gcc antlr3


    【解决方案1】:

    你需要将词法分析器和解析器编译成同一个可执行文件;他们一起工作来创建一个单一的程序。试试这个:

    gcc -o lexer SimpleCalcLexer.c SimpleCalcParser.c -lantlr3c
    

    该命令行将编译词法分析器和解析器,然后将结果与 ANTLR 库(“-lantlr3c”部分)链接。

    目标文件 ccn8ZVhk.o 是运行时库的一部分,实际上是调用 main()。它不包含用户可维护的部分。

    【讨论】:

    • 谢谢! “-lantlr3c”标志是我所缺少的。我还发现我需要“-arch i386”,因为库只有 32 位,而 Snow Leopard gcc 想要在我的机器上编译 64 位。
    【解决方案2】:

    如果您多次编译,您会看到目标代码文件名每次都会更改,所以我猜它们是在最终目标被编译和链接之前使用的临时目标文件。我遇到了同样的问题,我尝试将架构指定为 386 和 686。我正在尝试编译此Python3 grammar file 的输出。 CajunLuke,你能发布你在编译时使用的确切命令吗?这是我所做的一个示例:

    WOPR:plex pokstad$ gcc -arch i686 -o lexer python3Lexer.c python3Parser.c -lantlr3c
    Undefined symbols:
    "_main", referenced from:
      start in crt1.10.6.o
    "_python3Lexer_syntetizeEmptyString", referenced from:
      _mLEADING_WS in ccGDusga.o
    "_python3Lexer_createLexerToken", referenced from:
      _mCONTINUED_LINE in ccGDusga.o
      _mLEADING_WS in ccGDusga.o
    "_python3Lexer_initLexer", referenced from:
      _python3LexerNewSSD in ccGDusga.o
    ld: symbol(s) not found
    collect2: ld returned 1 exit status
    

    另外,您编译 ANTLR3C 运行时是否与通常的“configure;make;make install”不同?我尝试使用 64 位选项进行编译,但遇到了同样的问题。

    【讨论】:

    • 我很确定我使用标准的 configure;make;make 安装顺序(我不记得了)。你得到的错误是因为你只编译词法分析器和解析器。您需要添加其他两个文件(您的 lexer utils 和带有 main() 函数的测试程序。)这是您需要的命令:$ gcc -arch i686 -o lexer python3lexer.c python3parser.c python3lexerutils.c test_cpython3。 c -lantlr3c 你所拥有的基本上就是我所使用的,但我的在词法分析器中包含了 main() 函数。这是假设所有文件也在同一个文件夹中。
    • 顺便说一句,使用您提供的命令,我能够在不指定架构的情况下成功编译。诀窍是在编译之前使用以下命令将 ANTLR3C 运行时配置为启用 64 位:“./configure --enable-64bit” 我收到了一些警告,因为某些 int 数据类型的大小错误,但编译后的除外成功地。想知道如何在 32 位机器上制作像这样的 64 位应用程序,因为 Xcode 允许您创建 32 位/64 位通用二进制文件,但是当我走到那一步时,我会留下一个新问题!
    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多