16

在 C# 中构建解析器以解析我自己的语言的最佳方法是什么?理想情况下,我想提供一种语法,并将抽象语法树作为输出。非常感谢,内斯特

4

7 回答 7

19

我对ANTLR v3有很好的经验。到目前为止,最大的好处是它可以让你编写具有无限前瞻的 LL(*) 解析器——这些可能不是最理想的,但是可以以最直接和自然的方式编写语法,而无需重构来解决解析器的限制,并且解析器性能通常不是什么大问题(我希望你不是在编写 C++ 编译器),尤其是在学习项目中。

它还提供了构建有意义的AST的非常好的方法,而无需编写任何代码 - 对于每个语法产生式,您都指示“关键”标记或子产生式,这将成为一个树节点。或者你可以写一个树生产。

查看以下 ANTLR 语法(此处按复杂度递增的顺序列出)以大致了解其外观和感觉

于 2009-10-01T19:30:39.863 回答
11

我玩过Irony。它看起来简单而有用。

于 2009-10-01T19:43:50.483 回答
1

您可以研究Mono C# 编译器的源代码。

于 2009-10-01T19:30:32.517 回答
1

虽然它仍处于早期测试阶段,但来自 Microsoft 的Oslo建模语言和 MGrammar 工具已显示出一些前景。

于 2009-10-01T19:39:27.560 回答
1

我也会看看SableCC。创建 EBNF 语法非常容易。是一个简单的 C# 计算器示例。

于 2009-10-01T19:52:16.943 回答
1

这里有一篇关于在这里构建 LL(1) 解析器的简短论文,当然你也可以使用生成器。

于 2010-04-22T02:16:39.057 回答
0

Lex 和 yacc 仍然是我的最爱。如果您刚刚开始,那么就晦涩难懂,但是一旦您掌握了术语,就非常简单、快速和容易。

你可以让它做任何你想做的事;生成 C# 代码、构建其他语法、模拟指令等等。

它不漂亮,它是基于文本的格式和 LL1,所以你的语法必须适应它。

从好的方面来说,它无处不在。有很多关于它的 O'reilly 书籍、大量示例代码、大量预制语法和大量本地语言库。

于 2009-10-02T15:42:18.453 回答