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

时间:2009-12-09 02:30:27

标签: antlr antlr3

我看到的所有例子都在文件中读到了lex&解析它。

我需要一个函数,它接受一个字符串(char *,我正在生成C代码)作为参数,并对此采取行动。

我怎样才能做到最好?我想把字符串写成一个流,然后将它提供给词法分析器,但它感觉不对。有没有更好的方法?

提前致谢

2 个答案:

答案 0 :(得分:2)

您需要使用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);
}

答案 1 :(得分:0)

我认为您应该将其提供给流。如果你愿意的话,你可以把它喂给stdin。这样,您的代码与从文件中读取字符串的区别不应太大。