gpt4 book ai didi

c++ - 在 Clang 中对字符串进行 pretty-print 语句

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:52 25 4
gpt4 key购买 nike

我正在尝试将 Clang 语句漂亮地打印到 string 以便打印该语句的 C/C++ 代码。我通过以下方式执行此操作:

//Generate string and string ostream.
string stmt;
raw_string_ostream stream(stmt);

//Get statement from ASTMatcher and print to ostream.
auto* statement = result.Nodes.getNodeAs<clang::Expr>(types[VAR_STMT]);
statement->printPretty(stream, NULL, PrintingPolicy(LangOptions()));

//Flush ostream buffer.
stream.flush();
cout << statement << endl;


此代码编译并运行良好。但是,当我运行以下代码时,我得到了打印到 stringstatement 对象的地址。例如,当我运行这段代码时,我得到以下输出:

0x3ccd598
0x3ccd5b0
0x3ccd728
0x3ccdc88
0x3ccdd08


Clang 的文档中关于 printPretty(...) 的文档并不多,所以什么是正确的打印方式将 语句 的代码转换为字符串?

最佳答案

我在尝试让它工作时发现的一个解决方案来自 Clang developers post从 2013 年开始。

代替:

//Generate string and string ostream.
string stmt;
raw_string_ostream stream(stmt);

//Get statement from ASTMatcher and print to ostream.
auto* statement = result.Nodes.getNodeAs<clang::Expr>(types[VAR_STMT]);
statement->printPretty(stream, NULL, PrintingPolicy(LangOptions()));

//Flush ostream buffer.
stream.flush();
cout << statement << endl;

我的代码现在是:

//Get the statement from the ASTMatcher
auto *statement = result.Nodes.getNodeAs<clang::Expr>(types[VAR_STMT]);

//Get the source range and manager.
SourceRange range = statement->getSourceRange();
const SourceManager *SM = result.SourceManager;

//Use LLVM's lexer to get source text.
llvm::StringRef ref = Lexer::getSourceText(CharSourceRange::getCharRange(range), *SM, LangOptions());
cout << ref.str() << endl;

虽然我不太确定任何潜在的缺点,但这种方法似乎确实有效。

关于c++ - 在 Clang 中对字符串进行 pretty-print 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40596195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com