реклама на сайте
подробности

 
 
> Поиск команды в массиве данных
interrupt
сообщение Dec 3 2015, 19:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-02-08
Пользователь №: 35 466



Такая задача. Контроллер принимает по UART некоторые данные в виде строк разной длины и содержания. Т.е. обычные текстовые строки. В этих строках может содержаться команда для контроллера, например: Switсh on out 7, input 1 disable, Led 11 on.
Строки хранятся до разбора в массиве. Размер массива ограничен, а частота поступления новых строк не нормируется. Поэтому нужно быстро разобрать строку, вычленить из нее ключевые слова и передать соответствующие команды основной программе. Задача усложняется тем, что таких слов будет около 100, кроме того, в будущем их кол-во предполагается увеличить.
Как реализуется обычно такая задача? Ничего умнее, как последовательный поиск каждого слова в строке придумать не могу. Но это очень долго получается. Например, сначала придется пролистать весь массив в поисках "Led", потом опять весь массив в поисках "input" и т.д. А хочется читать строку 1 раз, по пути находя все ключевые слова.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
interrupt
сообщение Dec 3 2015, 21:11
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-02-08
Пользователь №: 35 466



Цитата(CrimsonPig @ Dec 3 2015, 23:55) *
Ну, для начала надо взять большой листок бумаги и разрисовать машину состояний, которая будет обрабатывать ваши ключевые слова.
Например, команда "Switch on out 1" правильная, а "Switch 1 on out" неправильная, я надеюсь. sm.gif То есть при приеме токена "switch" следующим токеном должен быть "on" или "off" итп.
Если вы начнете кодить не имея полного формального описания автомата разбора, ничего не получится.

После того, как разбор кое-как заработеет, можно уже наворачивать фичи для улучшения производительности, типа считать хэши тогенов из входного потока, и искать их в хэш-таблице известных ключевых слов. Если повезет, можно истпользовать perfect hash.

А вот потом начнется самое интересное sm.gif Тестирование sm.gif А то в ваш парзер придет строка "led -1 fuck off" и он зависнет в бесконечном цикле sm.gif


Ну примитивный разбор работает. Т.е. я просматриваю строку в поисках "Switch". Далее смотрю уже "off" или "on", далее объект "out", потом номер.
Далее приходится снова просматривать всю строку в поисках "timer" -> номер таймера -> команда.

Необходимо оптимизировать именно начальный поиск (а оп аналогии и разветвления так же). Ну например, просматриваю строку. Первая буква "S" - таких команд 10. Вторая "w" - таких команд 5. Третья "i" - таких команд 1. Проверяю, действительно ли это она ну и смотрю ее параметры.
Далее нахожу разделитель, например ",". После нее 1-я буква "L" - 20 команд, 2-я "e" - 2 команды, ну и т.п. Т.е. обработка всей строки за 1 проход.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- interrupt   Поиск команды в массиве данных   Dec 3 2015, 19:32
- - Александр77   Если есть возможность повлиять на формирование сам...   Dec 3 2015, 19:50
- - interrupt   Да в общем-то все данные получаются значимыми. Про...   Dec 3 2015, 20:10
|- - CrimsonPig   Цитата(interrupt @ Dec 3 2015, 20:10) Да ...   Dec 3 2015, 20:55
- - gerber   Можно составить статический связный список соответ...   Dec 3 2015, 22:19
- - jcxz   Цитата(interrupt @ Dec 4 2015, 01:32) Так...   Dec 4 2015, 03:34
- - Dog Pawlowa   Я бы задумался над постановкой задачи, ибо в ней п...   Dec 4 2015, 07:00
|- - jcxz   Цитата(Dog Pawlowa @ Dec 4 2015, 13:00) Я...   Dec 4 2015, 07:53
- - psL   вот проект. решает аналогичную задачу. может приго...   Dec 4 2015, 09:18
- - interrupt   Ввод может быть как человеком, так и внешним устр-...   Dec 4 2015, 09:30
|- - Lmx2315   Может упростить задачу? Писать примерно так : ...   Dec 4 2015, 09:37
- - interrupt   Цитата(psL @ Dec 4 2015, 12:18) вот проек...   Dec 4 2015, 09:54
- - XVR   Вам подойдет поиск по Регулярным Выражениям. Из вс...   Dec 4 2015, 10:24
|- - CrimsonPig   Цитата(XVR @ Dec 4 2015, 10:24) Вам подой...   Dec 4 2015, 10:27
|- - XVR   Цитата(CrimsonPig @ Dec 4 2015, 13:27) а ...   Dec 4 2015, 10:45
|- - CrimsonPig   Цитата(XVR @ Dec 4 2015, 10:45) Видимо ну...   Dec 4 2015, 10:52
- - interrupt   Цитата(Lmx2315 @ Dec 4 2015, 12:37) Может...   Dec 4 2015, 10:25
- - MrYuran   AT команды   Dec 4 2015, 10:26
|- - Tarbal   Цитата(MrYuran @ Dec 4 2015, 13:26) AT ко...   Dec 4 2015, 12:30
- - interrupt   За советы спасибо. По поводу скорости. Обмен идет...   Dec 4 2015, 11:56
|- - XVR   Цитата(interrupt @ Dec 4 2015, 14:56) Как...   Dec 4 2015, 12:39
|- - interrupt   Цитата(XVR @ Dec 4 2015, 15:39) Trie дере...   Dec 4 2015, 13:17
|- - Harvester   Цитата(interrupt @ Dec 4 2015, 16:17) Пох...   Dec 19 2015, 11:26
- - ДЕЙЛ   Цитата(interrupt @ Dec 3 2015, 23:32) Так...   Dec 18 2015, 22:18
- - SlavaV   привет, особо не вдавался в советы форумчан (проч...   Dec 19 2015, 13:22


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th August 2025 - 03:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.02219 секунд с 7
ELECTRONIX ©2004-2016