由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 如何clean up C语言中的#if condition statement?
相关主题
最基本的C语言编程问题请教两个简单R代码(坑?)求解[factor]
这个结果是啥,为什么呢?Xerces-C++ in vs.net question
单线程一般都是历史原因How to tell gcc stop compiling.
[合集] 和大家再讨论一道面试算法题(MS) (转载)global variable usage question in C++
True or False两个class的交叉引用问题
一个django问题:debug=true就很好;debug=false,css就找不到一个naive的问题——是否有这种工具?
这个题目什么意思啊?问个C++问题,高手帮帮忙
这样的代码有啥意义么32/64编程怎么做才好呢
相关话题的讨论汇总
话题: endif话题: blabla话题: true话题: false话题: 简化
进入Programming版参与讨论
1 (共1页)
h*****n
发帖数: 209
1
最近有个任务,要retire 几百个 switches,
比如说 switches A, B, C, D, A要retire成TRUE, B要retire成FALSE, C,D 不动
那么
#if A||C
blabla
#endif
就简化成 blabla
#if B||C
blabla
#endif
简化成
#if C
blabla
#endif
#if C==TRUE && B==FALSE || A && D
blabla
#endif
简化成
#if (C==TRUE) || D
blabla
#endif
像这种任务是不是用PERL处理比较好? 但没有比较好的思路。因为这里面还有一个优先
级的问题:== >!= > && > ||
不知道版上的大侠有没有什么好的建议?
b*******s
发帖数: 5216
2
逻辑优先级的话用语法树?然后剪枝?
其实可以做个简单的工具,原始的文件不变,每次编译时,根据参数做替换生成供编译
的文件
比如你的原始文件被改名成xxx_template.c,在makefile里还是编译xxx.c
但这个xxx.c是全局替换A B 后生成的临时文件

【在 h*****n 的大作中提到】
: 最近有个任务,要retire 几百个 switches,
: 比如说 switches A, B, C, D, A要retire成TRUE, B要retire成FALSE, C,D 不动
: 那么
: #if A||C
: blabla
: #endif
: 就简化成 blabla
: #if B||C
: blabla
: #endif

h*****n
发帖数: 209
3
多谢。有什么工具可以生成语法树并剪枝吗?没有这方面的经验。
b*******s
发帖数: 5216
4
那个简单方案不行吗?那个方案几个小时就能搞定了
而且万一以后要改c d等都不用写代码

【在 h*****n 的大作中提到】
: 多谢。有什么工具可以生成语法树并剪枝吗?没有这方面的经验。
b*******s
发帖数: 5216
5
语法分析树我也不熟,就知道一些理论性的东西
以前做过一个简单的测试脚本解释器用过,很久了

【在 h*****n 的大作中提到】
: 多谢。有什么工具可以生成语法树并剪枝吗?没有这方面的经验。
h*****n
发帖数: 209
6
还是不懂。你说的
"但这个xxx.c是全局替换A B 后生成的临时文件"
是什么意思啊?

【在 b*******s 的大作中提到】
: 那个简单方案不行吗?那个方案几个小时就能搞定了
: 而且万一以后要改c d等都不用写代码

b*******s
发帖数: 5216
7
就是用一个脚本工具scan原始文件xxx_template.c
你传输类似 A = TRUE B = FALSE 这样的参数给脚本
脚本读取原始文件,把里面的A 替换成 TRUE
B替换成FALSE
这样类似 if ((C == TRUE) || A && D)
就被替换为 if (( C == TRUE) || TRUE &&D)
然后脚本把替换后的文本存成xxx.c
这样你在pre-compile阶段调用脚本
最后实际编译的是经过替换的结果文件xxx.c
如果有一天你要改变D了,只要改一下脚本的输入参数
一行代码都不用写

【在 h*****n 的大作中提到】
: 还是不懂。你说的
: "但这个xxx.c是全局替换A B 后生成的临时文件"
: 是什么意思啊?

b*******s
发帖数: 5216
8
因为要替换的行都是switch if while之类可以穷举的条件控制语句
稍微写几个正则就能控制了
而且你还有源文件,还能修改下源文件让正则更简单

【在 h*****n 的大作中提到】
: 还是不懂。你说的
: "但这个xxx.c是全局替换A B 后生成的临时文件"
: 是什么意思啊?

b*******s
发帖数: 5216
9
stackoverflow 有一篇 how to construct an abstract syntax tree

【在 h*****n 的大作中提到】
: 多谢。有什么工具可以生成语法树并剪枝吗?没有这方面的经验。
h*****n
发帖数: 209
10
正则搞不定复杂的case,
要考虑多层嵌套,优先级和括号的情况。

【在 b*******s 的大作中提到】
: 因为要替换的行都是switch if while之类可以穷举的条件控制语句
: 稍微写几个正则就能控制了
: 而且你还有源文件,还能修改下源文件让正则更简单

