de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Electroguard
Electroguard
Вопрос

Объединение 2 государственных машин?

Я хочу получить последние советы от этого форума, повторно выполнив мой проект, используя логику «государственного аппарата», если это возможно, чтобы уменьшить потраченное время процессора и использование переменных.

Я начинаю с конечного автомата Nick Gammons для обработки ввода из последовательного порта 'example http://www.gammon.com.au/statemachine , в котором показаны все возможные комбинации для всех событий специального управляющего символа против всех возможных состояний машины - по существу, двухмерной сетки.

Я уточнил свою цель для обработки последовательного ввода в формате команды [параметры] [параметры] ", аналогично формату командной строки DOS, например: DIR" c : \ program files "/ w/s . Это освободило бы меня от необходимости больших строк Buffer [] и Header [] и избегало любого синтаксического анализа,

Поэтому мои символы управления событиями - это пробел, запятая, одинарная кавычка, двойная кавычка, форвард-слэш, возврат Carraige и мои «состояния» NULL, COMMAND, PARAMETER, OPTIONS

Состояние OPTIONS добавляет символы в временную строку [] до тех пор, пока разделитель запятой или пробела или Carraige Return не запустит эту опцию, возможно, сохранив ее значение для распознанной переменной.

Команды «COMMAND» и «PARAMETER» добавляют символы к их соответствующим командам [] и параметрам [], включая специальные управляющие символы, если они содержатся в одиночных или двойных кавычках (тем самым разрешая кавычки как часть строки, если они используются в паре другого типа).

Таким образом, для NoQuotes, SingleQuotes и DoubleQuotes требуется вторая машина состояний, чтобы изменить работу состояний COMMAND, PARAMETER и OPTIONS.

Это то место, где у меня заканчиваются нейроны, потому что все, что я вижу, - это невероятно сложная трехмерная сетка с двумя машинами и слишком много возможных перестановок.

Но я подозреваю, что должен быть очень практичный способ реализовать это, потому что он лежит в основе почти всех утилит командной строки, относящихся ко времени, когда мощность процессора и доступность памяти были скуднее, чем зубы кур, и те старые команды DOS, линейные утилиты должны быть как можно меньше, в том числе их синтаксический анализ в командной строке.

Так может ли кто-нибудь предложить допустимую модель (машинное состояние или иначе) для получения формата ввода из командной строки?

ОБНОВИТЬ

О, боже ... Я только что видел еще одно осложнение, которое я раньше не заметил, а это значит, что опции «/» необязательно всегда в конце, а это означает, что, если состояние параметров изменяется с помощью carraige-return, состояние параметров изменение разделителем должно вернуться к состоянию до изменения состояния опций (на мой взгляд, это имеет смысл). Во всяком случае, я думаю, что он вернулся к чертежной доске, потому что этот подход кажется слишком сложным, как уже предлагают два ответа.

1 2016-03-10T10:33:45+00:00 2
 Electroguard
Electroguard
Редактировал вопрос 10-го марта 2016 в 2:52
Arduino
serial
programming
jantje
10-го марта 2016 в 2:02
2016-03-10T14:02:51+00:00
Дополнительно
Источник
Редактировать
#56788728

Лично я не думаю, что Ник посоветовал провести синтаксический анализ строки в командной строке с помощью конечного автомата. Его пример - об изменении конечного автомата на основе ввода командной строки.
Я написал некоторые синтаксические анализаторы командной строки, и я никогда не использовал конечный автомат для этого. Я бы не советовал использовать конечный автомат для этого.
Простой синтаксический анализ строк намного проще.

Edit To answer the remark below:
I would not advice to go byte by byte. I'd advice to go the line by line way. I have written a library to do read line by line and an article on how that one works. http://blog.baeyens.it/#post16
Here a link to the lib https://github.com/jantje/libraries/tree/master/SerialCommunicator.
Here is a parcing code example. It is not so interesting for you as I have it done in a stage by stage way in a very high level way of coding. https://github.com/jantje/libraries/blob/master/SerialBridgeCommunicator/SerialBridgeCommunicator.cpp#L21

Basically the algorithm is=
1 Take the first word;
2 identify the word.
3 If the command is complete ->do it
else Send the rest of the string to a specialized piece of code. (which has the same algorithm)










3
0
caryden
10-го марта 2016 в 2:09
2016-03-10T14:09:50+00:00
Дополнительно
Источник
Редактировать
#56788729

Предложение: - не пытайтесь «мухнуть» (это технический термин!) Государственную хирархию вниз на одну большую плоскую машину состояний. Таким образом, безумие. Храните свой конечный автомат {NULL, COMMAND, PARAMETER, OPTIONS}, например, и где вам нужно что-то большее, чем простая коллекция строк в одном из этих состояний, вызовите синтаксический анализатор SM, соответствующий виду (типам) ввода, который вы ожидаете в эта точка - число, строка с кавычками, спецификатор опций и т. д.

3
0
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 1 день назад
2
Hideo Nakagawa
Зарегистрирован 2 дня назад
3
Sergiy Tytarenko
Зарегистрирован 4 дня назад
4
shoxrux azadov
Зарегистрирован 6 дней назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
arduino.stackexchange.com
под лицензией cc by-sa 3.0 с атрибуцией