jenya7 0 15 мая, 2019 Опубликовано 15 мая, 2019 (изменено) · Жалоба 1 hour ago, xvr said: Если есть OR, то финт с одной точкой выхода не пойдёт, увы. Надеюсь, что логические операции внутри арифметики не нужны? в принципе можно и AND обойтись. OR я могу сделать добавлением еще одного выражения вместо IF A1>B1 AND A1-B1>20 OR A2>B2 AND A2-B2>20 THEN C0-=100 AND C1+=100 можно записать IF A1>B1 AND A1-B1>20 THEN C0-=100 AND C1+=100 IF A2>B2 AND A2-B2>20 THEN C0-=100 AND C1+=100 а логические операции внутри арифметики - это как? Изменено 15 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 15 мая, 2019 Опубликовано 15 мая, 2019 · Жалоба 42 minutes ago, jenya7 said: flex+bison? они не идут в виде готовых тулзов. или я не там смотрю? Идут. Вам на каком хосте (Win или Linux)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 15 мая, 2019 Опубликовано 15 мая, 2019 · Жалоба 1 hour ago, xvr said: Идут. Вам на каком хосте (Win или Linux)? Win Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 15 мая, 2019 Опубликовано 15 мая, 2019 · Жалоба Just now, jenya7 said: Win Тогда рекомендую cygwin - https://cygwin.com/ ( https://cygwin.com/setup-x86_64.exe ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 15 мая, 2019 Опубликовано 15 мая, 2019 · Жалоба 1 hour ago, xvr said: Тогда рекомендую cygwin - https://cygwin.com/ ( https://cygwin.com/setup-x86_64.exe ) инсталировал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 15 мая, 2019 Опубликовано 15 мая, 2019 · Жалоба 4 hours ago, _pv said: ну а если не хочется каждый раз строку интерпретировать, можно "скомпилировать" в промежуточный байт-код https://github.com/rswier/c4 кстати интересно и очень поучительно. но нужно переделывать под мои нужды. и я даже не представляю как. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 15 мая, 2019 Опубликовано 15 мая, 2019 · Жалоба 54 minutes ago, jenya7 said: кстати интересно и очень поучительно. но нужно переделывать под мои нужды. и я даже не представляю как. C-interpreter под ваши нужды явный overkill (кстати как и pawn) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 15 мая, 2019 Опубликовано 15 мая, 2019 · Жалоба Кстати, какие операции присваивания в THEN части ожидаются? (Пока есть 3 штуки: =, +=, -=) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 18 15 мая, 2019 Опубликовано 15 мая, 2019 · Жалоба 4 часа назад, jenya7 сказал: пример очень примитивный. он по сути не обращается к переменным напрямую. А Вам принципиально обращаться из ВМ к внешней переменной (PWM1+=100) вместо вызова внешней функции (addPWM1(100);) ? Без этого условия, используя только приведённый пример можно прикрутить pawn к вашему проекту с учётом всех вышеприведённых хотелок. Это можно за полчаса с перекурами сделать, обсуждение уже дольше длится. Или в первом посте ошибка и вместо задачи: 10 часов назад, jenya7 сказал: Мне нужно исполнять скрипт. Пользователь передает его в микроконтролер, скрипт сохраняется (в FLASH) и исполняется. следует читать "мне нужно написать свой интерпретатор с нуля, не используя готовые решения" ? А с учётом: 4 часа назад, jenya7 сказал: да конечно. почему бы не компилить скрипт на хосте. это наверное даже лучше. вы ещё хотите "и компилятор в байт-код свой написать"? (Кстати, с pawn тогда у Вас ещё и готовая Pawn IDE есть для удобного написания скриптов на хосте есть). Если всё-таки хотите потратить много своего времени на написание и отладку, можете ещё это посмотреть: Синтаксический анализатор математических выражений Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 мая, 2019 Опубликовано 16 мая, 2019 · Жалоба 13 hours ago, xvr said: Кстати, какие операции присваивания в THEN части ожидаются? (Пока есть 3 штуки: =, +=, -=) только эти. но выражение может быть более сложным VAR1=VAR2+VAR3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 мая, 2019 Опубликовано 16 мая, 2019 · Жалоба Начнём с байт-кода. Команды будут состоять из однобайтового кода операции и до 4х опциональных байтов (в зависимости от опкода). Интерпретатор байт-кода работает со стеком выражений (32х битные целые числа со знаком) Далее приведены коды операции (в виде идентификатора для enum и битовое представление). Дополнительные обозначения: B - Байт данных W - Слово (16 бит) данных D - 32 бита данных B? - Опциональный байт данных (наличие определяется опкодом) OP_Const0 - 0vvvvvvv - Константа. vvvvvvv - 7ми битовая константа со знаком (от -64 до 63). Если нужны большие по величине консанты - используются опкоды Const2 и Const4 OP_ReadVar - 100vvvvv B? - Чтение переменной на стек. vvvvv - индекс переменной (0-30). Если нужна переменная с индексом более 30, то в качестве индекса задаётся 31 (все единички), а реальный индекс (минус 30) помещается в следующий байт байт-кода OP_SetVar - 101vvvvv B? - Запись переменной со стека. vvvvv -такой же, как в ReadVar OP_AddVar - 110vvvvv B? - Прибавление значения со стека в переменную OP_Const2 - 11100000 W - Константа (16 битов со знаком) OP_Const4 - 11100001 D - Константа (32 бита со знаком) OP_MarkChk - 11100010 W - Смещение от конца данного байт-кода до места передачи управления по командам OP_Check* OP_MarkJmp - 11100011 W - Смещение от конца данного байт-кода до места передачи управления по команде OP_Jmp OP_Jmp - 11100100 - Передача управления на адрес выставленный MarkJmp OP_CheckEQ - 11100101 - Проверка 2 ячеек на верхушке стека на равенство. Передача управления по адресу от команды MarkChk если не равны (числа со стека убираются в любом случае) OP_CheckNE - 11100110 - Проверка 2 ячеек на верхушке стека на неравенство. Передача управления по адресу от команды MarkChk если равны (числа со стека убираются в любом случае) OP_CheckGT- 11100111 - Проверка 2 ячеек на верхушке стека на >. OP_CheckGE- 11101000 - Проверка 2 ячеек на верхушке стека на >=. OP_CheckLT - 11101001 - Проверка 2 ячеек на верхушке стека на <. OP_CheckLE - 11101011 - Проверка 2 ячеек на верхушке стека на <=. OP_Add - 11101100 - Сложение 2х верхних элеметов стека OP_Sub - 11101101 - Вычитание 2х верхних элеметов стека OP_Mul - 11101110 - Умножение 2х верхних элеметов стека OP_Div - 11101111 - Деление 2х верхних элеметов стека OP_Mod - 11110000 - остаток от деления 2х верхних элеметов стека OP_Neg - 11110001 - Инверсия знака верхнего элемета стека OP_Stop - 11111111 - Завершение интерпретации Этот набор позволяет сделать все ваши хотелки (в том числе и OR в IF, но без скобок для цепочек AND/OR) И есть ещё 14 свободных опкодов для других операций (например для битовых операций, если захотите) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 мая, 2019 Опубликовано 16 мая, 2019 (изменено) · Жалоба 1 hour ago, xvr said: Начнём с байт-кода. Команды будут состоять из однобайтового кода операции и до 4х опциональных байтов (в зависимости от опкода). Интерпретатор байт-кода работает со стеком выражений (32х битные целые числа со знаком) а что значит vvvvv - индекс переменной (0-30) ? Изменено 16 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 мая, 2019 Опубликовано 16 мая, 2019 · Жалоба 1 minute ago, jenya7 said: а что значит vvvvv - индекс переменной (0-30) ? Все переменные, с которыми работает скрипт, перенумерованны, и работа с ними осуществляется по номеру (индексу). При этом первые 30 из них находятся в более привелегированном положении - байт-код для работы с ними на 1 байт короче. Всего поддерживается до 286 переменных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 16 мая, 2019 Опубликовано 16 мая, 2019 · Жалоба 1 час назад, xvr сказал: Этот набор позволяет сделать все ваши хотелки (в том числе и OR в IF, но без скобок для цепочек AND/OR) А почему "без скобок"? И есть ли оптимизация выражений? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 16 мая, 2019 Опубликовано 16 мая, 2019 · Жалоба 1 hour ago, jcxz said: А почему "без скобок"? Для произвольного дерева OR/AND нужны полноценные условные переходы в байт-коде (код будет 'толще'). Для цепочек AND'ов связанных OR'ами достаточно 2х адресов (в 2х специальных регистрах) и набора команд Check* и Jmp 1 hour ago, jcxz said: И есть ли оптимизация выражений? Можно сделать ограниченную поддержку константных выражений. Я не планирую делать полноразмерный компилятор (и уж точно не силами jenya7) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться