view Implab/Parsing/IAlphabet.cs @ 160:5802131432e4 v2

fixed regression: race condition in Promise DFA refactoring
author cin
date Thu, 18 Feb 2016 19:38:54 +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);
    }
}