【发布时间】:2010-04-24 22:31:52
【问题描述】:
是否有任何现有工具可以从野牛语法文件中删除所有操作代码,只留下 {}?
【问题讨论】:
是否有任何现有工具可以从野牛语法文件中删除所有操作代码,只留下 {}?
【问题讨论】:
据我所知,没有。
您肯定知道,编写自己的工具是可行的,但很困难。例如,{ 和 } 字符可以显示为字符常量或字符串。 (当然,: 和 ; 字符也可以。)
如果您有特定文件要从中删除操作,并且您可以依赖自己的环境和约束(即您不需要针对一般情况的解决方案),则可能有一种相对简单的方法来做它。
如果您需要一个完整的通用解决方案,剩下的就是破解野牛代码。我承认,不适合胆小的人。也就是说,bison 的大部分内容都是在 bison 中实现或勾勒出来的。
在野牛源中,请参阅 scan-gram.l 和 parse-gram.y 了解野牛扫描器/解析器团队。需要注意的令牌是 BRACED_CODE。
现在,由于您需要的基本上是获取一个文件并生成一个近乎精确的副本,而您真的不需要理解它,您可能可以完成所有工作在词法分析器中。您可以使用scan-gram.l 作为您工作的基础。一个有用的修改可能是添加另一个状态(开始条件)来描述您是否在序言/声明部分,而不是语法规则。除语法规则外的所有内容都应逐字打印。
注释、空格、指令、大多数标点符号、标识符、数字:只需逐字打印出来。
字符和字符串:它们在词法分析器中需要它们自己的状态,因为找到它们的结束位置很重要。 (字符文字可能比一个键盘字符长;想想八进制。)但鉴于它们有自己的状态,请逐字打印出来。
代码:就像字符和字符串一样,你需要弄清楚它的结束位置。这也有点棘手,因为它可能包含字符串和 cmets 等等。但是一旦你找到它的结束位置,你就可以退出代码状态。此处无需打印任何内容(当然,大括号除外)。
祝你好运!
【讨论】:
我知道这篇文章很旧,但我遇到了同样的问题,并使用一个小的 python 脚本找到了一个更简单的解决方案。
filename = "in.txt";
b_count = 0;
with open("out.txt", "w") as fout:
with open(filename) as f:
while True:
c = f.read(1)
if not c:
print "End of file"
break
if (b_count == 0):
fout.write(c);
if (c == '{'):
b_count += 1
else :
if (c == '{'):
b_count += 1
if (c == '}'):
b_count -= 1
if (b_count == 0):
fout.write('}')
我希望这对任何人都有帮助!
【讨论】:
'{' 和 "{" 等引号中的大括号不会开始代码块,并且可能没有结束 }。对于像 /* { */ 这样的 cmets 中的大括号也是如此。但是评论符号可能会用引号引起来,所以你应该像printf("/*"); if(1) { printf("*/"); }...一样计算大括号!