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

发布于 2024-08-07 01:00:03 字数 73 浏览 4 评论 0原文

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

What is the best way to build a parser in c# to parse my own language?
Ideally I'd like to provide a grammar, and get Abstract Syntax Trees as an output.
Many thanks,
Nestor

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

忱杏 2024-08-14 01:00:03

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

它还提供了构建有意义的 AST 的好方法,无需为每个语法生成编写任何代码,您指定“关键”令牌或子生产,并且它成为树节点。或者你可以写一个树产生式。

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

I've had good experience with ANTLR v3. By far the biggest benefit is that it lets you write LL(*) parsers with infinite lookahead - these can be quite suboptimal, but the grammar can be written in the most straightforward and natural way with no need to refactor to work around parser limitations, and parser performance is often not a big deal (I hope you aren't writing a C++ compiler), especially in learning projects.

It also provides pretty good means of constructing meaningful ASTs without need to write any code - for every grammar production, you indicate the "crucial" token or sub-production, and that becomes a tree node. Or you can write a tree production.

Have a look at the following ANTLR grammars (listed here in order of increasing complexity) to get a gist of how it looks and feels

南汐寒笙箫 2024-08-14 01:00:03

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

I've played wtih Irony. It looks simple and useful.

冷血 2024-08-14 01:00:03

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

You could study the source code for the Mono C# compiler.

知你几分 2024-08-14 01:00:03

虽然 Oslo 建模语言和 MGrammar 工具仍处于早期测试阶段微软正在展示一些希望。

While it is still in early beta the Oslo Modeling language and MGrammar tools from Microsoft are showing some promise.

彼岸花ソ最美的依靠 2024-08-14 01:00:03

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

I would also take a look at SableCC. Its very easy to create the EBNF grammer. Here is a simple C# calculator example.

与之呼应 2024-08-14 01:00:03

这里有一篇关于构建 LL(1) 解析器的简短论文,其中当然你也可以使用发电机。

There's a short paper here on constructing an LL(1) parser here, of course you could use a generator too.

婴鹅 2024-08-14 01:00:03

Lex 和 yacc 仍然是我的最爱。如果您刚刚开始,可能会比较晦涩难懂,但一旦您掌握了行话,就会变得非常简单、快速和容易。

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

它并不漂亮,它是基于文本的格式和 LL1,因此您的语法必须适应这一点。

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

Lex and yacc are still my favorites. Obscure if you're just starting out, but extremely simple, fast, and easy once you've got the lingo down.

You can make it do whatever you want; generate C# code, build other grammars, emulate instructions, whatever.

It's not pretty, it's a text based format and LL1, so your syntax has to accomodate that.

On the plus side, it's everywhere. There are great O'reilly books about it, lots of sample code, lots of premade grammars, and lots of native language libraries.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文