Domain-Specific Language and C#
От: sourcerer Германия  
Дата: 20.05.16 08:27
Оценка:
Возникла необходимость с одной стороны брать JSON и конвертить его в код на C# (не чистый код на Шарпе, а в код дополнительных библиотек, с собственным набором методов) Вопрос — чем? Отсмотрены ANTLR и JetBrains MPS. Может быть у кого-нибудь был опыт использования обоих инструментов, что показалось более удобным?
Спасибо.
Недостатки прощаются, достоинства — никогда.
Re: Domain-Specific Language and C#
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 20.05.16 09:51
Оценка: +1
Здравствуйте, sourcerer, Вы писали:

S>Вопрос — чем? Отсмотрены ANTLR и JetBrains MPS. Может быть у кого-нибудь был опыт использования обоих инструментов, что показалось более удобным?

Я использовал только первый и то ограниченно, но мне кажется в вашем случае оба инструменты избыточны.

Как я вас понял, вы хотите реализовать так называемый внешний DSL, а в качестве выхода — код на C# (ну и инструментарий — .Net). Так?
Ваш DSL основан на JSON, поэтому нет необходимости в разборе языка — можно взять готовый парсер. Он вам даст модель, которую описывает ваш DSL, в виде строго типизированных объектов.
Поэтому вам останется только сгенерировать код.
Тут уже смотрите сами, что вам ближе:
Re[2]: Domain-Specific Language and C#
От: Sinix  
Дата: 20.05.16 09:58
Оценка:
Здравствуйте, Михаил Романов, Вы писали:


МР>Roslyn ... Может сейчас есть более простое API).


Есть, но для относительно простых случаев. И только если инъекция произвольного кода не страшна. Достаточно сгенерить код (например, тупым replace, или движком типа razor/t4) и отдать в scripting API.
Re[3]: Domain-Specific Language and C#
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 20.05.16 10:21
Оценка: 21 (1) +1
Здравствуйте, 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());

Может и не слишком много, всё равно как-то не весело.
Самое главное — найти нужную конструкцию получалось только активным поискам по всем сайтам.
Re[4]: Domain-Specific Language and C#
От: Sinix  
Дата: 20.05.16 11:01
Оценка:
Здравствуйте, Михаил Романов, Вы писали:


МР>Нет, я наверное нечетко выразился. Я имел в виду попытаться использовать Roslyn как замену CodeDOM — т.е. не для исполнения, а для генерации исходного кода

А, в этом смысле. Не-не-не, нафиг-нафиг такой ужас. С ним только через quoter от Кирилла Осенкова работать можно.

Вроде как были попытки энтузиастов сделать более простое API, но видать заглохли — гугл ничего толкового не находит.
Re[2]: Domain-Specific Language and C#
От: sourcerer Германия  
Дата: 20.05.16 11:23
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, sourcerer, Вы писали:


S>>Вопрос — чем? Отсмотрены ANTLR и JetBrains MPS. Может быть у кого-нибудь был опыт использования обоих инструментов, что показалось более удобным?

МР>Я использовал только первый и то ограниченно, но мне кажется в вашем случае оба инструменты избыточны.

Дело в том, что этот пример, только часть статического описания системы — там еще динамика, которую нужно из модели в код превращать.
Так что требуется таки полноценная система, но вот с помощью какого инструмента — вопрос.
Недостатки прощаются, достоинства — никогда.
Re[3]: Domain-Specific Language and C#
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 20.05.16 11:26
Оценка: +1
Здравствуйте, sourcerer, Вы писали:

S>Дело в том, что этот пример, только часть статического описания системы — там еще динамика, которую нужно из модели в код превращать.

S>Так что требуется таки полноценная система, но вот с помощью какого инструмента — вопрос.
Ну так вы опишите всю задачу. А то по исходному описанию выглядит одно, а на деле — другое.
В каком виде вы собираетесь описывать динамику?
Попробуйте (если это не секоетно) привести пример файла, который на входе, и что должно примерно получиться на выходе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.