代码之家  ›  专栏  ›  技术社区  ›  Flavius

从Bison语法文件中删除操作代码

  •  2
  • Flavius  · 技术社区  · 14 年前

    有没有现有的工具可以从bison语法文件中删除所有动作代码,只留下符号?

    2 回复  |  直到 11 年前
        1
  •  1
  •   user3152920    11 年前

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

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

        2
  •  2
  •   JXG Jasmynn Flores    14 年前

    据我所知,没有。

    如你所知,编写你自己的工具是可行的,但很困难。例如, { } 字符可以显示为字符常量或字符串。(也可以 : ; 当然是人物。)

    如果您有想要从中删除操作的特定文件,并且您可以依赖自己的环境和约束(即,对于一般情况,您不需要解决方案),那么可能有一种相对简单的方法来完成这项工作。

    如果你需要一个完整的通用解决方案,剩下的就是破解Bison代码。我承认,这不适合胆小的人。也就是说,很多野牛都是在野牛身上实施或勾画出来的。

    在野牛资料中,见 scan-gram.l parse-gram.y 对于野牛扫描仪/解析器团队。要注意的标志是 BRACED_CODE .

    现在,因为您需要的基本上是获取一个文件并生成一个几乎精确的副本,而您不需要 真正地 需要理解的是,你可能可以在雷克斯做你所有的工作。你可以使用 扫描图 作为你工作的基础。一个有用的修改可能是添加另一个状态(开始条件)来描述您是否在序言/声明部分,而不是语法规则中。除了语法规则以外的所有东西都应该逐字印刷。

    注释、空白、指令、大多数标点、标识符、数字:只需逐字打印。

    字符和字符串:它们需要在lexer中有自己的状态,因为必须找到它们的结尾。(字符文字可能比一个键盘字符长;想想八进制。)但考虑到它们有自己的状态,请逐字打印出来。

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

    祝你好运!