【问题标题】:Most effective way to parse C-like definition strings?解析类 C 定义字符串的最有效方法?
【发布时间】:2010-10-22 00:05:23
【问题描述】:

我有一组用类 C 语言编写的函数定义,其中包含一些可以放在一些参数之前的附加关键字(例如,与“无符号”或“寄存器”相同),我需要分析这些行以及一些函数存根并从中生成实际的 C 代码。

  • Flex/Yacc 是最合适的方法,这对吗?

  • 如果我有分析器/解析器的零经验(尽管我知道 LALR 是如何工作的)?
  • 在 Lex/Yacc 上有什么好的材料可以解决类似的问题吗?我能找到的所有论文都使用相同的“玩具”计算器的原始示例。

任何帮助将不胜感激。

【问题讨论】:

    标签: parsing yacc flex-lexer


    【解决方案1】:

    ANTLR 是常用的(与 Lex\Yacc 一样)。

    ANTLR,另一种语言工具 识别,是一种语言工具 提供构建框架 识别器,解释器,编译器, 和语法翻译 包含动作的描述 多种目标语言。

    【讨论】:

    • @Mitch Wheat:我相信他指的是你关于 ANTLR 取代 Lex\Yacc 的评论。
    • ANTLR 没有“取代”Lex/Yacc。它已被证明是一个可行的替代方案。 LALR 解析远未结束。
    【解决方案2】:

    还有Lemon Parser,它的语法限制较少。不利的一面是你嫁给了柠檬,当你发现一些限制很糟糕时,将解析器的语法重写为其他东西。好的一面是它真的很容易使用..而且是独立的。您可以将其放在树中,而不必担心检查其他人的存在。

    SQLite3 使用它,其他几个受欢迎的项目也是如此。我不是说使用它,因为 SQLite 可以,但如果时间允许,不妨试一试。

    【讨论】:

      【解决方案3】:

      这完全取决于您对“有效”的定义。如果您拥有世界上所有的时间,最快的解析器将是一个手写的拉解析器。它们需要很长时间来调试和开发,但今天,在运行时性能方面,没有任何解析器生成器能胜过手写代码。

      如果您想要在一周左右的时间内解析有效 C 的东西,请使用解析器生成器。代码将足够快,并且大多数解析器生成器已经附带了 C 语法,您可以将其用作起点(避免 90% 的常见错误)。

      请注意,正则表达式不适合解析递归结构。这种方法比使用生成器要慢,而且比手写的拉解析器更容易出错。

      【讨论】:

      • 由于 C 的上下文敏感性,最后 10% 将花费你一年的时间。问问 GNU 的人。
      【解决方案4】:

      实际上,这取决于您的语言有多复杂以及它是否真的接近 C...

      不过,即使对于正则表达式,您也可以使用 lex 作为第一步 ....

      我会选择 lex + menhir 和 o'caml....

      但任何 flex/yacc 组合都可以..

      常规野牛(yacc 的 gnu 实现)的主要问题源于 C 类型。您必须描述整个树(以及所有操作函数)...使用 o'caml 会更容易.. .

      【讨论】:

        【解决方案5】:

        对于您想做的事情,我们的DMS Software Reengineering Toolkit 可能是一个非常有效的解决方案。

        DMS 专为支持您所讨论类型的客户分析器/代码生成器而设计。它为定义任意语言解析器/分析器提供了非常强大的工具(在 30 多种真实语言上进行了测试,包括 C、C++、Java、C# 和 COBOL 的几种完整方言)。

        DMS 可自动构建 AST(因此您无需做任何事情,只需正确掌握语法即可获得可用的 AST),支持对您指定的模式导向检查构建自定义分析,可以构建新的表示您要生成的代码的 C 特定 AST,并将它们作为可编译的 C 源文本输出。用于 DMS 的 C 的现有定义可能会弯曲以涵盖您的类 C 语言。

        【讨论】:

        • 这听起来像是一个无耻的插件/促销产品,你必须花大量现金......有趣的是,你在这里提到了完全相同的事情......stackoverflow.com/questions/526797/…这是编程问题的地方,而不是推广商业软件....
        • 问题是,“最好的方法是什么”。答案应该合理地包括有帮助的软件,无论是商业的还是非商业的。是的,我有偏见,因为我在 15 年前就构思了这个答案来回答这类问题。
        猜你喜欢
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 2013-03-08
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多