在Roslyn中解析嵌入式表达式

时间:2015-02-17 16:55:30

标签: c# razor roslyn

我正在尝试为类似QML的标记语言编写解析器,我想在标记中允许C#表达式。所以一个例子可能如下所示:

ClassName {
    Property1: 10
    Property2: Math.Sqrt(123)
    Property3: string.Format("{0} {1}", "Hello", "World")
}

(这也有点像ASP.NET的Razor引擎,但是afaics Razor没有使用Roslyn?)

我该怎么做?我只想解析一个表达式,无论是文字,方法调用,lambda等。我已经尝试使用CSharpSyntaxTree.ParseText但是我需要一个完整的文件而我找不到任何文件似乎与此用例相关的文档。

3 个答案:

答案 0 :(得分:6)

您需要致电CSharpSyntaxTree.ParseText(),并使用CSharpParseOptions传递SourceCodeKind.Interactive,{{1}}允许使用顶级表达式。

答案 1 :(得分:2)

SyntaxFactory.ParseExpression()为我工作。

答案 2 :(得分:0)

看起来这个功能在Roslyn的一些预览版本中可用,但同时被搁置在1.0版本中。

互动(REPL)和脚本支持计划在1.1中重新出现,如interactive design meeting notes@github所示。

编辑:事实上,在latest pre-release NuGet package中,我们再次可以将SourceCodeKind.Interactive传递给ParseText