- •Вопрос 4. Деревья синтаксического анализа.
- •Генерация дерева синтаксического анализа
- •Вопрос 5. Приоритет операторов. Ассоциативность операторов.
- •Вопрос 6. Расширенная форма Бэкуса-Наура и синтаксические графы.
- •Вопрос 10. Концепция связывания, способы связи переменных с памятью
- •Вопрос 11. Арифметические выражения, порядок вычисления операторов.
- •Вопрос 12. Перегруженные операторы
- •Вопрос 13. Преобразование типов.
- •Вопрос 15. Операторы присваивания.
- •Вопрос 16.Структура операторов управления. Составной оператор и оператор ветвления (2 варианта).
- •Вопрос 14. Отношения и булевские выражения. Сокращенные вычисления.
- •Вложенные операторы ветвления и замыкание операторов ветвления.
- •I. Вложенные операторы ветвления.
- •Многовариантные операторы ветвления.
- •Вопрос 19. Операторы цикла. Циклы со счетчиком. Оператор do в Fortran. Оператор цикла в Pascal, algol 60.
- •Вопрос 21. Логически управляемые циклы.
- •Вопрос 22. Циклы с механизмом управления, размещаемым пользователем.
Вложенные операторы ветвления и замыкание операторов ветвления.
I. Вложенные операторы ветвления.
Внутри ветвления могут находиться как линейные фрагменты алгоритма, так и другие ветвления. В языке Visual Basic.NET вложенные операторы ветвления If имеют вид:
Вариант 1 Вариант 2
If <условие 1> Then <Операторы 1> Elself <условие 2> Then <Операторы 2> End If |
if <условие 1> then <Операторы 1> elseif <условие 2> then <Операторы 2> . . . elseif <условие n-1> then <Операторы n-1> else <Операторы n> endif |
Оператор работает следующим образом:
если (If) выполняется <условие 1>, то (Then) будет выполнена последовательность операторов <Блок 1>,
иначе если (ElseIf) выполняется <условие 2>, то (Then) будет выполнен <Блок 2> ,
и т.д.,
иначе (Else) - <Блок N>
Вложенные операторы ветвления
Интересная проблема возникает, если допускается вложение двухвариантных конструкций ветвления. Рассмотрим следующий фрагмент кода, напоминающего программу на языке Pascal:
ifsum= 0then
ifcount= 0thenresult:= 0
elseresult:= 1
Эту конструкцию можно интерпретировать двумя различными способами в зависимости от того, соответствует оператор else первому оператору then или второму. Заметим, что структурированное расположение текста указывает на то, что оператор else принадлежит первому оператору then. Однако такое расположение текста не влияет на семантику в большинстве современных языков и, следовательно, игнорируется их компиляторами.
Разработчики языка ALGOL60 решили использовать синтаксис, а не правило, для то го чтобы связывать операторы else с операторами then. В частности, не допускалось вложение оператора if непосредственно в оператор then. Если возникала необходимость вложить операторifв оператор then, он должен был быть заключен в составной оператор. Например, если конструкция ветвления, приведенная выше, должна была связать оператор else со вторым оператором then, в языкеALGOL60 это следовало за писать следующим образом:
if sum = 0 then
begin
ifcount = 0then result := 0
else result:= 1
end
Если оператор else следовало связать с первым оператором then, то это можно было записать так:
if sum = 0 then
begin
if count = 0 then result := 0
end
elseresult:= 1
Специальные слова и замыкание оператора ветвления
Рассмотрим синтаксическую структуру оператора ifв языкеPascal. Операторthenначинается с зарезервированного слова then, а оператор else— с зарезервированного слова else. Если оператор then представляет собой отдельный оператор и присутствует оператор else, то зарезервированное слово else фактически отмечает конец оператора then, несмотря на то, что в этом нет никакой необходимости. Если оператор then является составным, он завершается зарезервированным словом end. Однако, если последний оператор в операторе if (либо then, либо else) не является составным, то не существует синтаксического способа для того, чтобы отметить конец всей конструкции ветвления. Использование ключевого слова для этой цели могло бы разрешить вопрос, связанный с семантикой вложенных операторов ветвления, и увеличить надежность конструкции.
