使用 Pycparser 解析变量依赖
Parsing variable dependency with Pycparser
我目前正在开展一个项目,为 I/O 在给定函数中查找变量依赖关系,并选择使用 Pycparser。
我现在的代码主要只有一个访问者-class 和一些节点-classes。
它所做的是遍历 AST 并为每个变量赋值、声明、输入、输出和 If 语句创建节点。这些节点具有存储其依赖项的列表属性,例如:
a = b + c/2;
将创建一个名为 'a' 的节点,并将其连接到 'b' 和 'c' 的最新节点。
我的问题来自这里:是否有关于如何连接输出变量的一般想法?
return b;
除了 'b' 的最新实例之外,此代码没有向我们提供任何关于它具有哪些依赖项的信息。但是,我能想到的所有解决方案也会添加 'b' 的先前节点。示例:
b = 3;
b = b + 4;
我不希望这两个 'b' 节点都用于我的输出依赖项。但如果从 If 语句中获取多条路径,但每条路径中只有最近的一条路径,我会想要多个节点。
如果您发现问题含糊不清,是否有任何可以推荐的查找变量依赖关系的方法或来源?
简而言之,这个项目应该实现的是对于输出x(可能有多个输出)我希望能够找出它依赖于哪些输入。这又可能是多种情况,具体取决于其他变量。不同依赖的例子:
int function(int a, int b, int c, int d, bool z){
int x;
if(z){
x = a + b;
}
else{
x = c + d;
}
return x;
我刚刚发现用我一直使用的方法无法实现我一直试图实现的目标。 AST和Pycparser能给我提供的是所有用来确定一个变量值的变量。
要继续解决我的问题,您必须考虑创建 CFG(控制流图)以及数据流。然而,这完全是另一种方法和结果。
我目前正在开展一个项目,为 I/O 在给定函数中查找变量依赖关系,并选择使用 Pycparser。 我现在的代码主要只有一个访问者-class 和一些节点-classes。 它所做的是遍历 AST 并为每个变量赋值、声明、输入、输出和 If 语句创建节点。这些节点具有存储其依赖项的列表属性,例如:
a = b + c/2;
将创建一个名为 'a' 的节点,并将其连接到 'b' 和 'c' 的最新节点。
我的问题来自这里:是否有关于如何连接输出变量的一般想法?
return b;
除了 'b' 的最新实例之外,此代码没有向我们提供任何关于它具有哪些依赖项的信息。但是,我能想到的所有解决方案也会添加 'b' 的先前节点。示例:
b = 3;
b = b + 4;
我不希望这两个 'b' 节点都用于我的输出依赖项。但如果从 If 语句中获取多条路径,但每条路径中只有最近的一条路径,我会想要多个节点。 如果您发现问题含糊不清,是否有任何可以推荐的查找变量依赖关系的方法或来源? 简而言之,这个项目应该实现的是对于输出x(可能有多个输出)我希望能够找出它依赖于哪些输入。这又可能是多种情况,具体取决于其他变量。不同依赖的例子:
int function(int a, int b, int c, int d, bool z){
int x;
if(z){
x = a + b;
}
else{
x = c + d;
}
return x;
我刚刚发现用我一直使用的方法无法实现我一直试图实现的目标。 AST和Pycparser能给我提供的是所有用来确定一个变量值的变量。
要继续解决我的问题,您必须考虑创建 CFG(控制流图)以及数据流。然而,这完全是另一种方法和结果。