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是常量的情况.
你在这里有一套很好的例子.
邮件列表非常活跃且有用.