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

最近几天我一直在谷歌上搜索,但收效甚微。如果有人可以向我指出一些示例或Roslyn文档,那就太好了。

最佳答案

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

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

    如果您的语言实际上是语法上有效的C#代码,但是语义不同,则这是理想的选择。例如,如果您强制await看起来像一个函数调用,则可以以这种方式实现await(例如await(x)是有效的,但await x无效)。

    如果您想引入新的语法(例如新的运算符),则可能会起作用,因为Roslyn确实支持解析“中断”代码。但是它很可能无法很好地工作,因为这样语法树可能看起来并不像您想要的那样。更糟糕的是,结果可能不一致(有时,您的新语法将以一种方式(有时以另一种方式)进行解析)。
  • 由于Roslyn现在是开源的,因此您实际上可以以所需的任何方式修改编译器的源代码,包括添加新的运算符。

    但是,这样做绝非易事。而且我认为工作流程也将变得更加复杂:您需要编译自己的编译器版本,而不仅仅是像选项1中那样使用NuGet中的库。
  • 关于c# - 如何使用Roslyn在C#中添加新运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22916098/

    10-11 13:57