55
|
1 using System;
|
|
2 using System.Collections.Generic;
|
|
3 using System.Linq;
|
|
4 using System.Text;
|
|
5 using System.Threading.Tasks;
|
|
6
|
|
7 namespace Implab.Parsing {
|
|
8 /// <summary>
|
|
9 /// Алфавит. Множество символов, которые разбиты на классы, при этом классы имеют непрерывную нумерацию,
|
|
10 /// что позволяет использовать их в качестве индексов массивов.
|
|
11 /// </summary>
|
158
|
12 /// <remarks>
|
|
13 /// <para>Алфавит является сюрьективным отображением множества символов в множество индексов, это позволяет сократить размер таблицы переходов автомата
|
|
14 /// для входных символов, которые для него не различимы.</para>
|
|
15 /// <para>Далее символами алфавита будем называть классы исходных символов.</para>
|
|
16 /// </remarks>
|
55
|
17 /// <typeparam name="TSymbol">Тип символов.</typeparam>
|
|
18 public interface IAlphabet<TSymbol> {
|
|
19 /// <summary>
|
|
20 /// Количество символов в алфавите.
|
|
21 /// </summary>
|
|
22 int Count { get; }
|
|
23 /// <summary>
|
|
24 /// Добавляет новый символ в алфавит, если символ уже был добавлен, то
|
|
25 /// возвращается ранее сопоставленный с символом класс.
|
|
26 /// </summary>
|
|
27 /// <param name="symbol">Символ для добавления.</param>
|
|
28 /// <returns>Индекс класса, который попоставлен с символом.</returns>
|
|
29 int DefineSymbol(TSymbol symbol);
|
|
30 /// <summary>
|
|
31 /// Доабвляем класс символов. Множеству указанных исходных символов
|
|
32 /// будет сопоставлен символ в алфавите.
|
|
33 /// </summary>
|
|
34 /// <param name="symbols">Множестов исходных символов</param>
|
|
35 /// <returns>Идентификатор символа алфавита.</returns>
|
|
36 int DefineClass(IEnumerable<TSymbol> symbols);
|
|
37 /// <summary>
|
|
38 /// Создает карту обратного сопоставления символа алфавита и сопоставленным
|
|
39 /// ему исходным символам.
|
|
40 /// </summary>
|
|
41 /// <returns></returns>
|
|
42 List<TSymbol>[] CreateReverseMap();
|
|
43 /// <summary>
|
|
44 /// Создает новый алфавит на основе текущего, горппируя его сиволы в более
|
|
45 /// крупные непересекающиеся классы символов.
|
|
46 /// </summary>
|
|
47 /// <param name="newAlphabet">Новый, пустой алфавит, в котором быдут определены классы.</param>
|
|
48 /// <param name="classes">Множество классов символов текущего алфавита.</param>
|
|
49 /// <returns>Карта для перехода символов текущего
|
|
50 /// алфавита к символам нового.</returns>
|
|
51 int[] Reclassify(IAlphabet<TSymbol> newAlphabet, IEnumerable<ICollection<int>> classes);
|
|
52
|
|
53 /// <summary>
|
|
54 /// Преобразует входной символ в индекс символа из алфавита.
|
|
55 /// </summary>
|
|
56 /// <param name="symobl">Исходный символ</param>
|
|
57 /// <returns>Индекс в алфавите</returns>
|
|
58 int Translate(TSymbol symobl);
|
|
59 }
|
|
60 }
|