【问题标题】:How can i use flex bison code with c++ interface我如何使用带有 C++ 接口的 flex bison 代码
【发布时间】:2013-09-19 05:08:15
【问题描述】:

我在 a.h 文件中声明了一个函数 f(),在一个 bison 文件 a.y 中定义它并在 a.cpp 文件。

我编译为:

      g++ a.cpp a.tab.c lex.yy.c -o a

它工作正常。

现在我想在 b.cpp 文件中调用这个函数 f()。

我该怎么做。

哪些文件要包含在 b.cpp 文件中,哪些文件要在编译时提供。

【问题讨论】:

    标签: c++ parsing interface bison


    【解决方案1】:

    #include "a.h" 并致电f()

    a.cpp 来自哪里?一般来说,对一个野牛文件和另一个程序文件使用相同的前缀是令人困惑的。 a.cpp 似乎包含一个 main() 函数(尽管这只是基于您的 g++ 调用的猜测),因此它作为其他程序的目标文件没有用。我要做的是如下所示:

    bison -d -o parser.c parser.y
    # For flex 2.5.4, you cannot put a space between -o and the filename.
    # You should seriously think about upgrading to a non-prehistoric version
    # flex -o lexer.c lexer.l
    flex -olexer.c lexer.l
    g++ -c -o parser.o parser.c
    g++ -c -o lexer.o lexer.c
    g++ -o a a.cpp parser.o lexer.o
    g++ -o b b.cpp parser.o lexer.o
    

    (以上将更改a.tab.h 的名称,因此您需要在 lexer.l 中修复它。但这只是一个建议。)

    【讨论】:

    • 是的,你猜对了。 a.cpp 有一个 main()。我已经在 b.cpp 中包含了 a.h 但它不起作用。问题是它将如何进入 a.y 文件。我应该在编译 b.cpp 时包含 parser.o 和 lexer.o
    • 请更具体地说明“不工作”的含义。是的,您需要包含 parser.o 和 lexer.o。头文件 (a.h) 只告诉编译器函数的原型是什么。它不会告诉编译器在哪里可以找到已编译的函数,而且它肯定对链接器没有影响。因此,当您生成最终的可执行文件时,无论是 a 还是 b,您都需要与 parser.o 和 lexer.o 链接(当然,假设 b 需要解析和词法分析。)
    • 好的..但现在的问题是我已经定义了同名的 flex & bison 文件,即 a.y & a.l,所以只能有一个 a.c
    • 当我将 lex 文件的名称更改为 lex.l,并将命令指定为 flex -o lex.c lex.l 时,它显示的错误是无法打开 lex.c
    • 我无法生成 lexer.c
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2010-11-27
    相关资源
    最近更新 更多