相关主题
一个django问题:debug=true就很好;debug=false,css就找不到两个简单R代码(坑?)求解[factor]
这个题目什么意思啊?Xerces-C++ in vs.net question
这样的代码有啥意义么How to tell gcc stop compiling.
进入Programming版参与讨论
b*******s
发帖数: 5216
11
如果只是做替换,不需要搞清这些关系

【在 h*****n 的大作中提到】
: 正则搞不定复杂的case,
: 要考虑多层嵌套,优先级和括号的情况。

h*****n
发帖数: 209
12
我是整个code要简化,不是光替换就完了。
假设switches A, B, C, D, A要retire成TRUE, B要retire成FALSE, C,D 不动
那么
#if A||C
blabla
#endif
简化成 blabla
#if B||C
blabla
#endif
简化成
#if C
blabla
#endif
#if C==TRUE && B==FALSE || A && D
blabla
#endif
简化成
#if (C==TRUE) || D
blabla
#endif

【在 b*******s 的大作中提到】
: 就是用一个脚本工具scan原始文件xxx_template.c
: 你传输类似 A = TRUE B = FALSE 这样的参数给脚本
: 脚本读取原始文件,把里面的A 替换成 TRUE
: B替换成FALSE
: 这样类似 if ((C == TRUE) || A && D)
: 就被替换为 if (( C == TRUE) || TRUE &&D)
: 然后脚本把替换后的文本存成xxx.c
: 这样你在pre-compile阶段调用脚本
: 最后实际编译的是经过替换的结果文件xxx.c
: 如果有一天你要改变D了,只要改一下脚本的输入参数

b*******s
发帖数: 5216
13
能问一句为什么吗?

【在 h*****n 的大作中提到】
: 我是整个code要简化,不是光替换就完了。
: 假设switches A, B, C, D, A要retire成TRUE, B要retire成FALSE, C,D 不动
: 那么
: #if A||C
: blabla
: #endif
: 简化成 blabla
: #if B||C
: blabla
: #endif

h*****n
发帖数: 209
14
哈,我被assign了一个任务,要clean up几百个这样的switch。
要manual弄太没意思了,想编个tool来弄。

【在 b*******s 的大作中提到】
: 能问一句为什么吗?
v*****u
发帖数: 1796
15
try regular expression.

【在 h*****n 的大作中提到】
: 哈,我被assign了一个任务,要clean up几百个这样的switch。
: 要manual弄太没意思了,想编个tool来弄。

d***a
发帖数: 13752
16
不用搞得那么复杂,直接调用cpp预处理器就可以了。cpp的具体用法网上找得到。
cpp的输出会有多余的空行,再写一个简单的script去掉。

【在 h*****n 的大作中提到】
: 最近有个任务,要retire 几百个 switches,
: 比如说 switches A, B, C, D, A要retire成TRUE, B要retire成FALSE, C,D 不动
: 那么
: #if A||C
: blabla
: #endif
: 就简化成 blabla
: #if B||C
: blabla
: #endif

h*****n
发帖数: 209
17
Thanks.
能否给个链接?

【在 d***a 的大作中提到】
: 不用搞得那么复杂,直接调用cpp预处理器就可以了。cpp的具体用法网上找得到。
: cpp的输出会有多余的空行,再写一个简单的script去掉。

p***o
发帖数: 1252
18
cpp要把所有的宏都展开把,估计不行。

【在 d***a 的大作中提到】
: 不用搞得那么复杂,直接调用cpp预处理器就可以了。cpp的具体用法网上找得到。
: cpp的输出会有多余的空行,再写一个简单的script去掉。

d***a
发帖数: 13752
19
这个是gnu cpp的: http://gcc.gnu.org/onlinedocs/cpp/index.html

【在 h*****n 的大作中提到】
: Thanks.
: 能否给个链接?

d***a
发帖数: 13752
20
这倒是...俺考虑不周。

【在 p***o 的大作中提到】
: cpp要把所有的宏都展开把,估计不行。
1 (共1页)
进入Programming版参与讨论
相关主题
32/64编程怎么做才好呢True or False
Why should i include .cpp instead of .h一个django问题:debug=true就很好;debug=false,css就找不到
怎样include一个函数这个题目什么意思啊?
gcc 编译的时候要包括 header source file 吗?这样的代码有啥意义么
最基本的C语言编程问题请教两个简单R代码(坑?)求解[factor]
这个结果是啥,为什么呢?Xerces-C++ in vs.net question
单线程一般都是历史原因How to tell gcc stop compiling.
[合集] 和大家再讨论一道面试算法题(MS) (转载)global variable usage question in C++
相关话题的讨论汇总
话题: endif话题: blabla话题: true话题: false话题: 简化