【问题标题】:strip action code from bison grammar file从野牛语法文件中去除动作代码
【发布时间】:2010-04-24 22:31:52
【问题描述】:

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

【问题讨论】:

    标签: c parsing grammar bison


    【解决方案1】:

    据我所知,没有。

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

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

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

    在野牛源中,请参阅 scan-gram.lparse-gram.y 了解野牛扫描器/解析器团队。需要注意的令牌是 BRACED_CODE

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

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

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

    代码:就像字符和字符串一样,你需要弄清楚它的结束位置。这也有点棘手,因为它可能包含字符串和 cmets 等等。但是一旦你找到它的结束位置,你就可以退出代码状态。此处无需打印任何内容(当然,大括号除外)。

    祝你好运!

    【讨论】:

    • 是的,我已经编写了自己的虚拟工具。原因中的语法没有您提到的任何特殊情况。标记化只需通过 \W​​ 与 PCRE 进行拆分即可完成。有用。无论如何都接受了答案,尤其是因为“BRACED_CODE”。您的解决方案显然是最干净的(除非 bison 本身提供了一个 API 来获取语法的 AST)。
    【解决方案2】:

    我知道这篇文章很旧,但我遇到了同样的问题,并使用一个小的 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("*/"); }...一样计算大括号!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多