5

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

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

  • 如果我对分析器/解析器的经验为零,它是否会比使用正则表达式编写 Shell 或 Python 脚本慢(我想,如果附加关键字的数量变得更大并且它们的效果会相当不同,这可能会变得很痛苦) (虽然我知道 LALR 是如何工作的)?

  • Lex/Yacc 上是否有涵盖类似问题的好材料?我能找到的所有论文都使用相同的“玩具”计算器的原始示例。

任何帮助将不胜感激。

4

5 回答 5

3

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

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

于 2009-04-27T06:51:13.667 回答
3

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

SQLite3使用它,其他几个流行的项目也是如此。我不是说使用它,因为 SQLite 确实如此,但如果时间允许,也许可以尝试一下。

于 2009-04-27T08:47:03.420 回答
1

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

尽管如此,即使对于正则表达式,您也可以将 lex 作为第一步......

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

但是任何 flex/yacc 组合都可以。

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

于 2009-06-06T01:57:13.310 回答
1

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

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

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

于 2009-04-27T08:38:39.323 回答
0

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

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

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

于 2010-01-24T11:30:13.067 回答