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 /// </remarks>
|
55
|
16 /// <typeparam name="TSymbol">Тип символов.</typeparam>
|
|
17 public interface IAlphabet<TSymbol> {
|
|
18 /// <summary>
|
161
|
19 /// Количество классов символов в алфавите.
|
55
|
20 /// </summary>
|
|
21 int Count { get; }
|
161
|
22
|
55
|
23 /// <summary>
|
161
|
24 /// Создает карту обратного сопоставления класса символов алфавита и сопоставленным
|
55
|
25 /// ему исходным символам.
|
|
26 /// </summary>
|
|
27 /// <returns></returns>
|
|
28 List<TSymbol>[] CreateReverseMap();
|
161
|
29
|
55
|
30 /// <summary>
|
|
31 /// Создает новый алфавит на основе текущего, горппируя его сиволы в более
|
|
32 /// крупные непересекающиеся классы символов.
|
|
33 /// </summary>
|
|
34 /// <param name="newAlphabet">Новый, пустой алфавит, в котором быдут определены классы.</param>
|
|
35 /// <param name="classes">Множество классов символов текущего алфавита.</param>
|
161
|
36 /// <returns>Карта для перехода классов текущего
|
|
37 /// алфавита к классам нового.</returns>
|
|
38 /// <remarks>Ползволяет укрупнить алфавит, объединив классы в текущем алфавите. Используется при оптимизации автомата.</remarks>
|
|
39 int[] Reclassify(IAlphabetBuilder<TSymbol> newAlphabet, IEnumerable<ICollection<int>> classes);
|
55
|
40
|
|
41 /// <summary>
|
|
42 /// Преобразует входной символ в индекс символа из алфавита.
|
|
43 /// </summary>
|
|
44 /// <param name="symobl">Исходный символ</param>
|
|
45 /// <returns>Индекс в алфавите</returns>
|
|
46 int Translate(TSymbol symobl);
|
|
47 }
|
|
48 }
|