2009-12-09 74 views
0

我看到的所有示例都在文件中读取,解析它。从函数参数中获取输入,而不是文件

我需要一个函数,它需要一个字符串(char *,我生成C代码)作为参数,并作用于此。

我该如何做到最好?我想将字符串写入一个流,然后将其提供给词法分析器,但它感觉不对。有没有更好的方法?

在此先感谢

回答

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); 
} 
+0

是的,V3。不幸的是,我不得不迎合最小公分母,所以它必须是C,而不是C++。 我宁愿只是通过一个char *,如果可以的话,但怀疑它必须是流,唉。它看起来很乱... 感谢这个例子 – Mawg 2009-12-10 07:06:32

+0

如果你坚持的解决方案是坚持使用'antlr3NewAsciiStringInPlaceStream',我在我的解决方案中显示。只需创建一个并将其传递给您的词法分析器和完成。它不能简单:) – chollida 2009-12-10 14:48:21

0

我认为你应该喂它流。如果你愿意,你可以将它提供给stdin。这样,你的代码不应该与从文件中读取字符串相差太多。

+0

我怀疑喂养标准输入可能是危险的,因为我们无法预测还有谁可能在同一时间喂养它。 正如我上面所说,我宁愿传一个char *,但看不到一个简单的替代流 - 唉 – Mawg 2009-12-10 07:07:44