Я сейчас работаю над генератором сканера.
Генератор уже работает нормально. Но при использовании классов символов алгоритм становится очень медленным.
Генератор сканера производит сканер для файлов в кодировке UTF8. Должен поддерживаться полный диапазон символов (от 0x000000 до 0x10ffff).
Если я использую большие наборы символов, например, оператор any '.' или свойство unicode {L}, nfa (а также dfa) содержит много состояний (> 10000). Таким образом, преобразование nfa в dfa и создание минимального dfa занимает много времени (даже если выходной минимальный dfa содержит только несколько состояний).
Вот моя текущая реализация создания части набора символов nfa.
void CreateNfaPart(int startStateIndex, int endStateIndex, Set<int> characters)
{
transitions[startStateIndex] = CreateEmptyTransitionsArray();
foreach (int character in characters) {
// get the utf8 encoded bytes for the character
byte[] encoded = EncodingHelper.EncodeCharacter(character);
int tStartStateIndex = startStateIndex;
for (int i = 0; i < encoded.Length - 1; i++) {
int tEndStateIndex = transitions[tStartStateIndex][encoded[i]];
if (tEndStateIndex == -1) {
tEndStateIndex = CreateState();
transitions[tEndStateIndex] = CreateEmptyTransitionsArray();
}
transitions[tStartStateIndex][encoded[i]] = tEndStateIndex;
tStartStateIndex = tEndStateIndex;
}
transitions[tStartStateIndex][encoded[encoded.Length - 1]] = endStateIndex;
}
Кто-нибудь знает, как реализовать эту функцию гораздо эффективнее, чтобы создавать только необходимые состояния?
EDIT:
Чтобы быть более точным, мне нужна такая функция:
List<Set<byte>[]> Convert(Set<int> characters)
{
???????
}
Вспомогательная функция для преобразования символа (int) в байт кодировки UTF8 [] определяется как:
byte[] EncodeCharacter(int character)
{ ... }