在 Roslyn 中解析嵌入式表达式
Parsing embedded expressions in 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
但它需要一个完整的文件,我找不到任何文档似乎与此用例相关。
您需要调用 CSharpSyntaxTree.ParseText()
,并使用 SourceCodeKind.Interactive
传递 CSharpParseOptions
,这允许顶级表达式。
看起来这个功能在 Roslyn 的一些预览版本中可用,但同时在 1.0 版本中被搁置了。
交互式 (REPL) 和脚本支持计划在 1.1 中回归,如 interactive design meeting notes@github.
中所示
编辑: 事实上,在 latest pre-release NuGet package 中,再次可以将 SourceCodeKind.Interactive
传递给 ParseText
。
SyntaxFactory.ParseExpression()
对我有用。
我正在尝试为类似 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
但它需要一个完整的文件,我找不到任何文档似乎与此用例相关。
您需要调用 CSharpSyntaxTree.ParseText()
,并使用 SourceCodeKind.Interactive
传递 CSharpParseOptions
,这允许顶级表达式。
看起来这个功能在 Roslyn 的一些预览版本中可用,但同时在 1.0 版本中被搁置了。
交互式 (REPL) 和脚本支持计划在 1.1 中回归,如 interactive design meeting notes@github.
中所示编辑: 事实上,在 latest pre-release NuGet package 中,再次可以将 SourceCodeKind.Interactive
传递给 ParseText
。
SyntaxFactory.ParseExpression()
对我有用。