我正在尝试在C#中实现类似DSL的功能。它可能看起来类似于LINQ查询。我想知道是否可以使用Roslyn实现新的一元或二元运算符。
最近几天我一直在谷歌搜索,但没有太多进展。如果有人能指点一些示例或Roslyn文档,那就太好了。
我正在尝试在C#中实现类似DSL的功能。它可能看起来类似于LINQ查询。我想知道是否可以使用Roslyn实现新的一元或二元运算符。
最近几天我一直在谷歌搜索,但没有太多进展。如果有人能指点一些示例或Roslyn文档,那就太好了。
有两种方法可以使用Roslyn实现一个基于C#的新语言。
使用Roslyn API将源代码解析为语法树,然后将语法树转换为实际的C#代码并进行编译。
如果你的语言实际上是符合语法规则的C#代码但语义不同,这种方法就非常理想。例如,你可以采用这种方法来实现await
,如果你强制使其看起来像函数调用(例如,await(x)
是有效的,但不是await x
)。
如果你想引入新的语法(比如新的操作符),这种方法可能也有一定的效果,因为Roslyn支持解析“错误”的代码。但它可能不会表现得太好,因为这样语法树可能并不是你所期望的样子。更糟糕的是,结果可能是不一致的(有时候,你的新语法将被解析为一种方式,有时候又是另一种方式)。
由于Roslyn现在是开源的,你实际上可以以任何想要的方式修改编译器的源代码,包括添加新的操作符。
但这样做很可能并不简单。而且我认为工作流程也会更加复杂:你需要编译自己的编译器版本,而不仅仅是使用NuGet中的库,就像选项1那样。