我想在我自己的项目中使用 yacc/bison 解析器。
当使用我自己的 Makefile 构建解析器时,一切正常。我从 http://ymorin.is-a-geek.org/projects/kconfig-frontends 获取来源(只是解析器: /<path-to-kconfig>/libs/parser
。
现在,当将这些文件包含到 Eclipse 中的 C++ 项目中时,点击 make 后,编译器会在 .y
处崩溃。文件,由于语法错误 - 无法读取 .y - 语法。所以我从构建过程中排除了解析器。
在Yacc and Lex inclusion confusion的回答中,我读到只需包含 .h 文件即可使用解析器的功能。
所以我所做的是:
- 为了访问我的项目中的解析器源代码,我创建了一个简单的函数,仅在 yconf.y 和 yconf.c 中的控制台上打印一行:
void testout(char *txt) {printf(txt);}
- 我什至创建了一个带有函数头
void testout(char *txt);
的 yconf.h - 用我自己的 makefile 编译解析器
主函数,我想在其中调用该函数,如下所示:
#include "y.tab.h" #include "yconf.h" #include <stdio.h> extern "C"{ int main(int argc, char *argv[]) { char configIn[] = "test"; printf(configIn); testout(configIn); return 0; } }
错误
现在编译时出现错误:undefined reference to 'testout(char*)'
。但 Eclipse 本身可以解析该函数 - 单击该函数时,yconf.h 将打开。这就是为什么我不知道问题到底出在哪里。
Eclipse 设置:
在/project/properties/C/C++ Build/Settings 中,我将相同的包含路径放入 gcc
的解析器源中。和g++
和链接器。此外,我在此设置中添加了“包含文件”y.tab.h
和 yconf.h
如果需要更多信息,请询问。
非常感谢任何有关如何解决此问题的建议。感谢支持
亲切的问候
最佳答案
好吧,实际上只需要 y.tab.h
和 y.tab.c
。这是用这个 makefile 创建的:
lex ./lconf.l
bison -d -y ./yconf.y
我的错误是:我正在使用 C++ 进行编程,并且在错误的位置使用了 extern "C"
命令,该头文件需要声明为 c 格式。这是正确的代码:
extern "C"{
#include "y.tab.h"
}
int main(int argc, char *argv[])
{
char configIn[] = "test";
testout(configIn);
return 0;
}
(testout 是 y.tab.h/c 中的一个函数,带有参数 configIn 的简单 printf
- 执行“test”时被打印。)
顺便说一句:我排除了解析器的所有源文件进行编译,但 y.tab.c
关于c - 如何将 Yacc/Bison-Parser 包含到自己的项目中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24158045/