如何确定变量是否在clang AST中特定源位置的范围内?

时间:2016-11-04 11:45:41

标签: c++ clang

我正在使用clang编写自动修复程序。有时,程序需要通过故障部分范围内的变量生成一些代码。首先,它收集方法中的所有变量(包含故障部分),然后检查哪些变量属于故障部分的范围。如何判断变量是否属于某个源位置的范围? 例如,我有一个这样的代码:

int a = 12;
{
    int b = 77;
}

if (i > 0 //FAULTY SECTION) 
{
 //do something 
}

现在程序需要生成一些代码并将上面的内容更改为以下内容:

int a = 12;
{
    int b = 77;
}

if (i > 0 && a > 0) 
{
 //do something 
}

很明显,b不属于故障部分的范围,我的程序不应该尝试下面的那个,因为从语法上讲它是错误的:

if (i > 0 && b > 0) 
{
 //do something 
}

程序如何发现故障部分范围内不存在b而不尝试最后一个代码?

1 个答案:

答案 0 :(得分:0)

所以你试图以编程方式弄清楚两个变量是否共享相同的范围。你有范围运算符{和}。所以你可以做的就是在解析源代码时,创建一个跟踪变量范围的树,例如:

tree scopes // variable
list current_branch // variable pointing to current branch

current_branch = scopes.addRoot() // root or main scope

start parsing {
    if scope start operator met:
        current_branch = current_branch.addNewBranch() // branch down
    if variable met:
        current_branch.addVariable(theVariable) // variables in the same scope will be added to the same branch
    if scope end operator met:
        current_branch = current_branch.parent // go up a branch
}

然后,您将拥有一个包含变量的范围树,您可以通过在树中查找一个变量并检查另一个变量是否在同一分支中来检查它们是否共享相同的范围。

不要忘记,如果变量foo位于其他变量bar所在的任何父分支中,那么foo仍将在bar的范围内的范围。

示例:

int foo;
{
    int bar; // foo still in scope
}