在c#中构建解析器以解析我自己的语言的最佳方法是什么? 理想情况下,我想提供一个语法,并将抽象语法树作为输出。 非常感谢, 内斯特
答案 0 :(得分:18)
我对ANTLR v3有很好的经验。到目前为止,最大的好处是它可以让你编写具有无限前瞻性的LL(*)解析器 - 这些可能非常不理想,但语法可以用最直接和最自然的方式编写,无需重构来解决解析器限制,并且解析器性能通常不是什么大问题(我希望你不是在编写C ++编译器),特别是在学习项目时。
它还提供了构建有意义的ASTs而不需要编写任何代码的非常好的方法 - 对于每个语法生成,您指示“关键”令牌或子生成,并且它成为树节点。或者你可以写树生产。
看一下下面的ANTLR语法(这里按复杂程度增加的顺序列出)来了解它的外观和感觉
答案 1 :(得分:11)
我玩过Irony。它看起来简单实用。
答案 2 :(得分:1)
您可以研究Mono C# compiler的源代码。
答案 3 :(得分:1)
虽然它还处于早期测试阶段,但Oslo建模语言和微软的MGrammar工具显示出一定的希望。
答案 4 :(得分:1)
答案 5 :(得分:1)
这里有关于构建LL(1)解析器的简短文章here,当然你也可以使用生成器。
答案 6 :(得分:0)
Lex和yacc仍然是我的最爱。如果你刚刚开始时模糊不清,但是一旦你理解了这种语言,就会非常简单,快速和简单。
你可以做任何你想做的事情;生成C#代码,构建其他语法,模拟指令等等。
它不漂亮,它是基于文本的格式和LL1,所以你的语法必须适应它。
从好的方面来说,它无处不在。有很多关于它的O'reilly书籍,大量的示例代码,许多预制语法和许多母语库。