find variable声明引用抽象语法树eclipse cdt C代码

rn0zuynd  于 9个月前  发布在  Eclipse
关注(0)|答案(2)|浏览(111)

我有一个像这样的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(赋值),并获得该变量的声明节点的引用。

ndh0cuux

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获取。
bvpmtnay

bvpmtnay2#

类似上面的答案,但是你可以使用IASTTranslationUnit.getReferences(IBinding)来完成它,它将给予你所有的IASTName引用到你的IBinding,你可以找到语句use parent方法。

相关问题