IAlphabet.cs
60 lines
| 3.8 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r55 | using System; | ||
using System.Collections.Generic; | ||||
using System.Linq; | ||||
using System.Text; | ||||
using System.Threading.Tasks; | ||||
namespace Implab.Parsing { | ||||
/// <summary> | ||||
/// Алфавит. Множество символов, которые разбиты на классы, при этом классы имеют непрерывную нумерацию, | ||||
/// что позволяет использовать их в качестве индексов массивов. | ||||
/// </summary> | ||||
cin
|
r158 | /// <remarks> | ||
/// <para>Алфавит является сюрьективным отображением множества символов в множество индексов, это позволяет сократить размер таблицы переходов автомата | ||||
/// для входных символов, которые для него не различимы.</para> | ||||
/// <para>Далее символами алфавита будем называть классы исходных символов.</para> | ||||
/// </remarks> | ||||
cin
|
r55 | /// <typeparam name="TSymbol">Тип символов.</typeparam> | ||
public interface IAlphabet<TSymbol> { | ||||
/// <summary> | ||||
/// Количество символов в алфавите. | ||||
/// </summary> | ||||
int Count { get; } | ||||
/// <summary> | ||||
/// Добавляет новый символ в алфавит, если символ уже был добавлен, то | ||||
/// возвращается ранее сопоставленный с символом класс. | ||||
/// </summary> | ||||
/// <param name="symbol">Символ для добавления.</param> | ||||
/// <returns>Индекс класса, который попоставлен с символом.</returns> | ||||
int DefineSymbol(TSymbol symbol); | ||||
/// <summary> | ||||
/// Доабвляем класс символов. Множеству указанных исходных символов | ||||
/// будет сопоставлен символ в алфавите. | ||||
/// </summary> | ||||
/// <param name="symbols">Множестов исходных символов</param> | ||||
/// <returns>Идентификатор символа алфавита.</returns> | ||||
int DefineClass(IEnumerable<TSymbol> symbols); | ||||
/// <summary> | ||||
/// Создает карту обратного сопоставления символа алфавита и сопоставленным | ||||
/// ему исходным символам. | ||||
/// </summary> | ||||
/// <returns></returns> | ||||
List<TSymbol>[] CreateReverseMap(); | ||||
/// <summary> | ||||
/// Создает новый алфавит на основе текущего, горппируя его сиволы в более | ||||
/// крупные непересекающиеся классы символов. | ||||
/// </summary> | ||||
/// <param name="newAlphabet">Новый, пустой алфавит, в котором быдут определены классы.</param> | ||||
/// <param name="classes">Множество классов символов текущего алфавита.</param> | ||||
/// <returns>Карта для перехода символов текущего | ||||
/// алфавита к символам нового.</returns> | ||||
int[] Reclassify(IAlphabet<TSymbol> newAlphabet, IEnumerable<ICollection<int>> classes); | ||||
/// <summary> | ||||
/// Преобразует входной символ в индекс символа из алфавита. | ||||
/// </summary> | ||||
/// <param name="symobl">Исходный символ</param> | ||||
/// <returns>Индекс в алфавите</returns> | ||||
int Translate(TSymbol symobl); | ||||
} | ||||
} | ||||