如何使用Roslyn在C#中添加新的运算符

8

我正在尝试在C#中实现类似DSL的功能。它可能看起来类似于LINQ查询。我想知道是否可以使用Roslyn实现新的一元或二元运算符。

最近几天我一直在谷歌搜索,但没有太多进展。如果有人能指点一些示例或Roslyn文档,那就太好了。


1
我认为你需要查看这里可以问什么话题? - huMpty duMpty
4
这个问题明确不要求第三方工具的推荐。Roslyn 是最新 C# 版本的一个关键特性。可以说,提问者应该先查看 Roslyn 的页面。 - Panagiotis Kanavos
1
Roslyn是一个编译器,而且他们正在开源它。因此,只要你具备必要的技能集,你就可以实现任意数量的功能。 - mason
2
由于Roslyn在成为开源项目之前并没有得到太多关注,因此关于它的资料和教程并不是很多。而且你能找到的大多数都是关于编写VS扩展、诊断和代码修复方面的。我担心你必须自己摸索(当你掌握了它后,最好写一篇博客文章或其他形式分享知识)。 - MarcinJuraszek
1
最近我研究了向Roslyn添加新的二元运算符,并在博客中发表了相关内容。请参阅Adding Matt operator to Roslyn - Syntax, Lexer and ParserAdding Matt operator to Roslyn - Binder。第三部分Emitter将在我有时间研究时发布。 - MarcinJuraszek
1个回答

10

有两种方法可以使用Roslyn实现一个基于C#的新语言。

  1. 使用Roslyn API将源代码解析为语法树,然后将语法树转换为实际的C#代码并进行编译。

    如果你的语言实际上是符合语法规则的C#代码但语义不同,这种方法就非常理想。例如,你可以采用这种方法来实现await,如果你强制使其看起来像函数调用(例如,await(x)是有效的,但不是await x)。

    如果你想引入新的语法(比如新的操作符),这种方法可能也有一定的效果,因为Roslyn支持解析“错误”的代码。但它可能不会表现得太好,因为这样语法树可能并不是你所期望的样子。更糟糕的是,结果可能是不一致的(有时候,你的新语法将被解析为一种方式,有时候又是另一种方式)。

  2. 由于Roslyn现在是开源的,你实际上可以以任何想要的方式修改编译器的源代码,包括添加新的操作符。

    但这样做很可能并不简单。而且我认为工作流程也会更加复杂:你需要编译自己的编译器版本,而不仅仅是使用NuGet中的库,就像选项1那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接