- •14. Порядковые типы данных
- •14.1. Перечислимые типы
- •14.1.1. Синтаксис и значение выражений перечислимого типа.
- •14.1.2. Ввод-вывод для перечислимых типов.
- •14.1.3. Сравнение дат.
- •14.2. Тип boolean
- •14.2.1. Синтаксис логических выражений.
- •14.2.2. Значение логических выражений.
- •14.2.4. Поиск в файле.
- •14.3. Тип integer.
- •14.2.3. Ввод-вывод логических значений.
- •14.3.1. Подсчет пробелов.
- •14.3.2. Ввод-вывод целочисленных значений.
- •14.3.3. Переполнение.
- •14.3.4.Синтаксис целочисленных выражений.
- •14.3.5. Значение целочисленных выражений.
- •14.3.6. Преобразование символов в числа.
- •14.4. Тип диапазон.
- •14.4.1. Присваивания для диапазонов.
- •14.4.2. Преобразование температур.
- •14.5. Проектирование и анализ с порядковыми типами.
- •14.5.1. Правила проектирования.
- •14.5.2. Анализ программ.
- •14.6. Заключение.
14.2.1. Синтаксис логических выражений.
Синтаксические правила, рассмотренные в разделе 3.3, не покрывают случай, когда логические выражения могут включать переменные и константы. Эти правила не задают структуру всех возможных допустимых строк, которые могут образовывать логические выражения. Новые правила для логических выражений приведены ниже:
<выражение> ::= <простое выражение>
| <простое выражение> <оператор сравнения> <простое выражение>
<простое выражение> ::= <простое выражение> OR <терм> | <терм>
<терм> ::= <терм> AND <множитель> | <множитель>
<множитель> ::= <переменная> | <константа> | (<выражение>) | NOT <множитель>
Синтаксически некорректно записывать:
X <= Y <= Z
Для того, чтобы определить, что Y имеет значение, находящееся между значениями X и Z. Вместо этого требуется записать
(X <= Y) AND (Y <= Z)
чтобы выполнить такую проверку.
Скобки в выражениях – часть синтаксиса Паскаля. Попытка построить синтаксическое дерево для первого выражения терпит неудачу:
Невозможно вывести строку X <= Y из первого <простого выражения> без введения дополнительных символов в строку (например скобок). Для второго выражения может быть построено корректное синтаксическое дерево:
Последовательные лево-ассоциативные операторы с одинаковым приоритетом применяются к их операндам в порядке слева-на-право. Таким образом, в выражении
X OR Y OR Z
подвыражение
X OR Y
будет вычислено первым. Синтаксическое дерево для этого выражения будет следующим:
Операнды для каждого OR в строке могут быть найдены поиском строк, выведенных из соотвествующего <простого выражения> и <терма>. Операндами левого OR являются X и Y, тогда как операндами правого OR являются X OR Y (строка выведенная из первого <простоего выражения>) и Z. Таким образом, левый OR применяется к операндам раньше правого. (Конечно, приоритет операторов в выражении может быть изменен с помощью скобок)
Правило синтаксиса является леворекурсивным, если определяемая величина (то, что размещается слева от ::=) также появляется на первом месте справа от ::=.
Правило для <term> леворекурсивоное:
<терм> ::= <терм> AND <множитель>
Когда оператор определяется с использованием левой рекурсии, он будет левоассоциативным, как показано на синтаксических деревьях приведенных выше.
Относительный приоритет операторов также определен синтаксическими правилами. Синтаксическое дерево для
X OR Y AND Z
иллюстрирует приоритет операторов:
Несмотря на то, что AND расположен правее OR в строке, он применяется к его операндам, Y и Z до того как OR будет применен к своим операндам, X и Y AND Z. Таким образом, AND имеет более высокий приоритет в логических выражениях, чем OR.
14.2.2. Значение логических выражений.
Значение логического выражения задается следующим рекурсивным определением. Для любого состояния выполнения S:
E1 = E2(S) = (E1(S) = E2(S))
E1 <> E2(S) = (E1(S) E2(S))
E1 < E2(S) = (E1(S) < E2(S))
E1 <= E2(S) = (E1(S) ≤ E2(S))
E1 > E2(S) = (E1(S) > E2(S))
E1 >= E2(S) = (E1(S) ≥ E2(S))
E1 OR E2(S) = (E1(S) OR E2(S))
NOT E (S) = NOT E (S)
(E) (S) = E (S)
Операторы в левой части – те, что встречаются в Паскаль-программах. Те, которые в правой части – математические операции. Это определение дает значение каждого ператора по отдельности, но не указывает как будет вычисляться выражение с несколькими операторами. Ассоциативность и приоритет операторов в выражении определяется синтаксическими правилами Паскаля. Программное исчисление требут чтобы все операторы были определены, в противном случае математические свойства такие как коммутативность, (которую мы сипользуем чаще, чем предполагаем) нарушаются.
