c - 如何将 Yacc/Bison-Parser 包含到自己的项目中?

标签 c eclipse parsing makefile bison

我想在我自己的项目中使用 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.hyconf.h

如果需要更多信息,请询问。

非常感谢任何有关如何解决此问题的建议。感谢支持

亲切的问候

最佳答案

好吧,实际上只需要 y.tab.hy.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/

相关文章:

Eclipse:如何删除非 Java 文件所有行的尾随空格?

java - 在java中解析TLV数据的问题,如何获取值,长度

Scala 解析器组合器 : getting a stackoverflow with packratparsers

c - 如何在 C 语言中唯一标识一台机器?

c - 找到出现次数较多的字符串(单词)

c - 编写一个 C 程序来测量 Linux 操作系统中上下文切换所花费的时间

java - Scala IDE 错误 : Main method not found in class 'hello'

c - 在 for 循环之后没有 {} 大括号 for (i=0; s[i]> ='0' && s[i] <= '9' ;++i)

java - Eclipse 将什么视为 "simple getter"或 "simple setter"?

Java - 按通用长度和前缀从字符串中提取文本