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);
}
}