Хотя, безусловно, можно использовать методы GLR для разбора C ++ (см. Ряд ответов Ира Бакстер ), я считаю, что подход, обычно используемый в обычно используемых компиляторах, таких как gcc и clang,именно отсрочка разбора функциональных тел до полного определения класса.(Поскольку исходный код C ++ проходит через препроцессор перед анализом, синтаксический анализатор работает с потоками токенов, и это то, что должно быть сохранено для повторного анализа тела функции. Я не верю, что выполнимо повторный анализ исходного кода.)
Легко узнать, когда определение функции завершено, так как фигурные скобки ({}
) должны быть сбалансированы, даже если неизвестно, как вкладываются угловые скобки.
C ++ - не единственный язык, на котором полезно отложить анализ до обработки объявлений.Например, язык, который позволяет пользователям определять новые операторы с различными приоритетами, потребовал бы (пере) анализа всех выражений, когда известны имена и приоритеты операторов.Более патологическим примером является COBOL, в котором приоритет OR
в a = b OR c
зависит от того, является ли c
целым числом (a
равно одному из b
или c
) или логическим (a
равно b
или c
верно).Является ли проектирование языков таким способом хорошей идеей - это другой вопрос.