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之类可以穷举的条件控制语句 : 稍微写几个正则就能控制了 : 而且你还有源文件,还能修改下源文件让正则更简单
|
|
|
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要把所有的宏都展开把,估计不行。
|