C:转换A?B:C进入if(A)B else C

tur*_*1ng 5 c if-statement transformation

我正在寻找一个可以转换表单的C代码表达式的工具:

a = (A) ? B : C;
Run Code Online (Sandbox Code Playgroud)

使用if/ elsestatements 进入'default'语法:

if (A)
  a = B
else
  a = C
Run Code Online (Sandbox Code Playgroud)

有人知道一个能够做这种转变的工具吗?

我使用GCC 4.4.2并创建一个预处理文件,-E但不希望这样的结构.

编辑:以下代码也应该转换:

a = ((A) ? B : C)->b;
Run Code Online (Sandbox Code Playgroud)

LB4*_*B40 12

Coccinelle可以很容易地做到这一点.

Coccinelle是一个程序匹配和转换引擎,它提供语言SmPL(语义补丁语言),用于指定C代码中的所需匹配和转换.Coccinelle最初的目标是在Linux中执行附带进化.此类演变包括客户端代码响应库API中的演变所需的更改,并且可能包括修改,例如重命名函数,添加其值以某种方式依赖于上下文的函数参数,以及重组数据结构.除了附带的进化,Coccinelle成功地(由我们和其他人)用于查找和修复系统代码中的错误.

编辑: 语义补丁的一个例子:

@@ expression E; constant C; @@
(
  !E & !C
|
- !E & C
+ !(E & C)
)
Run Code Online (Sandbox Code Playgroud)

从文档:

模式!x&y.这种形式的表达式几乎总是毫无意义,因为它将布尔运算符与位运算符组合在一起.特别是,如果y的最右边的位是0,则结果将始终为0.此语义补丁关注于y是常量的情况.

在这里有一套很好的例子.

邮件列表非常活跃且有用.