Здравствуйте, Sinix, Вы писали: S>Есть, но для относительно простых случаев. И только если инъекция произвольного кода не страшна. Достаточно сгенерить код (например, тупым replace, или движком типа razor/t4) и отдать в scripting API.
Нет, я наверное нечетко выразился. Я имел в виду попытаться использовать Roslyn как замену CodeDOM — т.е. не для исполнения, а для генерации исходного кода
Например, чтобы получить вот такой фрагмент:
namespace Company
{
class MyClass
{
string _a;
public string A
{
get
{
return this._a;
}
set
{
this._a = (value);
}
}
}
}
Пришлось написать вот такой ужас:
Портянка кода
var workspace = new AdhocWorkspace();
var generator = SyntaxGenerator.GetGenerator(workspace,
LanguageNames.CSharp);
var unit = generator.CompilationUnit(
generator.NamespaceDeclaration(
"Company",
generator.ClassDeclaration(
"MyClass",
members: new SyntaxNode[]
{
generator.FieldDeclaration(
"_a",
generator.TypeExpression(SpecialType.System_String)),
generator.PropertyDeclaration(
"A",
generator.TypeExpression(SpecialType.System_String),
accessibility: Accessibility.Public,
getAccessorStatements:
new SyntaxNode[] {
generator.ReturnStatement(
generator.MemberAccessExpression(
generator.ThisExpression(),
"_a"))
},
setAccessorStatements:
new SyntaxNode[] {
generator.AssignmentStatement(
generator.MemberAccessExpression(
generator.ThisExpression(),
"_a"),
generator.IdentifierName("value"))
})
}))
).NormalizeWhitespace();
Console.WriteLine(unit.ToFullString());
Может и не слишком много, всё равно как-то не весело.
Самое главное — найти нужную конструкцию получалось только активным поискам по всем сайтам.
Здравствуйте, sourcerer, Вы писали:
S>Вопрос — чем? Отсмотрены ANTLR и JetBrains MPS. Может быть у кого-нибудь был опыт использования обоих инструментов, что показалось более удобным?
Я использовал только первый и то ограниченно, но мне кажется в вашем случае оба инструменты избыточны.
Как я вас понял, вы хотите реализовать так называемый внешний DSL, а в качестве выхода — код на C# (ну и инструментарий — .Net). Так?
Ваш DSL основан на JSON, поэтому нет необходимости в разборе языка — можно взять готовый парсер. Он вам даст модель, которую описывает ваш DSL, в виде строго типизированных объектов.
Поэтому вам останется только сгенерировать код.
Тут уже смотрите сами, что вам ближе:
Руками через StringBuilder
Какой-нибудь шаблонизатор (для генерации кода сейчас чаще используют T4, но можно и CodeSmith, и Razor, и любой вам знакомый)
CodeDOM — довольно муторная штука, но есть сильно облегчающие жизнь обертки типа linq2codedom
Roslyn — это, конечно, самая современная, но, имхо, самая не подходящая для таких целей библиотека (ну по состоянию на год назад, построить там даже простое дерево кода было — "много раз убиться веником". Может сейчас есть более простое API).
Здравствуйте, sourcerer, Вы писали:
S>Дело в том, что этот пример, только часть статического описания системы — там еще динамика, которую нужно из модели в код превращать. S>Так что требуется таки полноценная система, но вот с помощью какого инструмента — вопрос.
Ну так вы опишите всю задачу. А то по исходному описанию выглядит одно, а на деле — другое.
В каком виде вы собираетесь описывать динамику?
Попробуйте (если это не секоетно) привести пример файла, который на входе, и что должно примерно получиться на выходе.
Возникла необходимость с одной стороны брать JSON и конвертить его в код на C# (не чистый код на Шарпе, а в код дополнительных библиотек, с собственным набором методов) Вопрос — чем? Отсмотрены ANTLR и JetBrains MPS. Может быть у кого-нибудь был опыт использования обоих инструментов, что показалось более удобным?
Спасибо.
МР>Roslyn ... Может сейчас есть более простое API).
Есть, но для относительно простых случаев. И только если инъекция произвольного кода не страшна. Достаточно сгенерить код (например, тупым replace, или движком типа razor/t4) и отдать в scripting API.
МР>Нет, я наверное нечетко выразился. Я имел в виду попытаться использовать Roslyn как замену CodeDOM — т.е. не для исполнения, а для генерации исходного кода
А, в этом смысле. Не-не-не, нафиг-нафиг такой ужас. С ним только через quoter от Кирилла Осенкова работать можно.
Вроде как были попытки энтузиастов сделать более простое API, но видать заглохли — гугл ничего толкового не находит.
Здравствуйте, Михаил Романов, Вы писали:
МР>Здравствуйте, sourcerer, Вы писали:
S>>Вопрос — чем? Отсмотрены ANTLR и JetBrains MPS. Может быть у кого-нибудь был опыт использования обоих инструментов, что показалось более удобным? МР>Я использовал только первый и то ограниченно, но мне кажется в вашем случае оба инструменты избыточны.
Дело в том, что этот пример, только часть статического описания системы — там еще динамика, которую нужно из модели в код превращать.
Так что требуется таки полноценная система, но вот с помощью какого инструмента — вопрос.