我看到的所有示例都在文件中读取,解析它。从函数参数中获取输入,而不是文件
我需要一个函数,它需要一个字符串(char *,我生成C代码)作为参数,并作用于此。
我该如何做到最好?我想将字符串写入一个流,然后将其提供给词法分析器,但它感觉不对。有没有更好的方法?
在此先感谢
我看到的所有示例都在文件中读取,解析它。从函数参数中获取输入,而不是文件
我需要一个函数,它需要一个字符串(char *,我生成C代码)作为参数,并作用于此。
我该如何做到最好?我想将字符串写入一个流,然后将其提供给词法分析器,但它感觉不对。有没有更好的方法?
在此先感谢
您需要使用antlr3NewAsciiStringInPlaceStream
方法。
你没有说你使用的是什么版本的Antlr,所以我会假设Antlr v3。
该方法的输入是要解析的字符串,它的长度,然后你可以使用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);
}
我认为你应该喂它流。如果你愿意,你可以将它提供给stdin。这样,你的代码不应该与从文件中读取字符串相差太多。
我怀疑喂养标准输入可能是危险的,因为我们无法预测还有谁可能在同一时间喂养它。 正如我上面所说,我宁愿传一个char *,但看不到一个简单的替代流 - 唉 – Mawg 2009-12-10 07:07:44
是的,V3。不幸的是,我不得不迎合最小公分母,所以它必须是C,而不是C++。 我宁愿只是通过一个char *,如果可以的话,但怀疑它必须是流,唉。它看起来很乱... 感谢这个例子 – Mawg 2009-12-10 07:06:32
如果你坚持的解决方案是坚持使用'antlr3NewAsciiStringInPlaceStream',我在我的解决方案中显示。只需创建一个并将其传递给您的词法分析器和完成。它不能简单:) – chollida 2009-12-10 14:48:21