1

我一直在尝试学习 ANTLR 并使用本教程(也在这个问题中引用)让它与 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?我可以说它是一个目标代码文件,但我在我的系统上找不到它(locatemdfind)。

4

2 回答 2

4

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

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

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

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

于 2009-12-03T08:55:19.387 回答
0

如果您编译多次,您会看到目标代码文件名每次都会更改,所以我猜它们是在最终目标被编译和链接之前使用的临时目标文件。我遇到了同样的问题,我尝试将架构指定为 386 和 686。我正在尝试编译这个Python3 语法文件的输出。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 位选项进行编译,但遇到了同样的问题。

于 2009-12-07T04:37:20.403 回答