在C中编译ANTLR 3语法

时间:2009-11-18 16:43:33

标签: c gcc antlr3

我一直在尝试学习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?我可以说它是一个目标代码文件,但我在我的系统上找不到它(locatemdfind)。

2 个答案:

答案 0 :(得分:4)

您需要将词法分析器和解析器编译为相同的可执行文件;他们共同努力创建一个单一的计划。试试这个:

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

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

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

答案 1 :(得分:0)

如果你多次编译,你会发现目标代码文件名每次都会改变,所以我猜它们是在编译和链接最终目标之前使用的临时目标文件。我遇到了同样的问题,我尝试将架构指定为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位选项进行编译,但我遇到了同样的问题。