在c#中编写解析器的最佳/最快方法

时间:2009-10-01 19:27:03

标签: c# parsing abstract-syntax-tree

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

7 个答案:

答案 0 :(得分:18)

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

它还提供了构建有意义的ASTs而不需要编写任何代码的非常好的方法 - 对于每个语法生成,您指示“关键”令牌或子生成,并且它成为树节点。或者你可以写树生产。

看一下下面的ANTLR语法(这里按复杂程度增加的顺序列出)来了解它的外观和感觉

答案 1 :(得分:11)

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

答案 2 :(得分:1)

您可以研究Mono C# compiler的源代码。

答案 3 :(得分:1)

虽然它还处于早期测试阶段,但Oslo建模语言和微软的MGrammar工具显示出一定的希望。

答案 4 :(得分:1)

我还要看一下SableCC。它很容易创建EBNF语法。 Here是一个简单的C#计算器示例。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

Lex和yacc仍然是我的最爱。如果你刚刚开始时模糊不清,但是一旦你理解了这种语言,就会非常简单,快速和简单。

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

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

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