find变量声明参考抽象语法树eclipse cdt C代码

时间:2017-11-16 11:53:04

标签: eclipse eclipse-cdt abstract-syntax-tree

我有这样的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)的节点,并获取该变量的声明节点的引用。

1 个答案:

答案 0 :(得分:1)

我不确定VisitorUtil是如何工作的(它不是来自CDT代码),但我认为它为您提供了访问找到的节点的方法。所以:

  • 鉴于找到IASTExpressionStatement个节点,请使用IASTExpression.getExpression()获取包含的表达式。

  • 查看它是IASTBinaryExpressiongetOperator()IASTBinaryExpression.op_assign

  • 使用IASTBinaryExpression.getOperand1()获取赋值表达式的左子表达式。检查它是否为IASTIdExpression,并通过IASTIdExpression.getName()获取其名称的变量。

  • 现在您已拥有该名称,请使用IASTName.resolveBinding()获取变量绑定。这是语义程序模型中变量的表示。

  • 要查找变量的定义,如果您只想查看当前文件,请使用IASTTranslationUnit.getDefinitionsInAST(IBinding);如果您希望查看包含的头文件,请使用IASTTranslationUnit.getDefinitions(IBinding)同样(后者要求将项目编入索引)。可以通过IASTTranslationUnit从任何IASTNode获取IASTNode.getTranslationUnit()

相关问题