Операторы
Грамматика
STATEMENT : SIMPLE_STATEMENT
STATEMENT : STRUCTURED_STATEMENT
STATEMENT :
SIMPLE_STATEMENT : ASSIGN_EXPR
SIMPLE_STATEMENT : EXPLICIT_FUNCTION_CALL
SIMPLE_STATEMENT : SetBounds "(" name "," BOUNDS_LIST ")"
SIMPLE_STATEMENT : break ["()"]
SIMPLE_STATEMENT : continue ["()"]
SIMPLE_STATEMENT : exit ["()"]
ASSIGN_EXPR : EXPR ":=" EXPR
BOUNDS_LIST : BOUNDS
BOUNDS_LIST : BOUNDS_LIST LX_COMMA BOUNDS
BOUNDS : "[" EXPR "," EXPR "]"
STRUCTURED_STATEMENT : COMPOUND_STATEMENT
STRUCTURED_STATEMENT : IF_STATEMENT
STRUCTURED_STATEMENT : FOR_STATEMENT
STRUCTURED_STATEMENT : WHILE_STATEMENT
STRUCTURED_STATEMENT : REPEAT_STATEMENT
COMPOUND_STATEMENT : begin STATEMENTS_LIST end
IF_STATEMENT : if EXPR then STATEMENT
IF_STATEMENT : if EXPR then STATEMENT else STATEMENT
FOR_STATEMENT : for name ":=" EXPR FOR_DIRECTION EXPR do STATEMENT
FOR_DIRECTION : to
FOR_DIRECTION : downto
WHILE_STATEMENT : while EXPR do STATEMENT
REPEAT_STATEMENT : repeat STATEMENTS_LIST until EXPR
STATEMENTS_LIST : STATEMENT
STATEMENTS_LIST : STATEMENTS_LIST ";" STATEMENT
Описание операторов
Операторы можно поделить на две категории: простые и структурированные. Отличие между ними в том, структурированный оператор может содеражть в себе простые операторы, а простой не может содержить в себе структурированных операторов.
Простые операторы:
- Оператор присваивания, в грамматике обозначен как ASSIGN_EXPR. Служит для присвоения значения выражения справа переменной простого типа или элементу массива, стоящему слева.
- Оператор явного вызова подпрограммы. Может служить как для вызова процедур, так и для вызова функций. В круглых скобках указан список параметров, если параметров нет, то круглые скобки всё равно необходимы.
- Оператор установки размерностей динамического массива SetBounds. Первый параметр - имя массива, далее идёт список размерностей. Каждая размерность - пара значений, нижняя и верхняя границы, разделенные запятой и заключенные в квадратные скобки. Число размерностей должно совпадать с размерностью массива, массив должен иметь ненулевой размер по каждой из размерностей.
- Оператор управления циклом break. Используется для досрочного выхода из цикла for, repeat или while. Не может появляться вне цикла.
- Оператор управления циклом continue. Используется для досрочного перехода к следующей итерации цикла for, repeat или while. Не может появляться вне цикла.
- Оператор выхода из подпрограммы exit.
Составные операторы:
- Блочный оператор - группа операторов, начинающаяся с ключевого слова begin, и закрывающаяся ключевым словом end. Выступает в роли единого неделимого оператора.
- Условный оператор - в зависимости от условия выполняет тот или иной оператор. В случае трансляции кода вроде следующего -
if A if B then C() else D();
- оператор, идущий после else относится к последнему оператору if.
- Оператор цикла for - в представлении не нуждается :) Цикл проводится по целой локальной переменной, изменять которую на протяжении цикла запрещено. Хотя транслятор не отслеживает эту ошибку, не рекомендуется писать код, меняющий переменную цикла внутри цикла, т.к. существуют компиляторы, считающие это ошибкой. Также не даётся никаких гарантий по поводу того, сколько раз вычисляется выражение для границы цикла - одни компиляторы вычисляют границу цикла в начале цикла, другие делают это на каждой итерации. Не рекомендуется помещать в операторе цикла верхней границей выражение, которое сложно вычисляется или меняется от итерации к итерации.
- Операторы циклов while/do и repeat/until организуют циклы с вычислением и проверкой условия в начале и конце цикла.