У меня есть пара лексер / синтаксический анализатор (которую я отобрал у кого-то еще много лет назад).Я собираюсь добавить пару функций и подумал, что сначала должен стандартизировать использование while (true), содержащего несколько if / else if / else против переключателя, который использует goto для перехода назад до переключателя.
(До того, как пламя начнется, я обычно не использую goto как зло и т. Д. И т. Д.)
Проблема со значением time (true) и вложенным переключателем заключается в том, что разрыв происходит только изкоммутатор и не может выйти из этого режима.
Я провел здесь поиск и увидел предложения по использованию возврата изнутри коммутатора.Хотя в некоторых случаях это сработает, в других есть некоторая обработка через некоторое время, но до возвращения.Дублирование этого кода в нескольких местах на самом деле не выглядит привлекательным.
Я также мог бы ввести логический флаг и использовать его в операторе while, чтобы решить, стоит ли прерывать время, но это также не привлекает, так какдобавляет шум в код.
Текущий способ использования синтаксического анализатора if / else if / else вместо внутреннего переключателя, но у меня есть предпочтение для переключателя, если это возможно.
Код лексера в общем, кажется, обходит это, удаляя while (true) и помещая метку непосредственно перед запуском коммутатора и используя goto для продолжения цикла.Это оставляет разрыв, означающий остановку цикла, и, если честно, кажется, что это самый чистый путь, но он включает в себя идиотическое движение.
Возвращаясь к тому времени (верно), я также вижу третий путь.Используйте метку после while (true) и позвольте коду коммутатора использовать goto, чтобы добраться до него, когда цикл должен закончиться.Прерывание означало бы выход из коммутатора, но продолжение цикла.
Так что же это за панели?Goto слишком отвратителен для использования?Или это нормально, когда есть только одна метка, к которой можно перейти, что уменьшает отступы и дает в противном случае понятный код?Должны ли парсеры / лексеры получить специальную лицензию на использование gotos?
Я могу предоставить пример кода, если это поможет.