从bison语法文件中剥离动作代码

时间:2010-04-24 22:31:52

标签: c parsing grammar bison

是否有任何现有工具可以从bison语法文件中删除所有操作代码,只留下围绕它的{}?

2 个答案:

答案 0 :(得分:2)

据我所知,没有。

您肯定知道,编写自己的工具是可行的,但很难。例如,{}字符可以显示为字符常量或字符串。 (当然,:;字符也是如此。)

如果你有特定的文件要删除操作,并且你可以依赖自己的环境和约束(即你不需要针对一般情况的解决方案),可能有一个相对简单的方法它

如果您需要完整的通用解决方案,剩下的就是破解野牛代码。我承认,不是为了胆小的人。也就是说,野牛的大部分都是在野牛中实施或勾勒出来的。

在野牛来源中,请参阅scan-gram.lparse-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('}')

我希望这对任何人都有帮助!