IndexedAlphabetBase.cs
50 lines
| 1.8 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r162 | using Implab; | ||
using System; | ||||
using System.Collections.Generic; | ||||
using System.Diagnostics; | ||||
using System.Linq; | ||||
namespace Implab.Automaton { | ||||
/// <summary> | ||||
/// Indexed alphabet is the finite set of symbols where each symbol has a zero-based unique index. | ||||
/// </summary> | ||||
cin
|
r167 | /// <remarks> | ||
/// Indexed alphabets are usefull in bulting efficient translations from source alphabet | ||||
/// to the input alphabet of the automaton. It's assumed that the index to the symbol match | ||||
/// is well known and documented. | ||||
/// </remarks> | ||||
cin
|
r176 | public abstract class IndexedAlphabetBase<T> : MapAlphabet<T> { | ||
cin
|
r171 | |||
cin
|
r176 | protected IndexedAlphabetBase() :base(true, null) { | ||
cin
|
r172 | } | ||
cin
|
r162 | public abstract int GetSymbolIndex(T symbol); | ||
/// <summary> | ||||
/// Gets the translation map from the index of the symbol to it's class this is usefull for the optimized input symbols transtaion. | ||||
/// </summary> | ||||
cin
|
r176 | /// <remarks> | ||
/// The map is continous and start from the symbol with zero code. The last symbol | ||||
/// in the map is the last classified symbol in the alphabet, i.e. the map can be | ||||
/// shorter then the whole alphabet. | ||||
/// </remarks> | ||||
cin
|
r162 | /// <returns>The translation map.</returns> | ||
public int[] GetTranslationMap() { | ||||
cin
|
r180 | var map = new Dictionary<int, int>(); | ||
cin
|
r176 | |||
cin
|
r180 | int max = 0; | ||
cin
|
r176 | foreach (var p in Mappings) { | ||
var index = GetSymbolIndex(p.Key); | ||||
max = Math.Max(max, index); | ||||
map[index] = p.Value; | ||||
} | ||||
var result = new int[max + 1]; | ||||
for (int i = 0; i < result.Length; i++) | ||||
map.TryGetValue(i, out result[i]); | ||||
return result; | ||||
cin
|
r162 | } | ||
} | ||||
} | ||||