私が見るすべての例は、ファイルでlexを読み取り、それを解析します。
文字列(char *、Cコードを生成しています)をパラメーターとして受け取り、それに基づいて動作する関数が必要です。
どうすればそれを最善に行うことができますか?文字列をストリームに書き込んでから、それをレクサーにフィードすることを考えましたが、正しく感じられません。より良い方法はありますか?
前もって感謝します
この方法を使用する必要がありますantlr3NewAsciiStringInPlaceStream
。
使用している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);
}
ストリームにフィードする必要があると思います。必要に応じて、stdinにフィードすることもできます。そうすれば、コードはファイルから文字列を読み取ることとあまり変わらないはずです。