我有这样的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);
}
}
我想访问仅具有赋值(Initialization)的节点,并获取该变量的声明节点的引用。
答案 0 :(得分:1)
我不确定VisitorUtil
是如何工作的(它不是来自CDT代码),但我认为它为您提供了访问找到的节点的方法。所以:
鉴于找到IASTExpressionStatement
个节点,请使用IASTExpression.getExpression()
获取包含的表达式。
查看它是IASTBinaryExpression
,getOperator()
是IASTBinaryExpression.op_assign
。
使用IASTBinaryExpression.getOperand1()
获取赋值表达式的左子表达式。检查它是否为IASTIdExpression
,并通过IASTIdExpression.getName()
获取其名称的变量。
现在您已拥有该名称,请使用IASTName.resolveBinding()
获取变量绑定。这是语义程序模型中变量的表示。
要查找变量的定义,如果您只想查看当前文件,请使用IASTTranslationUnit.getDefinitionsInAST(IBinding)
;如果您希望查看包含的头文件,请使用IASTTranslationUnit.getDefinitions(IBinding)
同样(后者要求将项目编入索引)。可以通过IASTTranslationUnit
从任何IASTNode
获取IASTNode.getTranslationUnit()
。