是否有任何现有工具可以从bison语法文件中删除所有操作代码,只留下围绕它的{}?
答案 0 :(得分:2)
据我所知,没有。
您肯定知道,编写自己的工具是可行的,但很难。例如,{
和}
字符可以显示为字符常量或字符串。 (当然,:
和;
字符也是如此。)
如果你有特定的文件要删除操作,并且你可以依赖自己的环境和约束(即你不需要针对一般情况的解决方案),可能有一个相对简单的方法它
如果您需要完整的通用解决方案,剩下的就是破解野牛代码。我承认,不是为了胆小的人。也就是说,野牛的大部分都是在野牛中实施或勾勒出来的。
在野牛来源中,请参阅scan-gram.l
和parse-gram.y
了解野牛扫描仪/解析器团队。要注意的令牌是BRACED_CODE
。
现在,既然你需要的是基本上拿一个文件并生成一个近乎完全的副本,而你真的需要理解它,你可以做你所有的工作在词法分析器中。您可以使用scan-gram.l
作为工作的基础。一个有用的修改可能是添加另一个状态(开始条件)来描述你是否在序言/声明部分,而不是语法规则。除了语法规则之外的所有内容都应该逐字打印。
评论,空格,指令,大多数标点符号,标识符,数字:只需逐字打印即可。
字符和字符串:这些在词法分析器中需要它们自己的状态,因为它们必须找到它们的结束位置。 (字符文字可能比一个键盘字符长;想想八进制。)但是考虑到它们有自己的状态,请逐字打印出来。
代码:像字符和字符串一样,你需要弄清楚它的结束位置。这也有点棘手,因为它可能包含字符串和注释等等。但是一旦找到它结束的位置,就可以退出代码状态。这里什么都不需要打印(当然除了括号之外)。
祝你好运!答案 1 :(得分:1)
我知道帖子很旧,但我遇到了同样的问题,发现使用一个小的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('}')
我希望这对任何人都有帮助!