Рефакторинг Cx#
От: WolfHound  
Дата: 16.01.17 23:09
Оценка: +1
В данный момент грамматика Cx# хотя и разбита на несколько модулей представляет собой монолит.
Из-за того, что модули ссылаются друг на друга невозможно удалять/добавлять фичи языка независимо друг от друга.
За исключением модуля Linq который грамотно изолирован от остальной грамматики.
Поэтому предлагаю сделать модуль Core который будет выглядеть примерно вот так:
namespace CSharp
{
  syntax module Core
  {
    using Nitra.Core;
    using Nitra.CStyleComments;

    using CSharp.TokenNames;

    keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;

    [StartRule]
    syntax CompilationUnit = NamespaceMemberDeclaration* !Any;

    extend token IgnoreToken
    {
      | [SpanClass(InlineComment),    ExplicitSpaces] Preprocessor = Start='#' Body=(!NewLineCharacter Any)* End=NewLine?;
    }

    syntax Block    = nl "{" inl Statement* d "}" nl;

    syntax Statement
    {
      | EmbeddedStatement;
    }

    syntax EmbeddedStatement
    {
      | Empty       = ";" nl;
      | Block;
      | ExpressionStatement = Expression ";" nl;
    }

    [DynamicSyntaxExtentionPoint]
    syntax NamespaceMemberDeclaration
    {
    }

    syntax Modifiers = Modifier*;

    syntax Modifier
    {
    }
  }
}

Остальные модули должны ссылаться на этот модуль и те модули от которых непосредственно зависят.
В каждом модуле должна быть строго одна фича.
Например
namespace CSharp
{
  syntax module AsyncAwait
  {
    using CSharp.Core;
    using CSharp.AnonymousFunction;

    keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;

    extend syntax Modifier
    {
      | AsyncMod  = "async"sm;
    }

    extend syntax Expression
    {
      | Lambda_SingleParam2    = "async" sm Name                               sm "=>" sm AnonymousFunctionBody;
      | Lambda_ExplicitParams2 = "async" sm ExplicitAnonymousFunctionSignature sm "=>" sm AnonymousFunctionBody;
      | Lambda_ImplicitParams3 = "async" sm ImplicitAnonymousFunctionSignature sm "=>" sm AnonymousFunctionBody;
      | AnonymousFunction2     = "async" sm "delegate"sm ExplicitAnonymousFunctionSignature? nl "{" inl Statement* d "}";

      | Await                  = "await" sm Expression;                                                // C# 5
    }
  }
}


namespace CSharp
{
  syntax module Unsafe
  {
    using CSharp.Core;

    keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;

    extend syntax Modifier
    {
      | Unsafe    = "unsafe"sm;
    }

    extend syntax Expression
    {
      | StackallocInitializer  = "stackalloc"sm AnyType "[" Expression "]"; // unsafe

      precedence Unary:
      | Addressof              = "&"  Expression;// unsafe
    }

    extend syntax EmbeddedStatement
    {
      | Unsafe      = "unsafe" Block; // unsafe
      | Fixed       = "fixed" sm "(" LocalVariableType sm VariableDeclarators ")"nl IndentedEmbeddedStatement; // unsafe
    }
  }
}

И так далее.

1)Это позволит легко собрать разные версии C#.
2)Это позволит людям иметь в языке только нужные им фичи.
Например, есть две команды одна пишет ядро системы вторая прикладную логику.
Первой команде доверить мощный язык не страшно. А вторая набрана по объявлениям за дёшево.
Первая команда выкидывает из языка всё лишнее (goto, unsafe,...), добавляет в язык прикладные ДСЛ. И отдаёт этот язык второй команде.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Отредактировано 17.01.2017 6:31 VladD2 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.