Я пишу программу, которая будет токенизировать текст ввода в зависимости от определенных правил. Для этого я использую C++.Обозначить текст в зависимости от определенных правил. Алгоритм в C++
Правила
Letter 'a' should be converted to token 'V-A'
Letter 'p' should be converted to token 'C-PA'
Letter 'pp' should be converted to token 'C-PPA'
Letter 'u' should be converted to token 'V-U'
Это всего лишь пример, и в режиме реального времени, у меня есть около 500+ правил, как это. Если я предоставляю ввод как 'appu', он должен обозначать как 'V-A + C-PPA + V-U'. Я реализовал алгоритм для этого и хотел убедиться, что я поступаю правильно.
Алгоритм
Все правила будут храниться в файле XML с соответствующим отображением на лексемы. Что-то вроде
<rules>
<rule pattern="a" token="V-A" />
<rule pattern="p" token="C-PA" />
<rule pattern="pp" token="C-PPA" />
<rule pattern="u" token="V-U" />
</rules>
1 - При запуске приложения, прочитайте этот XML-файл и сохранить значения в 'станд :: Карта. Это будет доступно до конца приложения (реализация одноэлементного шаблона).
2 - Итерировать символы ввода текста. Для каждого персонажа найдите совпадение. Если найдено, сделайте более жадным и найдите больше совпадений, взяв следующие символы из входного текста. Сделайте это, пока мы не получим никакого соответствия. Итак, для входного текста 'appu', сначала найдите совпадение для 'a'. Если найдено, попробуйте получить больше совпадений, взяв следующий символ из входного текста. Поэтому он попытается сопоставить «ap» и не нашел совпадений. Поэтому он просто возвращается.
3 - Замените букву «a» на входной текст, поскольку у нас есть токен.
4 - Повторите шаги 2 и 3 с остальными символами в тексте ввода.
Вот более простое объяснение шагов
input-text = 'appu'
tokens-generated=''
// First iteration
character-to-match = 'a'
pattern-found = true
// since pattern found, going recursive and check for more matches
character-to-match = 'ap'
pattern-found = false
tokens-generated = 'V-A'
// since no match found for 'ap', taking the first success and replacing it from input text
input-text = 'ppu'
// second iteration
character-to-match = 'p'
pattern-found = true
// since pattern found, going recursive and check for more matches
character-to-match = 'pp'
pattern-found = true
// since pattern found, going recursive and check for more matches
character-to-match = 'ppu'
pattern-found = false
tokens-generated = 'V-A + C-PPA'
// since no match found for 'ppu', taking the first success and replacing it from input text
input-text = 'u'
// third iteration
character-to-match = 'u'
pattern-found = true
tokens-generated = 'V-A + C-PPA + V-U' // we'r done!
Вопросы
1 - Является ли этот алгоритм выглядит нормально для этой проблемы или есть лучший способ решить эту проблему?
2 - Если это правильный метод, std :: map - хороший выбор здесь? Или мне нужно создать свой собственный контейнер ключей/значений?
3 - Есть ли доступная библиотека, которая может маркировать строку, как указано выше?
Любая помощь будет оценена
:)
Вы принимаете во внимание случай, когда у вас длинный матч, но не короткий? Например, предположим, что у вас нет шаблона «p». Будет ли ваш алгоритм искать шаблон «pp»?Разбор «p» не даст прямого совпадения, но вы должны, тем не менее, продолжить рекурсию. –
Да. Он продолжит рекурсию. –