我看到的所有示例都在文件中读取 lex 并解析它。
我需要一个函数,它接受一个字符串(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);
}
我认为您应该将其馈送到流中。如果您愿意,可以将其提供给标准输入。这样,您的代码不应与从文件中读取字符串相差太大。