Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言编写antlr3语法_C_Gcc_Antlr3 - Fatal编程技术网

用C语言编写antlr3语法

用C语言编写antlr3语法,c,gcc,antlr3,C,Gcc,Antlr3,我一直在尝试学习ANTLR,并使用教程(也在讨论中引用)使其与C输出代码一起工作。我成功地让ANTLR生成lexer和解析器作为C源代码,但我无法让它们在Mac OS X Snow Leopard(i686-apple-darwin10-gcc-4.2.1)上使用gcc进行编译。下面是我尝试编译“SimpleCalcLexer.c”时的结果 SimpleCalcLexer.c文件没有在任何地方引用“main”(也没有定义),但解析器定义了它,所以我尝试编译它: dyn-72-33-132-199

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

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函数和定义。我打错电话了吗?(我以前从未在命令行上编译过如此复杂的内容。)

2) 什么是
ccn8ZVhk.o
?我可以看出它是一个目标代码文件,但在我的系统上找不到它(包括
locate
mdfind

您需要将lexer和解析器编译到同一个可执行文件中;他们共同创建一个单一的程序。试试这个:

gcc -o lexer SimpleCalcLexer.c SimpleCalcParser.c -lantlr3c
该命令行将编译lexer和解析器,然后将结果链接到ANTLR库(“lantlr3c”部分)


对象文件ccn8ZVhk.o是运行时库的一部分,实际调用main()。它不包含用户可服务的部分。

您需要将lexer和解析器编译到同一个可执行文件中;他们共同创建一个单一的程序。试试这个:

gcc -o lexer SimpleCalcLexer.c SimpleCalcParser.c -lantlr3c
该命令行将编译lexer和解析器,然后将结果链接到ANTLR库(“lantlr3c”部分)


对象文件ccn8ZVhk.o是运行时库的一部分,实际调用main()。它不包含用户可服务的部分。

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

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位选项进行编译,但也遇到了同样的问题。

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

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位选项进行编译,但遇到了相同的问题。

谢谢!“-lantlr3c”标志是我所缺少的。我还发现我需要“-arch i386”,因为这个库只有32位,而雪豹gcc想要在我的机器上编译64位。谢谢!“-lantlr3c”标志是我所缺少的。我还发现我需要“-arch i386”,因为这个库只有32位,雪豹gcc希望在我的机器上编译64位;制作制定安装顺序(我真的不记得了)。您得到的错误是因为您只编译了lexer和parser。你需要添加另外两个文件(你的lexer utils和带有main()函数的测试程序)。下面是你需要的命令:$gcc-arch i686-o lexer python3lexer.c python3parser.c python3lexerutils.c test_cpython3.c-lantlr3c你所拥有的基本上就是我所使用的,但我的包含main()lexer中的函数。这是假设所有文件也在同一个文件夹中。顺便说一句,使用您提供的命令,我能够在不指定体系结构的情况下成功编译。诀窍是使用以下命令将ANTLR3C运行时配置为在编译之前启用64位:“./configure--enable-64bit”我收到一些警告,指出某些int数据类型的大小错误,但它编译成功的情况除外。想知道如何使这样的64位应用程序在32位机器上工作,因为Xcode允许您创建32位/64位通用二进制文件,但当我走到这一步时,我会留下一个新问题!我很确定我使用的是标准配置;制作制定安装顺序(我真的不记得了)。您得到的错误是因为您只编译了lexer和parser。你需要添加另外两个文件(你的lexer utils和带有main()函数的测试程序)。下面是你需要的命令:$gcc-arch i686-o lexer python3lexer.c python3parser.c python3lexerutils.c test_cpython3.c-lantlr3c你所拥有的基本上就是我所使用的,但我的包含main()lexer中的函数。这是假设所有文件也在同一个文件夹中。顺便说一句,使用您提供的命令,我能够在不指定体系结构的情况下成功编译。诀窍是使用以下命令将ANTLR3C运行时配置为在编译之前启用64位:“./configure--enable-64bit”我收到一些警告,指出某些int数据类型的大小错误,但它编译成功的情况除外。想知道如何使这样的64位应用程序在32位机器上工作,因为Xcode允许您创建32位/64位通用二进制文件,但当我走到这一步时,我会留下一个新问题!