Перейти к содержанию
    

Движок для исполнения пользовательского скрипта.

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

 

а логические операции внутри арифметики - это как?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 minutes ago, jenya7 said:

flex+bison? они не идут в виде готовых тулзов. или я не там смотрю?

Идут. Вам на каком хосте (Win или Linux)?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, _pv said:

ну а если не хочется каждый раз строку интерпретировать, можно "скомпилировать" в промежуточный байт-код https://github.com/rswier/c4

кстати интересно и очень поучительно.  но нужно переделывать под мои нужды. и я даже не представляю как.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 minutes ago, jenya7 said:

кстати интересно и очень поучительно.  но нужно переделывать под мои нужды. и я даже не представляю как.

C-interpreter под ваши нужды явный overkill (кстати как и pawn)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, какие операции присваивания в THEN части ожидаются? (Пока есть 3 штуки:  =, +=, -=)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, jenya7 сказал:

пример очень примитивный. он по сути не обращается к переменным напрямую.

А Вам принципиально обращаться из ВМ к внешней переменной (PWM1+=100) вместо вызова внешней функции (addPWM1(100);) ? Без этого условия, используя только приведённый пример можно прикрутить pawn к вашему проекту с учётом всех вышеприведённых хотелок. Это можно за полчаса с перекурами сделать, обсуждение уже дольше длится. Или в первом посте ошибка и вместо задачи:

10 часов назад, jenya7 сказал:

Мне нужно исполнять скрипт. 

Пользователь передает его в микроконтролер, скрипт сохраняется (в FLASH) и исполняется.

следует читать "мне нужно написать свой интерпретатор с нуля, не используя готовые решения" ? А с учётом:

4 часа назад, jenya7 сказал:

да конечно. почему бы не компилить скрипт на хосте. это наверное даже лучше. 

вы ещё хотите "и компилятор в байт-код свой написать"? (Кстати, с pawn тогда у Вас ещё и готовая Pawn IDE есть для удобного написания скриптов на хосте есть).

Если всё-таки хотите потратить много своего времени на написание и отладку, можете ещё это посмотреть: Синтаксический анализатор математических выражений

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, xvr said:

Кстати, какие операции присваивания в THEN части ожидаются? (Пока есть 3 штуки:  =, +=, -=)

только эти. но выражение может быть более сложным VAR1=VAR2+VAR3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начнём с байт-кода. Команды будут состоять из однобайтового кода операции и до 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 свободных опкодов для других операций (например для битовых операций, если захотите)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, xvr said:

Начнём с байт-кода. Команды будут состоять из однобайтового кода операции и до 4х опциональных байтов (в зависимости от опкода).

Интерпретатор байт-кода работает со стеком выражений (32х битные целые числа со знаком)

 

 

а что значит vvvvv - индекс переменной (0-30) ?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jenya7 said:

а что значит vvvvv - индекс переменной (0-30) ?

Все переменные, с которыми работает скрипт, перенумерованны, и работа с ними осуществляется по номеру (индексу). При этом первые 30 из них находятся в более привелегированном положении - байт-код для работы с ними на 1 байт короче. Всего поддерживается до 286 переменных.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, xvr сказал:

Этот набор позволяет сделать все ваши хотелки (в том числе и OR в IF, но без скобок для цепочек AND/OR) 

А почему "без скобок"? И есть ли оптимизация выражений?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

А почему "без скобок"?

Для произвольного дерева OR/AND нужны полноценные условные переходы в байт-коде (код будет 'толще'). Для цепочек AND'ов связанных OR'ами достаточно 2х адресов (в 2х специальных регистрах) и набора команд Check* и Jmp

1 hour ago, jcxz said:

И есть ли оптимизация выражений?

Можно сделать ограниченную поддержку константных выражений.

 

Я не планирую делать полноразмерный компилятор (и уж точно не силами jenya7)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...