Mercurial > pub > ImplabNet
view Implab/Parsing/IAlphabet.cs @ 159:5558e43c79bb v2
minor fix
author | cin |
---|---|
date | Thu, 18 Feb 2016 16:06:14 +0300 |
parents | 130781364799 |
children | 2a8466f0cb8a |
line wrap: on
line source
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Implab.Parsing { /// <summary> /// Алфавит. Множество символов, которые разбиты на классы, при этом классы имеют непрерывную нумерацию, /// что позволяет использовать их в качестве индексов массивов. /// </summary> /// <remarks> /// <para>Алфавит является сюрьективным отображением множества символов в множество индексов, это позволяет сократить размер таблицы переходов автомата /// для входных символов, которые для него не различимы.</para> /// <para>Далее символами алфавита будем называть классы исходных символов.</para> /// </remarks> /// <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); } }