Инструкция switch. Синтаксис. Семантика
12.11 Инструкция switch
Синтаксис
ИнструкцияSwitch :
switch ( Выражение ) БлокCase
БлокCase :
{ ВетвиCaseопц } { ВетвиCaseопц ВетвьПоУмолчанию ВетвиCaseопц }
ВетвиCase :
ВетвьCase ВетвиCase ВетвьCase
ВетвьCase :
case Выражение : СписокИнструкцийопц
ВетвьПоУмолчанию :
default : СписокИнструкцийопц
Семантика
Значение нетерминала ИнструкцияSwitch : switch ( Выражение ) БлокCase вычисляется по следующей схеме:
1. Вычислить значение Выражения.
2. Вызвать ПолучитьЗначение(Результат(1)).
3. Вычислить значение БлокаCase, передав Результат(2) в качестве параметра.
4. Если Результат(3). тип равен break и Результат(2). цель принадлежит текущему набору меток - вернуть (normal, Результат(3).значение, empty).
5. Вернуть Результат(3).
Значение нетерминала БлокCase : { ВетвиCaseопц } с учётом входного параметра input вычисляется следующим образом:
1. Пусть V = empty. 2. Пусть A равно списку ВетвейCase в порядке исходного текста. 3. Пусть C равно следующей ВетвиCase в A. Если такой ВетвиCase не нашлось - переход на шаг 16. 4. Вычислить значение C. 5. Если input не равен Результату(4) (согласно определению оператора !==) - переход на шаг 3. 6. Если у C нет СпискаИнструкций - переход на шаг 10. 7. Вычислить значение СпискаИнструкций C и приравнять R результат. 8. Если R - неожиданное завершение, вернуть R. 9. Пусть V = R.значение. 10. Пусть C - следующая ВетвиCase из A. Если такой ВетвиCase не нашлось - переход на шаг 16. 11. Если у C нет СпискаИнструкций - переход на шаг 10. 12. Вычислить значение СпискаИнструкций C, получив результат R. 13. Если R.значение не равно empty, приравнять V = R.значение. 14. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель). 15. Переход на шаг 10. 16. Вернуть (normal, V, empty).
Значение нетерминала БлокCase : { ВетвиCaseопц ВетвьПоУмолчанию ВетвиCaseопц } с учётом входного параметра input вычисляется следующим образом:
1. Пусть V = empty. 2. Пусть A - список ВетвейCase в первом элементе ВетвиCase в порядке исходного текста. 3. Пусть C - следующая ВетвьCase в A. Если такой ВетвиCase не нашлось - переход на шаг 11. 4. Вычислить значение C. 5. Если input не равен Результату(4) (согласно определению оператора !==) - переход на шаг 3. 6. Если у C нет СпискаИнструкций - переход на шаг 20. 7. Вычислить значение СпискаИнструкций C, получив результат R. 8. Если R - неожиданное завершение, вернуть R. 9. Пусть V = R.значение. 10. Переход на шаг 20. 11. Пусть B - список ВетвейCase во втором элементе ВетвиCase в порядке исходного текста. 12. Пусть C - следующая ВетвьCase в B. Если такой ВетвиCase не нашлось - переход на шаг 26. 13. Вычислить значение C. 14. Если input не равен Результату(13) (согласно определению оператора !==) - переход на шаг 12. 15. Если у C нет СпискаИнструкций - переход на шаг 31. 16. Вычислить значение СпискаИнструкций C, получив результат R. 17. Если R - неожиданное завершение, вернуть R. 18. Пусть V = R.значение. 19. Переход на шаг 31. 20. Пусть C - следующая ВетвьCase в A. Если такой ВетвиCase не нашлось - переход на шаг 26. 21. Если у C нет СпискаИнструкций - переход на шаг 20. 22. Вычислить значение СпискаИнструкций C, получив результат R. 23. Если R.значение не равно пусто, приравнять V = R.значение. 24. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель). 25. Переход на шаг 20. 26. Если у ВетвиПоУмолчанию нет СпискаИнструкций - переход на шаг 30. 27. Вычислить значение СпискаИнструкций ВетвиПоУмолчанию, получив результат R. 28. Если R.значение не равно пусто, приравнять V = R.значение. 29. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель). 30. Пусть B равно списку ВетвейCase во втором элементе ВетвиCase в порядке исходного текста. 31. Пусть C - следующая ВетвьCase в B. Если такой ВетвиCase не нашлось - переход на шаг 37. 32. Если у C нет СпискаИнструкций - переход на шаг 31. 33. Вычислить значение СпискаИнструкций C, получив результат R. 34. Если R.значение не равно пусто, приравнять V = R.значение. 35. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель). 36. Переход на шаг 31. 37. Вернуть (normal, V, empty).
Значение нетерминала ВетвьCase : case Выражение : СписокИнструкцийопц вычисляется по следующей схеме:
1. Вычислить значение Выражения.
2. Вызвать ПолучитьЗначение(Результат(1)).
3. Вернуть Результат(2).
ЗАМЕЧАНИЕ При получении значения ВетвиCase соответствующий ей СписокИнструкций не выполняется. Просто вычисляется и возвращается значение Выражения, которое используется БлокомCase для выбора СпискаИнструкций, который следует начать исполнять.
|