0

我正在尝试为 C++ 编写自定义 KlocWork 检查器,但是我遇到了一个问题:

当我们有这样的表达式时:

x = y + z;

我想访问作为变量'x'的左节点,但也来自右节点的两个变量(来自右节点的左和右)我不知道如何访问每个变量,到目前为止我的检查器中有这个:

// BinaryExpr [ getOperationCode() = KTC_OPCODE_ASSIGN]
    [$exprL:= Left]
    [$size1:= $exprL.getTypeSize()]
    [$exprR:= Right]
    [$exprR.getOperationCode() = KTC_OPCODE_ADD]

它用左节点上的另一个表达式检测每个 BinaryExpression(存储在 $exprR 中),但之后我不知道如何访问 $exprR 的左右子节点。

提前感谢您的帮助!

4

1 回答 1

0

这里有两个嵌套表达式,你想存储赋值的Left节点,然后继续使用完整模式进一步遍历AST到第二个二进制表达式节点,得到add的左右节点。例如:

// BinaryExpr [getOperationCode() = KTC_OPCODE_ASSIGN] [$exprOL:= Left]

在这里,我们找到并存储赋值表达式的左节点。

// BinaryExpr [getOperationCode() = KTC_OPCODE_ASSIGN] [$exprOL:= Left] / Right::BinaryExpr [getOperationCode() = KTC_OPCODE_ADD]

然后我们继续得到加法表达式。最后,我们可以抓住这个表达式的左右:

// BinaryExpr [getOperationCode() = KTC_OPCODE_ASSIGN] [$exprOL:= Left] / Right::BinaryExpr [getOperationCode() = KTC_OPCODE_ADD] 
[$exprL:= Left] 
[$exprR:= Right]

您可以使用 println() 函数对此进行测试。所以完整的表达

// BinaryExpr [getOperationCode() = KTC_OPCODE_ASSIGN] [$exprOL:= Left] / Right::BinaryExpr [getOperationCode() = KTC_OPCODE_ADD]
[$exprL:= Left]
[$exprR:= Right]
[$exprOL.getName().println()]
[$exprL.getName().println()]
[$exprR.getName().println()]

对于以下代码:

int func (int x, int y)
{
    int local;
    local = x;
    local = x + y;
    local = y - x;
    return local;
}

会打印出来:

local
x
y
于 2015-05-05T16:51:26.810 回答