Antlr 从函数参数而不是文件中获取输入

Antlr 从函数参数而不是文件中获取输入,antlr,antlr3,Antlr,Antlr3,我看到的所有示例都在一个文件中读取lex&解析它 我需要一个函数,它以字符串(char*,我正在生成C代码)作为参数,并对其进行操作 我怎样才能做到最好?我曾想过将字符串写入流,然后将其输入lexer,但感觉不太对劲。还有更好的办法吗 提前谢谢我想你应该把它喂给一条小溪。如果你愿意,你可以把它喂给史坦。这样,您的代码与从文件中读取字符串应该没有太大区别。您需要使用antlr3newasitringinplacestream方法 你没有说你使用的是什么版本的Antlr,所以我假设是AntlRv3

我看到的所有示例都在一个文件中读取lex&解析它

我需要一个函数,它以字符串(char*,我正在生成C代码)作为参数,并对其进行操作

我怎样才能做到最好?我曾想过将字符串写入流,然后将其输入lexer,但感觉不太对劲。还有更好的办法吗


提前谢谢

我想你应该把它喂给一条小溪。如果你愿意,你可以把它喂给史坦。这样,您的代码与从文件中读取字符串应该没有太大区别。

您需要使用
antlr3newasitringinplacestream
方法

你没有说你使用的是什么版本的Antlr,所以我假设是AntlRv3

这个方法的输入是要解析的字符串,它的长度,然后您可能可以使用NULL作为最后一个输入

这将生成一个类似于antlr3AsciiFileStreamNew的输入流,您将使用它来解析文件

我看到您提到将输入写入流。如果你能使用C++,那么这是你可能会得到的最好的方法。 这是我通常使用的基本代码:

std::istringstream  issInput(std::cin); // make this an ifstream if you want to parse a file
Lexer           oLexer(issInput);
Parser          oParser(oLexer);

oFactory("CommonASTWithHiddenTokens",&antlr::CommonASTWithHiddenTokens::factory);
    antlr::ASTFactory oFactory;
oParser.initializeASTFactory(oFactory);
oParser.setASTFactory(&oFactory);

oParser.main();
antlr::RefAST ast = oParser.getAST();
if (ast)
{
    TreeWalker  oTreeWalker;
    oTreeWalker.main(ast, rPCode);
}

是的,V3。不幸的是,我必须迎合最低的公分母,所以它必须是C,而不是C++。如果可以的话,我宁愿只传递一个字符,但我怀疑它一定是流,唉。看起来很乱。。。感谢您提供的示例,若您一直使用C,那个么解决方案就是使用我在解决方案中展示的
antlr3newascisitringinplacestream
。只需创建一个并将其传递给lexer和Done。再简单不过了:)我怀疑喂食stdin可能是危险的,因为我们无法预测还有谁会同时喂食它。正如我上面所说的,我更愿意传递一个char*,但看不到流的简单替代方案——唉