如何使用c从行号获取源文本?

问题描述 投票:1回答:1

我正在使用clang匹配器来获取结果节点。我可以从结果节点获取行号,比方说17。现在,我想在该行中获取整个源代码。请帮助。

让我详细解释。我有一个clang匹配器,可在源代码中找到浮动文字。例如,第17行,sr = 2.0 * rt_urand_Upu32_Yd_f_pw_snf(u);是源代码,然后它与2.0匹配。这是我的匹配者:

const auto PA = floatLiteral(
                                isExpansionInMainFile(), 
                                unless(hasAncestor(arraySubscriptExpr()))
                            ).bind("pa");
            MatchFinder MatchFinder;
            MatchFinder.addMatcher(PA, &Handler);
            MatchFinder.matchAST(Context);

从匹配器中,我可以获得匹配的节点。我能够检索行号(第17行)和列号(6)。请在下面找到我的代码:

const clang::FloatingLiteral* Variable = Result.Nodes.getNodeAs<clang::FloatingLiteral>("pa");
clang::SourceRange loc = Variable16->getSourceRange();
locStart = srcMgr.getPresumedLoc(loc.getBegin());
locEnd = srcMgr.getPresumedLoc(loc.getEnd());
std::cout << locStart.getLine()<< ":" << locEnd.getLine() << std::endl;
std::cout << locStart.getColumn() <<":" << locEnd.getColumn() << std::endl;

现在,如果我尝试检索源代码,我只会得到部分数据。在网上进行了一些研究之后,我尝试通过两种方式检索源代码。第一种方法是使用lexer,请在下面找到代码:

llvm::StringRef ref = Lexer::getSourceText(CharSourceRange::getCharRange(statement->getSourceRange()), srcMgr, LangOptions());
cout << ref.str() << endl;

第二种方法正在使用重写器,请找到下面的代码:

clang::Rewriter rewriter;
rewriter.setSourceMgr(Result.Context->getSourceManager(),Result.Context->getLangOpts());
cout<<rewriter.getRewrittenText (loc)<<endl;

据我所知,似乎我需要从第17行的第0列到第17行的末尾的sourcerange。AST匹配器仅匹配特定的节点,所以我的问题是:

1)是否可以获取第17行的最终列号?

2)还有其他方法可从行号获取源代码吗?

3)是否有其他方法可从匹配器获取源代码?

感谢您的帮助。

clang llvm-clang clang-ast-matchers
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.