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

Sha*_*hed 8 c# roslyn

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

最近几天我一直在谷歌搜索没有太大的成功.如果有人能指出我的一些样本或罗斯林文件,那就太棒了.

svi*_*ick 9

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

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

    如果您的语言实际上是语法上有效的C#代码,那么这是理想的,但语义是不同的.例如,你可以实现await这种方式,如果你被迫await看起来像一个函数调用(例如,await(x)它将是有效的,但不是await x).

    如果你想引入新的语法(比如一个新的运算符),它可能会起作用,因为Roslyn确实支持解析"破坏的"代码.但它很可能效果不好,因为语法树可能看起来不像你想要的那样.更糟糕的是,结果可能不一致(有时,您的新语法将被解析为单向,有时是另一种).

  2. 由于Roslyn现在是开源的,您实际上可以以任何方式修改编译器的源代码,包括添加新的运算符.

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