2015-02-17 1 views
3

Я пытаюсь написать парсер для языка разметки QML, и я хотел бы разрешить выражения C# в разметке. Так как пример может выглядеть следующим образом:Разбор встроенных выражений в Roslyn

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

(Это также несколько как двигатель Razor ASP.NET, но afaics Бритва не использует Рослин?)

Как мне это сделать? Я хочу разобрать только одно выражение, будь то литерал, вызов метода, лямбда и т. Д. Я пробовал использовать CSharpSyntaxTree.ParseText, но он ожидает целого файла, и я не могу найти документацию, которая, похоже, относится к этому использованию -дело.

ответ

6

Вы должны позвонить CSharpSyntaxTree.ParseText() и передать с SourceCodeKind.Interactive, что позволяет использовать выражения верхнего уровня.

+0

Так просто, спасибо. – Grokys

+0

Действительно ли это работает? Я получаю исключение NotSupportedException, когда передаю параметр SourceCodeKind.Interactive ... – glopes

+0

Хорошо, похоже, что функция была отложена на 1.0. Я добавил разъяснение в качестве ответа для будущих посетителей. – glopes

0

Похоже, эта функция была доступна в некоторых предварительных версиях Roslyn, но в то же время была отложена для версии 1.0.

Интерактивная (REPL) и поддержка Scripting планируется вернуться на 1.1, как видно из interactive design meeting [email protected].

EDIT: В самом деле, в latest pre-release NuGet package это снова можно пройти SourceCodeKind.Interactive к ParseText.

1

SyntaxFactory.ParseExpression() работал для меня.