我有一个像这样的c代码int x; x = 5;
我使用eclipse cdt生成AST,并在其上遍历,因此这是被遍历类的代码
public class RuleChk extends AbstractRule {
public RuleChk(IASTTranslationUnit ast) {
super("RuleChk", false, ast);
shouldVisitDeclarations = true;
shouldVisitParameterDeclarations = true;
}
@Override
public int visit(IASTSimpleDeclaration simpleDecl) {
//if this node has init, e.g: x = 5, do business
if(VisitorUtil.containNode(simpleDecl, CASTExpressionStatement){
// Now I have the x = 5 node,
// I want to get the reference node of it's declaration
// I mean (int x;) node
IASTNode declNode = ?????
}
return super.visit(parameterDeclaration);
}
}
字符串
我想访问的节点只有assignation(赋值),并获得该变量的声明节点的引用。
2条答案
按热度按时间ndh0cuux1#
我不确定
VisitorUtil
是如何工作的(它不是来自CDT代码),但我假设它提供了一种访问找到的节点的方法。所以:IASTExpressionStatement
节点,使用IASTExpression.getExpression()
获取包含的表达式。IASTBinaryExpression
,也就是getOperator()
是IASTBinaryExpression.op_assign
。IASTBinaryExpression.getOperand1()
获取赋值表达式的左子表达式。检查它是否是IASTIdExpression
,并通过IASTIdExpression.getName()
获取它命名的变量。IASTName.resolveBinding()
来获取变量的binding。这是变量在语义程序模型中的表示。IASTTranslationUnit.getDefinitionsInAST(IBinding)
,或者如果您希望它也在包含的头文件中查找,则使用IASTTranslationUnit.getDefinitions(IBinding)
(后者需要索引项目)。IASTTranslationUnit
可以通过IASTNode.getTranslationUnit()
从任何IASTNode
获取。bvpmtnay2#
类似上面的答案,但是你可以使用
IASTTranslationUnit.getReferences(IBinding)
来完成它,它将给予你所有的IASTName
引用到你的IBinding
,你可以找到语句useparent
方法。