Для обеспечения максимальной гибкости настройки система Айтида во многих модулях поддерживает ввод и выполнение пользовательских скриптов, которые позволяют значительно расширить стандартный функционал системы, адаптировав его под конкретные потребности конечного клиента. Выполнением таких скриптов занимается модель системы называемый Вычислитель. Основной задачей Вычислителя является выполнение программ (скриптов) написанных на специальном языке. Отличительной особенностью этого языка является то, что он очень тесно взаимодействует с данными в базе данных посредством Понятий. В остальном данный язык является простым функциональным языком, оптимизированным под вычисление различных выражений.
Набор символов Вычислителя состоит из букв, цифр, символа @ и символов пунктуации, которые имеют специальное значение. Вы строите программу в Вычислителе, комбинируя символы в осмысленные операторы.
Набор символов Вычислителя содержит прописные и строчные буквы латинского и русского алфавитов, 10 десятичных цифр арабской системы исчисления, символ подчеркивания (_) и символ @.
Прописные английские буквы:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Строчные английские буквы:
a b c d e f g h i j k l m n o p q r s t u v w x y z
Прописные русские буквы:
А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
Строчные русские буквы:
а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я
Десятичные цифры:
0 1 2 3 4 5 6 7 8 9
Символ подчеркивания _
Символ @
Эти символы используются для формирования понятий, констант, идентификаторов и ключевых слов, описанных далее.
Интерпретатор Вычислителя обрабатывает прописные и строчные буквы, как одинаковые символы. Например, если в идентификаторе использована строчная буква a, то Вы можете заменить ее на прописную букву A.
Пробел, смена строки, возврат каретки и символ новой строки называются разделительными символами, т.к. они выполняют функцию пробелов между словами и строками в напечатанной странице. Эти символы отделяют задаваемые пользователем элементы, например, константы и идентификаторы, от других элементов программы.
Интерпретатор Вычислителя игнорирует разделительные символы, если они не служат для целей разделения или не являются компонентами символьных констант или строковых литералов. Таким образом, можно использовать дополнительные разделительные символы для улучшения восприятия программы. Интерпретатор рассматривает комментарии, как разделительные символы. (Комментарии рассматриваются в разделе "Комментарии".)
Знаки пунктуации и специальные символы из набора символов имеют самое разное предназначение, от организации текста программы до определения задач, которые будут выполнены программой. В Таблице 1 приведен список знаков пунктуации и специальных символов из набора символов Вычислителя.
Таблица 1. Знаки пунктуации и специальные символы
| Символ | Название | Символ | Название |
|---|---|---|---|
| , | запятая | { | левая фигурная скобка |
| . | точка | } | правая фигурная скобка |
| ; | точка с запятой | < | левая угловая скобка |
| : | двоеточие | > | правая угловая скобка |
| ? | знак вопроса | ! | восклицательный знак |
| ' | одинарная цитатная скобка | / | знак деления |
| " | двойная цитатная скобка | + | плюс |
| ( | левая круглая скобка | % | процент |
| ) | правая круглая скобка | * | звездочка |
| [ | левая прямоугольная скобка | - | минус |
| ] | правая прямоугольная скобка | = | равно |
Все эти символы имеют специальное значение. В данном руководстве описывается их использование. Любой знак пунктуации, не приведенный в Таблице 1, может быть использован только в символьных константах и комментариях.
"Операторы" это символы (состоящие из одного символа или комбинации символов), которые задают манипуляции над значениями. Каждый символ интерпретируется как отдельный элемент, называемый "лексемой".
В Таблице 2 содержится список унарных операторов Вычислителя с их именами. В Таблице 3 содержится список бинарных операторов с их именами. Операторы нужно задавать так, как они показаны в таблицах, без разделительных знаков в много символьных операторах. Обратите внимание на то, что знак минуса появляется в двух таблицах. Его унарная или бинарная интерпретация зависит от контекста, в котором он появляется.
Таблица 2. "Унарные операторы"
| Оператор | Название |
|---|---|
| ! | логическое НЕ |
| - | арифметическое отрицание |
| ++ | арифметическое инкрементирование |
| -- | арифметическое декрементирование |
Таблица 3. "Бинарные операторы"
| Оператор | Название | Оператор | Название |
|---|---|---|---|
| + | сложение | != | неэквивалентность |
| - | вычитание | AND | логическое И |
| * | умножение | OR | логическое ИЛИ |
| / | деление | XOR | логическое исключающее ИЛИ (XOR) |
| & | битовое И | = | простое присвоение |
| | | битовое ИЛИ | += | присвоение со сложением |
| ^ | битовое исключающее ИЛИ (XOR) | -= | присвоение с вычитанием |
| % | остаток от деления | *= | присвоение с умножением |
| <= | меньше или равно | /= | присвоение с делением |
| > | больше | &= | присвоение с битовым И |
| >= | больше или равно | |= | присвоение с битовым ИЛИ |
| == | эквивалентно (равно) | ^= | присвоение с битовым XOR |
| $ | Вхождение левого строкового оператора в правый. Проверка, входит ли подстрока в другую строку. |
Константа это число, символ или строка символов, которая в программе используется, как значение. Значение константы нельзя изменить.
В Вычислителе есть четыре вида констант: целые, с плавающей точкой, символьные и константы с типом дата и время.
Синтаксис:
цифры
0xцифры
0Xцифры
"Целая константа" это десятичное, восьмеричное или шестнадцатеричное число, которое представляет собой целое значение в одной из следующих форм:
0 до 9).0xцифры или 0Xцифры, где цифры это одно или нескольких шестнадцатеричных цифр (от 0 до 9 и прописные или строчные буквы от a до f), указание 0x или 0X обязательно.Таблица 4. Примеры целых констант
| Десятичные | Шестнадцатеричные |
|---|---|
| 10 | 0xa или 0xA |
| 132 | 0x84 |
| 32179 | 0x7db3 или 0x7DB3 |
Целые константы всегда имеют положительные значения. Если нужно использовать отрицательное значение, то поместите знак минус (-) перед константой для формирования выражения с отрицательным значением. В данном случае знак минус интерпретируется как унарный арифметический оператор отрицания.
Каждой целой константе на основании ее значения присваивается соответствующий тип. Целые константы представленные в десятичном виде всегда являются целым числом с диапазоном значений от -2147483648 до 2147483647. Тип целой константы представленной в шестнадцатеричном виде определяется ее значением. Если значение не превосходит 0xFFFFFFFF, то считается что константа является целым числом. В противном случае, константа преобразуется в двоичный массив.
Синтаксис: [цифры][.цифры][E|e-[+]цифры]
"Константа с плавающей точкой" это десятичное число, которое соответствует действительному числу со знаком. Значение действительного числа со знаком состоит из целой части, дробной части и показателя степени. "Цифр" может не быть или их может быть несколько (от 0 до 9), а E (или e) это символ экспоненты. Можно опустить либо цифры до десятичной точки (целая часть числа) либо после десятичной точки (дробная часть числа), но не одновременно. Если используется показатель степени, то только в этом случае можно не вводить десятичную точку. Показатель степени состоит из символа экспоненты (E или e) за которым следует постоянное целое значение. Целое значение может быть отрицательным. Нельзя использовать разделительные символы между цифрами или символами константы.
Константы с плавающей точкой всегда имеют положительные значения. Если нужно использовать отрицательное значение, то поместите знак минус (-) перед константой для формирования выражения с отрицательным значением. В данном случае знак минус интерпретируется как арифметический оператор.
Все константы с плавающей точкой имеют тип вещественное число.
Следующие примеры иллюстрируют некоторые формы констант и выражений с плавающей точкой:
15.75
1.575E1
1575e-2
-0.0025
-2.5e-3
25E-4
Синтаксис: "символы"["символы"]...
Строковая константа - это последовательность символов, которая заключена в двойные или одинарные кавычки. Например, строковая константа может быть такой:
"Это строковая константа."
В строковой константе "символы" могут содержать любые символы, в том числе перевод строки / возврат каретки. При необходимости указать внутри константы кавычку, которая была использована в качестве ограничителя константы, необходимо дважды повторить данный символ. Например.
"ООО ""Ромашка"" "
Традиционный способ формирования строк литералов, которые не умещаются на одной строке, состоит в том, что константа разбивается на две части и между ними добавляется знак сложения (+). Например, строковая константа
"Эта длинная константа " +
"не помещается на одной строке."
идентична строке
"Эта длинная константа не помещается на одной строке."
Синтаксис: {ДД.ММ.ГГГГ ЧЧ:ММ:СС}
Константа, имеющая тип дата и время – это дата и время, записанное десятичными цифрами с использованием в качестве разделителя дней, месяцев и годов точку (.) или знак деления (/), а в качестве разделителя часов, минут и секунд двоеточие (. При этом дата должна быть отделена он времени пробелом. Поддерживается три формата представления даты:
ДД.ММ.ГГ – два символа номера дня, два символа номера месяца и два символа номера годаДД.ММ.ГГГГ – два символа номера дня, два символа номера месяца и четыре символа номера годаГГГГ.ММ.ДД – четыре символа номера года, два символа номера месяца и два символа номера дняВремя может быть не указано. Если время указано, то оно обязательно должно содержать часы и минуты. Секунды могут быть пропущены. Константы данного типа должны быть расположены в одной строке. Перенос на другую строку не допускается. Между символом открывающей фигурной скобки и первой цифрой могут располагаться только символы пробела. Другие символы разделители не допускаются. Примеры константа с типом дата и время:
{01.01.2010 12:00:00}{2010-03-31 11:58}{2010-03-31}Синтаксис: _ИмяКонстанты
Система Айтида в своем составе имеет справочник констант. В данном справочнике пользователь имеет возможность описать необходимые ему константы без использования программирования скриптов. Это удобно, когда необходимо определить какие либо параметры, используемые во всей системе. Например. Значение константы _БУХУЧЕТ определяет, ведется ли в системе Айтида бухгалтерский учет. Значение этой константы может использоваться в любых скрипта и выражениях используемых при настройке системы Айтида.
Отличительной особенностью использования таких констант, является то, что их значение может изменяться во времени, при этом для каждого интервала времени может быть задано свое значение константы. Для определения какой именно интервал времени для констант должен использоваться задается встроенной функцией ДАТАКОНСТАНТ([Дата]) (CONSTANTSDATE([Дата]))
Синтаксис: буква|_|@[буква|цифра|_]...
"Идентификаторы" - это имена, которые Вы присваиваете переменным и функциям в вашей программе. Идентификатор это последовательность из одной или нескольких букв, цифр, знаков подчеркивания (_) или символа @, которая обязательно начинается с буквы, подчеркивания или символа @. Идентификатор может содержать любое число символов. Идентификатор создается его заданием в объявлении переменной ключевым словом PUBLIC или LOCAL, или при первом присвоении ему значения. После этого его можно использовать в операторах программы для ссылки на связанный с ним элемент. Интерпретатор Вычислителя рассматривает прописные и строчные буквы одинаковые символы, поэтому нельзя создавать разные идентификаторы с одинаковым произношением, но с одной или несколькими буквами иного размера. Идентификаторы не могут иметь произношение и написание, совпадающее с ключевыми словами языка. Ключевые слова описаны в разделе "Ключевые слова".
Синтаксис: @буква|_|@[буква|цифра|_]...
Система Айтида в своем составе имеет справочник понятий. В данном справочнике пользователь имеет возможность описать необходимые ему понятия. Понятие – это поименованные правила получения информации из базы данных. Другими словами, понятия содержат в себе информацию о том, как получить значение того или иного элемента из базы данных. Например. В системе есть справочник товаров. Во многих печатных формах используется элемент «Наименование товара». Доступ к данному элементу всегда осуществляется через внутренний код товара в базу данных. Для того чтобы, каждый раз, когда требуется получить наименование товара не писать запрос к базе данных для получения этого наименования, можно описать понятие @НаименованиеТовара, в котором указать правило (запрос) для получения наименования, используя код товара. После этого везде, где необходимо, можно будет использовать вместо запроса к базе данных созданное понятие. Понятия могут использовать в своем описании другие понятия. Уровень вложенности таких описаний не ограничен. Так же для понятия можно определить значение по умолчанию, которое будет использовано в случае, если для вычисления значения понятия не хватает какой-либо информации.
Понятия могут быть трех типов.
"Ключевые слова" это заранее определенные идентификаторы, которые имеют для интерпретатора Вычислителя специальное значение. Их можно использовать только так, как они определены. Имя элемента программы не может совпадать по произношению и написанию с ключевым словом. В языке Вычислителя имеются следующие ключевые слова:
IF, WHILE, BREAK, CONTINUE, TRY, CATCH, BEGIN, END, RETURN, PUBLIC, LOCAL, FUNCTION, ФУНКЦИЯ, CONCEPT, ПОНЯТИЕ, CONSTANT, КОНСТАНТА, OBJECT, ОБЪЕКТ, SQL, SQLAGGREGATE, SQLERROR
Синтаксис: /* символы */
"Комментарий" это последовательность символов, которая рассматривается интерпретатором как разделительный символ, но игнорируется им. "Символы" в комментарии могут включать в себя любые комбинации символов, включая символ новой строки, кроме ограничителя "конец комментария" (*/). Комментарии могут занимать более одной строки, но не могут быть вложенными. Комментарии могут появляться везде, где допустимо появление разделительных символов. Комментарий рассматривается интерпретатором как единичный разделительный символ, поэтому нельзя включать комментарии с лексемами. Однако, из-за того, что компилятор игнорирует символы комментария, в его текст можно включать ключевые слова без появления ошибок.
Приведем ряд примеров, иллюстрирующих комментарии:
/* Комментарии могут располагаться на
Нескольких строках. */
/* Комментарии могут содержать любые символы
В том числе ключевые слова, например while. */
Комментарии не могут содержать вложенные комментарии. Следующий пример вызовет появление ошибки:
/* Нельзя создавать /* вложенные */ комментарии */
Ошибка происходит из-за того, что интерпретатор распознает первое появление */ после слова nest как конец комментария. Он пытается обработать остальной текст и не может этого сделать, поэтому выдает сообщение об ошибке.
В исходном тексте программы интерпретатор распознает основные элементы из групп символов, называемые "лексемами". Лексема это текст исходной программы, который интерпретатор не анализирует на входящие в него компоненты. Например, в следующем фрагменте программы слово elsewhere использовано в качестве имени функции. Хотя else и является ключевым словом, конфликта между лексемой имени функции и лексемой ключевого слова не происходит.
ФУНКЦИЯ main( )
{
i = 0;
if ( i )
elsewhere( );
}
Однако, если ввести elsewhere как else where, с пробелом между словами else и where, то в предыдущем примере Вычислитель будет пытаться выполнить функцию where( ), т.к. указанное условие не выполнится. Примерами лексем могут служить описанные в данной главе операторы, константы, идентификаторы и ключевые слова. Также являются лексемами такие символы пунктуации, как прямоугольные ([]), фигурные ({}) и угловые скобки (<>), двоеточие и запятая. Лексемы отделяются разделительными символами и другими лексемами, например, операторами и символами пунктуации. Для предотвращения разбивки интерпретатором элементов на две или несколько лексем, в идентификаторах, много символьных операторах и ключевых словах запрещено использование разделительных символов. Когда интерпретатор интерпретирует лексемы, он пытается включить в отдельную лексему как можно больше символов до перехода к следующей лексеме. Из-за этой особенности интерпретатор может неверно интерпретировать лексемы, если они не выделяются разделительными символами. Пример. Рассмотрим следующее выражение:
i+++j
В данном примере интерпретатор сначала пытается выделить максимально длинный оператор (++) из двух знаков плюс. Оставшийся оператор плюс рассматривается как оператор сложения (+). Т.о. выражение интерпретируется как (i++)+(j), а не как (i)+(++j). В данном случае и в аналогичных случаях нужно использовать разделительные символы и скобки для исключения неоднозначности и обеспечения корректного вычисления выражений.