Forge
csharp4405de34
1using Eto.Parse;
2
3namespace CascadeIDE.Services.ChordNotation;
4
5/// <summary>
6/// Грамматика Eto.Parse для нотации аккордов. Соответствует EBNF в <c>docs/chord-notation-cascadeide.md</c> (§ EBNF).
7/// </summary>
8internal static class ChordNotationGrammar
9{
10 private static readonly Lazy<Grammar> Lazy = new(Build);
11
12 public static Grammar Instance => Lazy.Value;
13
14 /// <summary>Сборка fluent-грамматики (эквивалент EBNF в документе).</summary>
15 private static Grammar Build()
16 {
17 Parser mod(string s) => s;
18 var modifier =
19 mod("Alt-") | mod("C-") | mod("M-") | mod("A-") | mod("S-") | mod("D-");
20
21 var key = (+Terminals.LetterOrDigit).Named("key");
22
23 var bracketInner = modifier.Repeat(0) & key;
24
25 var bracket = ("<" & bracketInner & ">").Named("bracket");
26
27 var plain = (+Terminals.LetterOrDigit).Named("plain");
28
29 var step = (bracket | plain).Named("step");
30
31 var sp = +Terminals.WhiteSpace;
32
33 var sequence = Terminals.WhiteSpace.Repeat(0) & step & (sp & step).Repeat(0) & Terminals.WhiteSpace.Repeat(0) & Terminals.End;
34
35 return new Grammar("chord_sequence", sequence);
36 }
37}
38
View only · write via MCP/CIDE