Об'єднати 2 державних машини?

Я хочу отримати від останньої поради з цього форуму, повторно виконавши свій проект за допомогою логіки 'state machine', якщо це можливо, щоб зменшити витрачений час роботи процесора та використання змінних.

Я починаю з машини штату Ніг Гаммона для обробки вхідного сигналу з послідовного порту , наприклад, http://www.gammon.com.au/statemachine , яка показує всі різні можливі комбінації для всіх спеціальних "подій" контрольного характеру відносно всіх можливих станів машини - по суті, 2-мірна сітка.

Я покращив свою мету до обробки послідовного вводу у форматі " команди [параметри] [параметри] ", аналогічно формату командного рядка DOS, наприклад: DIR "c : \ файли програми "/ w/s . Це звільнить мене від необхідності введення великої рядки Buffer [] і Header [] і уникає будь-якого синтаксичного аналізу

Тому мої символи управління події - це простір, кома, одна цитата, подвійна цитата, коса праворуч, Carraige Return, а мої "стани" - це NULL, COMMAND, PARAMETER, OPTIONS

Статус OPTIONS додає символи до тимчасового рядка [], доки розділ кома або пробіл або повернення Carraige призводить до того, що цю опцію буде оброблено відповідно, можливо зберегти його значення до визначеної змінної.

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

Таким чином, існує інша державна машина, необхідна для NoQuotes, SingleQuotes та DoubleQuotes , щоб змінити роботу станів COMMAND, PARAMETER та OPTIONS.

Саме тут я вибігаю з нейронів, тому що все, що я бачу, - це неможливо складна 3-мірна сітки з 2-машинною статтею з надто великою кількістю перестановок.

Але я підозрюю, що має бути дуже практичний спосіб здійснити це, оскільки він лежить в основі практично всіх утиліт командного рядка, що належать до того часу, коли доступність процесора та доступ до пам'яті була меншою, ніж курячі зуби, а ці старі команди DOS, лінійні утиліти повинні бути якомога мімічні, як це було можливо, включаючи їх аналіз командного рядка.

Чи може хто-небудь запропонувати здійснену модель (машинний стан або інше) для отримання формату командного рядка з введення?

UPDATE

О, дорогая ... Я тільки що бачив інше ускладнення, яке я раніше не помічав, тобто варіанти "/" не обов'язково завжди в кінці, а це означає, що за винятком випадків, коли параметри змінюються за допомогою функції carraige-return, варіанти стану зміна розділювачем повинна повертатися до стану перед тим, як зміниться варіант зміни стану (п-е, я сподіваюсь, що це має сенс). У будь-якому разі, я думаю, що це знову до складу дошки, тому що цей підхід, здається, занадто складний, як вже було сказано 2 відповіді.

1
Це дуже питання Arduino, тому що я хочу прочитати вхідний серіал і сортувати його в команду плюс необов'язковий параметр плюс необов'язкові параметри керування, тому згадування командного рядка DOS було просто прикладом синтаксису потрібного формату серіалу.
додано Автор R.M., джерело
Для будь-яких локальних "команд" та "параметрів, які програма запрограмована для вхідного серіалу, наприклад:" LED1 ON "або" IRSEND "NEC 0xFFEE9123 32". Варіанти для додаткового передавання керуючої інформації arduino-to-arduino, наприклад/c (hecksum) = nnn,/l (ength) = nnn,/s (ource) = nnn та ін. Ідея полягає у читанні вхідного серійного а байт за один раз і відправляти на команду або параметри або параметри на льоту, а не на необхідність проаналізувати додатковий великий буферний рядок після.
додано Автор R.M., джерело
Загальний спосіб передачі взаємодіючих станів полягає у розширенні взаємодії у власній державі. тобто PARAMETER vs. SingleQuotes_PARAMETER DoubleQuotes_PARAMETER, де їхня обробка може поділитися майже тим самим кодом. Див github.com/Traumflug/Teacup_Firmware/blob/master/gcode_parse‌ .c для великого прикладу. Крім того, це занадто широке (ви не маєте синтаксису для нас), і це дійсно не є темою для форуму, орієнтованого на Arduino.
додано Автор Dave X, джерело
Інший спосіб думати про нього як про державну машину полягає в тому, що стан вашої держави є багатомірним вектором змінних стану з {COMMAND, PARAMETER [], OPTIONS [] та ін ...)
додано Автор Dave X, джерело
Якийсь загальний синтаксис DOS або набагато більш обмежений синтаксис для певної команди? За допомогою певної команди існує лише обмежена кількість параметрів і параметрів, а ваш/parser/state machine може сортувати їх у змінних/process/state трохи, як це робить Teacup.
додано Автор Dave X, джерело
Я думаю, що ви не можете відправити команду, поки не буде проаналізовано останній символ останнього варіанту - так, COMMAND, PARAMETERS та OPTIONS повинні бути лише вектором параметрів для наступного етапу обробки. Потрібно їх зібрати, перш ніж перейти. Чи є "LED1" в "LED1 ON" командою? /// Для вашого оновленого Q '\ n' стан системи змінюється шляхом аналізу байтів на очищення стану параметра та виконання команди команди state/oneshot, наприклад, github.com/Traumflug/Teacup_Firmware/blob/master/… на # 390.
додано Автор Dave X, джерело

2 Відповіді

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

3
додано
Ви також можете розглянути як середню точку, універсальний аналізатор, який може обробляти різні типи вводу, але відокремлений від основного SM. Ви краще знатимете, як тільки ви швидко наберете декілька ієрархів SM (це "ескіз", як у "колах і стрілках", а не як "кодування").
додано Автор caryden, джерело
Я думаю, що розумію (напевно, пізно, щоб уникнути божевілля, хоча я думаю, що державна машина вже моношукала мою голову). Як ви кажете, використовуйте NULL, COMMAND, PARAMETER як ті, що потрібно змінювати. І навіть незважаючи на те, що NoQuotes, SingleQuotes, Double-Quotes та, можливо, параметри можуть виправдовувати саму машину стану, краще всього розглядати їх як окремі процеси в основній державній машині.
додано Автор R.M., джерело

Особисто я не думаю, що Нік порадив зробити синтаксичний аналіз командного рядка за допомогою державної машини. Його приклад полягає у зміні державної машини на основі введення командного рядка.
Я написав кілька аналізаторів командного рядка, і я ніколи не використовував державну машину для цього. Я б не радив використовувати державну машину для цього.
Простий аналіз рядків набагато простіше.

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
додано
Я думав, що мої потреби такі ж, як приклад Nicks - щоб прочитати вхідний послідовний байт за раз і відправити команду або параметри або параметри на муху, після чого діє їх відповідним чином після прочитання повернення carraige, а не тоді, коли потрібно проаналізувати додатковий великий буферний рядок після. Але ніякого сенсу я не знімаю для Місяця - ви згадали про аналізатор командного рядка раніше ... чи буде у вас відповідна блок-схема або алгоритм?
додано Автор R.M., джерело
Я б не радив би йти байтом. Я радив би йти по лінії по черзі.
додано Автор jantje, джерело