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

C 从bison语法文件中剥离操作代码,c,parsing,grammar,bison,C,Parsing,Grammar,Bison,是否有任何现有的工具可以从bison语法文件中删除所有动作代码,只留下周围的{}?据我所知,没有 正如您肯定知道的,编写自己的工具是可行的,但很难。例如,{和}字符可以显示为字符常量或字符串。(当然,:和;字符也是如此。) 如果您有要从中剥离操作的特定文件,并且您可以依赖自己的环境和约束(即,对于一般情况,您不需要解决方案),那么可能有一种相对简单的方法来执行此操作 如果您需要一个完整的通用解决方案,剩下的就是破解bison代码。我承认,这不适合胆小的人。也就是说,bison的大部分内容都是在b

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

据我所知,没有

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

如果您有要从中剥离操作的特定文件,并且您可以依赖自己的环境和约束(即,对于一般情况,您不需要解决方案),那么可能有一种相对简单的方法来执行此操作

如果您需要一个完整的通用解决方案,剩下的就是破解bison代码。我承认,这不适合胆小的人。也就是说,bison的大部分内容都是在bison中实现或勾勒出来的

在bison sources中,请参阅bison扫描仪/解析器团队的
扫描gram.l
解析gram.y
。要查找的标记是
带括号的\u code

现在,由于您需要的基本上是获取一个文件并生成一个几乎完全相同的副本,并且您不需要真正理解它,因此您可以在lexer中完成所有工作。您可以使用
scan gram.l
作为您工作的基础。一个有用的修改可能是添加另一个状态(开始条件)来描述您是否在序言/声明部分,而不是语法规则。除语法规则外,所有内容都应逐字打印

注释、空格、指令、大多数标点符号、标识符、数字:只需逐字打印出来

字符和字符串:它们在lexer中需要自己的状态,因为找到它们的结束位置是至关重要的。(字符文字可能比一个键盘字符长;想想八进制。)但鉴于它们有自己的状态,请逐字打印出来

代码:就像字符和字符串一样,你需要找出它的结尾。这也有点棘手,因为它可能包含字符串、注释等等。但一旦找到了它的结束位置,就可以退出代码状态。这里没有什么需要打印的(当然除了大括号)


祝你好运

我知道这篇文章很旧,但我遇到了同样的问题,并使用一个小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('}')

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

是的,我已经写了我自己的虚拟工具。原因中的语法没有你提到的任何特殊情况。标记化是通过\W使用PCRE拆分来完成的。它可以工作。无论如何,我接受了这个答案,特别是因为“大括号的代码”。您的解决方案显然是最干净的(除非bison本身提供了一个API来获取语法的AST)。这即使在简单的情况下也不起作用。引号中的大括号,如
{'
“{”
不会启动代码块,也可能没有结束符。}。注释中的大括号,如
/*{*/
,也是如此。但是注释符号可能在引号中,因此您应该像
printf(“/*”)中一样计算大括号;如果(1){printf(“*/”;}
。。。!