Bison flex++;开关流

Bison flex++;开关流,bison,lex,flex++,Bison,Lex,Flex++,我正在尝试使用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.s

我正在尝试使用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(我可以看到它在bison规则中进行了一些打印),但最后我发现只有一个名为“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;
}

但是它也做同样的事情。

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

flex
bison
只做解析(这并不多)。你应该做剩下的事


我不明白你想要实现什么

我了解了所有语法规则。我认为传递给yyFlexLexer的out_文件被解析器用来打印输出。如果没有,我不理解传递给方法switch_streams的输出流使用了什么。文档中说“虚拟无效switch_streams(istream*new_in=0,ostream*new_out=0)将yyin重新分配给new_in(如果非null),将yyout重新分配给new_out(如果非null),如果yyin被重新分配,则删除以前的输入缓冲区。”。但我认为你不懂如何使用Flex和Bison。请解释你的总体目标。我能更好地解释这个问题。我已经实现了解析器。当我将输出打印到stdout(所有规则执行结束时获得的完整输出)时,它工作正常。我只是假设方法switch_stream用于将输出从标准输出重定向到自定义流。此时,我还可以在终端规则中写入自定义流。在阅读文档的时候,我觉得这个函数会做我想做的事情,但显然不会。