using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Implab.Parsing { /// /// Алфавит. Множество символов, которые разбиты на классы, при этом классы имеют непрерывную нумерацию, /// что позволяет использовать их в качестве индексов массивов. /// /// /// Алфавит является сюрьективным отображением множества символов в множество индексов, это позволяет сократить размер таблицы переходов автомата /// для входных символов, которые для него не различимы. /// Далее символами алфавита будем называть классы исходных символов. /// /// Тип символов. public interface IAlphabet { /// /// Количество символов в алфавите. /// int Count { get; } /// /// Добавляет новый символ в алфавит, если символ уже был добавлен, то /// возвращается ранее сопоставленный с символом класс. /// /// Символ для добавления. /// Индекс класса, который попоставлен с символом. int DefineSymbol(TSymbol symbol); /// /// Доабвляем класс символов. Множеству указанных исходных символов /// будет сопоставлен символ в алфавите. /// /// Множестов исходных символов /// Идентификатор символа алфавита. int DefineClass(IEnumerable symbols); /// /// Создает карту обратного сопоставления символа алфавита и сопоставленным /// ему исходным символам. /// /// List[] CreateReverseMap(); /// /// Создает новый алфавит на основе текущего, горппируя его сиволы в более /// крупные непересекающиеся классы символов. /// /// Новый, пустой алфавит, в котором быдут определены классы. /// Множество классов символов текущего алфавита. /// Карта для перехода символов текущего /// алфавита к символам нового. int[] Reclassify(IAlphabet newAlphabet, IEnumerable> classes); /// /// Преобразует входной символ в индекс символа из алфавита. /// /// Исходный символ /// Индекс в алфавите int Translate(TSymbol symobl); } }