Contents
[hide]1 Користувацька мова програмування JavaLikeCalc
1.1 Елементи мови
Ключові слова: if, else, while, for, in, break, continue, return, function, using.
Постійні:
- десяткові: цифри 0-9 (12, 111, 678);
- вісімкові: цифри 0-7 (012, 011, 076);
- шістнадцяткові: цифри 0-9, літери a-f або A-F (0x12, 0XAB);
- реальні: 345.23, 2.1e5, 3.4E-5, 3e6;
- логічні: true, false;
- строкові: "hello", без переходу на наступний рядок однак з підтримкою прямої конкатенації строкових констант.
Типи змінних:
- ціле: -263 ... 263, EVAL_INT(-9223372036854775807);
- реальне: 3.4*10308, EVAL_REAL(-1.79E308);
- логічне: false, true, EVAL_BOOL(2);
- рядок: послідовність символів-байтів (0...255) будь якої довжини, обмеженої об'ємом пам'яті та сховищем у БД; EVAL_STR("<EVAL>").
Вбудовані константи: pi = 3.14159265..., e = 2.71828182..., EVAL_BOOL(2), EVAL_INT(-9223372036854775807), null,EVAL,EVAL_REAL(-1.79E308), EVAL_STR("<EVAL>")
Глобальні атрибути параметрів DAQ (починаючи з підсистеми DAQ та у вигляді {Тип модуля DAQ}.{Об'єкт контролеру}.{Параметр}.{Атрибут}).
Функції та параметри об'єктної моделі OpenSCADA.
Варіанти EVAL (Error VALue) і null опрацьовуються особливо через перетворення одного у інше залежно від використаного базового типу, тобто ви вільні у використанні лише null або EVAL у будь яких випадках.
1.2 Операції мови
Операції, підтримувані мовою, представлено у таблиці нижче. Пріоритет операцій зменшується зверху донизу. Операції з однаковим пріоритетом входять до однієї групи кольору.
Символ | Опис |
() | Виклик функції. |
{} | Програмні блоки. |
++ | Інкремент (пост та пре). |
-- | Декремент (пост та пре). |
- | Унарний мінус. |
! | Логічне заперечення. |
~ | Побітове заперечення. |
* | Множення. |
/ | Ділення. |
% | Залишок від цілочисельного ділення. |
+ | Складання |
- | Віднімання |
<< | Порозрядний зсув ліворуч |
>> | Порозрядний зсув праворуч |
> | Більше |
>= | Більше або дорівнює |
< | Менше |
<= | Менше або дорівнює |
== | Дорівнює |
!= | Не дорівнює |
| | Порозрядне "АБО" |
& | Порозрядне "ТАК" |
^ | Порозрядне "Виключне АБО" |
&& | Логічне "ТАК" |
|| | Логічне "АБО" |
?: | Умовна операція "i=(i<0)?0:i;" |
= | Привласнення. |
+= | Привласнення із складанням. |
-= | Привласнення із відніманням. |
*= | Привласнення із множенням. |
/= | Привласнення із діленням. |
1.3 Вбудовані функції мови
Віртуальною машиною мови передбачено наступний набір вбудованих функцій загального призначення:
- double max(double x, double x1) — максимальне значення із x та x1;
- double min(double x, double x1) — мінімальне значення із x та x1;
- string typeof(ElTp vl) — тип значення vl;
- string tr(string base) — переклад базового base повідомлення.
Для забезпечення високої швидкості роботи у математичних обчисленнях модуль надає вбудовані математичні функції, які викликаються на рівні команд віртуальної машини:
- double sin(double x) — синус x;
- double cos(double x) — косинус x;
- double tan(double x) — тангенс x;
- double sinh(double x) — синус гіперболічний від x;
- double cosh(double x) — косинус гіперболічний від x;
- double tanh(double x) — тангенс гіперболічний від x;
- double asin(double x) — арксинус від x;
- double acos(double x) — арккосинус від x;
- double atan(double x) — арктангенс від x;
- double rand(double x) — випадкове число від 0 до x;
- double lg(double x) — десятковий логарифм від x;
- double ln(double x) — натуральний логарифм від x;
- double exp(double x) — експонента від x;
- double pow(double x, double x1) — зведення x у степінь x1;
- double sqrt(double x) — корінь квадратний від x;
- double abs(double x) — абсолютне значення від x;
- double sign(double x) — знак числа x;
- double ceil(double x) — округлення числа x до більшого цілого;
- double floor(double x) — округлення числа x до меншого цілого.
1.4 Оператори мови
Загальний перелік операторів мови:
- var — оператор ініціалізації змінної; визначення змінної без привласнення значення резервує її зі значенням null-EVAL, що дозволяє здійснити одноразову ініціалізацію складних типів даних на кшталт об'єкту, через пряме порівняння і перевірку із isEVal();
- if — оператор умови "ЯКЩО";
- else — оператор умови "ІНАКШЕ";
- while — визначення циклу "ПОКИ";
- for — визначення циклу "ДЛЯ";
- in — роздільник циклу "ДЛЯ" для перебору властивостей об'єкту;
- break — переривання виконання циклу;
- continue — продовжити виконання циклу з початку;
- function — визначення внутрішньої функції;
- using — дозволяє встановити простір видимості зовнішніх функцій часто використовної бібліотеки (using Special.FLibSYS;) для наступного звернення тільки за назвою функції, не має ефекту для об'єктного доступу;
- return — переривання функції та повернення результату, який копіюється до атрибуту із ознакою повернення (return 123;); в середині внутрішньої функції здійснюється її завершення з визначеним результатом;
- new — створення об'єкту, реалізовано для: загальний об'єкт "Object", масив "Array" та регулярні вирази "RegExp";
- delete — видалення/звільнення об'єкту або його властивостей, при цьому: внутрішні змінні встановлюються у null-EVAL, зовнішні замінюються порожнім об'єктом, а властивості об'єкту очищуються.
1.4.1 Умовні оператори
Мовою підтримуються два типи умов. Перший — це операції умови для використання всередині виразу, другий — глобальний, заснований на умовних операторах.
Умова всередині виразу будується на операціях '?' та ':'. У якості прикладу можна записати наступний практичний вираз:
st_open = (pos >= 100) ? true : false;
Що читається як — якщо змінна pos більша або дорівнює 100, тоді змінній st_open привласнюється значення true, інакше — false.
Глобальна умова будується на основі умовних операторів "if" та "else". У якості прикладу можна привести той-же вираз, але записаний у інший спосіб:
if(pos > 100) st_open = true; else st_open = false;
1.4.2 Цикли
Підтримується три типи циклів: while, for та for-in. Синтаксис циклів відповідає мовам програмування: C++, Java та JavaScript.
Цикл while, загалом, записується наступним чином: while({умова}) {тіло циклу};
Цикл for записується наступним чином: for({пре-ініціаліз};{умова};{пост-обчислення}) {тіло циклу};
Цикл for-in записується наступним чином: for({змінна} in {об'єкт}) {тіло циклу};
Де:
- {умова} — вираз, який визначає умову;
- {тіло циклу} — тіло циклу множинного виконання;
- {пре-ініціаліз} — вираз попередньої ініціалізації змінних циклу;
- {пост-обчислення} — вираз модифікації параметрів циклу після чергової ітерації;
- {змінна} — змінна, яка буде містити ім'я властивості об'єкта при переборі;
- {об'єкт} — об'єкт для якого здійснюється перебір властивостей.
1.4.3 Внутрішні функції
Мова підтримує визначення та виклик внутрішніх функцій. Для визначення внутрішньої функції використовується ключове слово "function" та в цілому визначення має синтаксис: function {ім'яФ} ({зм1}, {зм2}, ... {змN}) { {тіло функції} }. Визначення внутрішньої функції всередині іншої недозволене однак дозволено виклик раніш визначеної.
Виклик внутрішньої функції здійснюється у типовий спосіб, як процедура {ім'яФ}({var1}, {var2}, ... {varN}); або як функція {змРез} = {ім'яФ}({зм1}, {зм2}, ... {змN});. Виклик внутрішніх функцій допустимий тільки після їх декларації вище!
Всі змінні, визначені у основному тілі, недоступні всередині внутрішніх функцій і можуть бути передані через двобічні аргументи викликуваної внутрішньої функції або через аргументи основної функції. Всі змінні, визначені в середині внутрішньої функції, мають власний простір назв та недоступні із основного тіла, або будь якої іншої внутрішньої функції, та можуть бути передані в основне тіло через двобічні аргументи, результат викликуваної внутрішньої функції або через аргументи основної функції. Змінні внутрішньої функції реєструються для збереження/відновлення їх контексту після другого та більше входу до функції, тож вони цілковито підтримують рекурсивні виклики!
Оператор "return", в середині внутрішньої функції, здійснює контрольоване її завершення та розташування вказаної змінної, або результату виразу, як результату викликуваної внутрішньої функції.
Приклад типового визначення та використання внутрішньої функції наведено далі:
function sum(a, b, c, d) { return a + ((b==null)?0:b) + ((c==null)?0:c) + ((d==null)?0:d); }
rez = sum(1, 2);
1.4.4 Спеціальні символи строкових змінних
Мовою передбачено підтримку наступних спеціальних символів строкових змінних:
- "\n" — переведення рядка;
- "\t" — символ табуляції;
- "\b" — забій;
- "\f" — перевід сторінки;
- "\r" — повернення каретки;
- "\\" — сам символ '\';
- "\041" — символ '!', записаний вісімковим числом;
- "\x21" — символ '!', записаний шістнадцятковим числом.