Глядя на этот код из соседнего сообщения видна излишняя связь между фичами языка.
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 AsyncAwait
{
using CSharp.Core;
keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;
extend syntax Modifier
{
| AsyncMod = "async"sm;
}
extend syntax Expression
{
| Await = "await" sm Expression; // C# 5
}
}
syntax module AsyncAwaitAnonymousFunction
{
using CSharp.Core;
using CSharp.AnonymousFunction;
keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;
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;
}
}
syntax module AsyncAwaitAnonymousDelegate
{
using CSharp.Core;
using CSharp.AnonymousDelegate;
keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;
extend syntax Expression
{
| AnonymousFunction2 = "async" sm "delegate"sm ExplicitAnonymousFunctionSignature? nl "{" inl Statement* d "}";
}
}
}
Но это создаст неудобства пользователям языка.
Людям придётся помнить, что, если они используют модули AsyncAwait и AnonymousFunction им нужно подключить AsyncAwaitAnonymousFunction.
Чтобы избежать этой головной боли можно добавить фичу позволяющую писать так:
namespace CSharp
{
syntax module AsyncAwait
{
using CSharp.Core;
//Это означает импортировать модуль CSharp.AsyncAwaitAnonymousFunction
//только если CSharp.AnonymousFunction уже был импортирован
using CSharp.AsyncAwaitAnonymousFunction when CSharp.AnonymousFunction;
using CSharp.AsyncAwaitAnonymousDelegate when CSharp.AnonymousDelegate;
...
}
}
Технически это реализовать довольно легко.
Но нужно ли?
Кстати вот с этим безобразием
keyword regex ['A'..'Z', 'a'..'z', '_'..'_']+ rule S;
Которое повторяется в каждом модуле нужно что-то сделать.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>