.NET 是否有一个好的解析器生成器(想想 lex/yacc 或 antlr)?任何拥有不会吓到律师的执照的人?很多 LGPL,但我正在研究嵌入式组件,一些组织对我采用 LGPL 依赖项感到不舒服。
我听说 Oslo 可能会提供此功能,但我不确定它是构建时间依赖还是运行时依赖。谁能澄清奥斯陆将提供什么?
更新
我真正想要的是一个解析器生成器,它是一个仅构建时间的依赖项。看起来 ANTLR 有一个运行时组件。
我刚刚发现 F# 附带了 yacc 和 lex 的实现。看起来我将能够利用这个解析器生成器来满足我的 .NET 需求。
Parsing 示例展示了如何使用 fsyacc 和 fslex 工具来构建用于 F# 的解析器和词法分析器。(模式:编译,运行:任何 CLI,包括 Mono)
相关博文:
嗯,你已经提到了 Antlr,所以我不确定你为什么不考虑它......
Antlr 生成 C# ( http://www.antlr.org/wiki/display/ANTLR3/Antlr%2B3%2BCSharp%2BTarget ) 并具有 BSD 许可证 ( http://www.antlr.org/license.html )限制很少。
Irony ( http://irony.codeplex.com/ ) 有相当多的下载和一个(很容易看的)MIT 许可证。似乎有完整的源代码,因此可以将其直接“嵌入”到您的应用程序中。
就我个人而言,我非常喜欢GOLD Parser Generator。它不直接生成任何代码,它只是为您提供 DFA 和 LALR 状态表,并让您编写自己的解析器引擎以满足您的需求。
这种构造事物的方式并不适合每个人或所有情况(你失去了一些灵活性,因为你的语言必须满足 LALR 限制),所以我不认为这是“正确的方式”,但我喜欢解析算法的分离从解析规则(这确实意味着任何运行时要求都完全在您的控制范围内)。
当然,您不必编写自己的引擎——例如,网站上列出了三个用 C# 编写的引擎。副手我不知道这些引擎使用什么许可证,但坦率地说,如果您发现许可证不受欢迎,那么编写自己的引擎是微不足道的。GOLD 包含对工作算法进行完整描述的文档,这是一个简单的状态机系统(正如您所期望的,如果您了解 LALR 解析)。当然,GOLD 程序本身可以免费使用。
GOLD 还包括一个用于编写语言语法的 IDE,这非常有用。
ANTLR 有一个运行时组件,但您始终可以使用它使用的几个类并将它们包含在您的项目中,此时您不再需要引用运行时程序集。它在 BSD 许可下获得许可 - C# 3 目标的 3 条款和 C# 2 目标的 4 条款。
您还可以尝试Malcolm Crowe 的 LEX/YACC 编译器工具。很多很好的例子。