В данный момент грамматика 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>>