【问题标题】:flex++ switchstreamflex++ 切换流
【发布时间】:2011-11-06 10:43:15
【问题描述】:

我正在尝试使用 flex++ 和 bison 编写解析器。我需要解析器能够读取文件并在输出中写入新文件。

我有一个 yyFlexLexer 实例化如下:

yyFlexLexer lexer;

我使用它:

int main(int argc, char* argv[])
{
    std::istream* in_file = new std::ifstream(argv[1])
    std::ostream* out_file = new std::ofstream(argv[2])
    lexer.switch_streams(in_file, out_file);
    yyparse();
    return 0;
}

如果我跑:

./executable foo bar

解析器正确读取了文件 foo(我可以看到它在野牛规则中进行了一些打印),但最后我发现只有一个名为“bar”的空文件,其中没有任何内容。

我也尝试过这样做:

int main(int argc, char* argv[])
{
    std::istream* in_file = new std::ifstream(argv[1])
    std::ostream* out_file = new std::ofstream(argv[2])
    lexer.switch_streams(in_file, out_file);
    while(lexer.yylex())
    ;
    return 0;
}

但它做同样的事情。

【问题讨论】:

    标签: bison lex flex++


    【解决方案1】:

    您需要解析器的操作(在您的.y 文件中)来构建解析输入的一些抽象语法树,并且您需要一些例程来将该树漂亮地打印到输出。

    flexbison 只做解析(不多)。你应该做剩下的。

    我不明白你想要达到什么目的。

    【讨论】:

    • 我意识到我的语法的所有规则。我在想传递给 yyFlexLexer 的 out_file 被解析器用来打印输出。如果没有,我不明白传递给方法 switch_streams 的输出流的用途。
    • 文档flex.sourceforge.net/manual/Cxx.html 说“virtual void switch_streams(istream* new_in = 0, ostream* new_out = 0) 将 yyin 重新分配给 new_in(如果非 null)和 yyout 重新分配给 new_out(如果非 null ),如果重新分配 yyin,则删除先前的输入缓冲区。"。但是我认为您不了解如何使用 Flex 和 Bison。请说明您的总体目标。
    • 我更好地解释了这个问题。我已经实现了解析器。当我将输出打印到标准输出时它工作正常(在所有规则执行结束时获得的完整输出)。我只是假设方法 switch_stream 用于将输出从标准输出重定向到自定义流。此时,我还可以在我的终端规则中写入自定义流。阅读文档在我看来,该功能会按照我的想法做,但显然不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2017-06-14
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多