Песочница для отладки механизма сценариев для проекта IoT Manager https://github.com/IoTManagerProject/IoTManager Сценарии позволяют выполнять математические и логические операции с доступными значениями от датчиков в системе и выполнять действия предусмотренные модулями в зависимости от условий. Алгоритм обработки сценариев основан на использовании подхода формирования Abstract Syntax Tree (Абстрактное Синтаксическое Дерево или Дерево Парсинга) на основе лексического и синтаксического анализа текстового представления. Это дает возможность сформировать дерево бинарных объектов для постоянного пересчета параметров с прямым доступ к переменным и функциям системы и модулей без медленного повторного текстового анализа. Код основан на примерах из цикла статей "LLVM Tutorial" https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/LangImpl01.html
Для выполнения тестов достаточно запустить файл run.cmd. Сценарий загрузится и выполнится автоматически из файла scenario.txt. В консоли программа выведет для каждого узла дерева соответствующие значения, по которым можно понять верность выполнения сценария. Замечание: Т.к. данный код будет работать совместно с другой системой, то для отладки существует только одна переменная имитирующая элемент конфигурации IoTManager. Это значит, что любая переменная иил вызов команды будет возвращать всегда одно и тоже значение. Для вызова команды - число 20, для значения переменной - число 0
- Поддерживаются текстовые "строка" и числовые 42 значения констант в тексте. В сценариях существует два типа данных (float и String). Какой тип данных будет иметь переменная или возвращаемое значение функции зависит от модуля, который содержит эти данные.
- Возможно использовать бинарные операции сравнения: ==, !=, <, <=, >, >= , арифметические: +, -, *, / и присваивание =. Деление на ноль возможно, но результат будет большое число. Пока нет скобок для расстановки приоритетов. Но действуют приоритеты для операций:
= - 1;
== - 3; // ==
!= - 4; // !=
<= - 5; // <=
>= - 6; // >=
< - 10;
> - 10;
+ - 20;
- - 20;
/ - 35;
* - 40; // highest.
- Комбинация констант и бинарных операций формирует выражение. Каждое выражение должно заканчиваться точкой с запятой ; если в одном блоке кода {} присутствует несколько выражений.
- Базовый элемент сценария - это конструкция IF () THEN {} ELSE {}. esle - не обязателен, {} - не обязательны для одного выражения.
- После IF должно следовать условие внутри (). В условии могут применяться бинарные операторы, числовые и строковые константы, переменные или вызовы функций.
- После THEN или ELSE могут идти одно выражение или {} для объединения нескольких выражений.
- В выражениях возможно использовать вызовы функций модуля с передачей параметров в формате: ID.ИмяФункции(Параметр1, Параметр2, ...). Параметры могут быть как числовые так и строковые. Число параметров не ограничено и обусловлено возможностями модуля, который отвечает за объект с идентификатором ID. Возможен вызов функции без указания имени. в данной версии возвращаемое значение всегда будет число 20, если не указаны параметры, иначе значение первого параметра
- # - комментарий