创建一个互斥的代码路径列表

问题描述 投票:1回答:1

这是一个普遍的问题,不是一种语言特有的。基本上:如何将1-deep代码路径列表(即if条件列表)转换为互斥if条件列表?即是否有一系列算法可以做到这一点?我觉得这是编译器中的常见问题。

让我们约束问题。我们有一个非常简单的语言。

  • 整数变量
  • 带有两个二元运算符的if / else条件==和!=
  • 执行从上到下发生
  • 没有副作用:如果b = 1然后b = 2,我们可以删除第一个作业

例:

if a == 1 { b = 1 }
if a == 2 { b = 2 }
if a != 3 { b = 2 }
if a == 4 { b = 3 }

将被转换为例如:

if a == 4 { b = 3 }
else if a != 3 { b = 2 }

如果这个问题得到解决,那么支持<,>,&,|会更具挑战性。

algorithm compiler-construction
1个回答
0
投票

我做了一些研究。所以有两个步骤:

  1. 检测互斥性
  2. 使两个非互斥条件相互排斥

如sepp2k已经说过的,可以使用SAT求解器来检测互斥性。不知道它们是如何在内部工作的,但是一位同事给出了使用格子作为值的抽象解释思想的暗示。

ad 2.在一种天真的方法中,对于两个非互斥的代码路径A和B,我们简单地用条件A和B,A和~B以及~A和B替换它们。

© www.soinside.com 2019 - 2024. All rights reserved.