Что такое идентификатор?

Помимо неоднозначностей в синтаксисе быстро обнаружились другие неприятности.На примерах их показать сложнее, так что придется рассказывать словами.

Синтаксис языка Си++ неудобен еще и в другом отношении. Если говоритькоротко, то прямое использование в формальном описании одного из базовыхсинтаксических понятий?—?идентификатора?—?приводит к тому, что YACC расцениваетграмматику языка как некорректную и на ее основе не может построитьсинтаксический анализатор. Для традиционных языков синтаксическому анализаторудля разбора конструкции достаточно информации о том, что в данной позиции этойконструкции может (или должен) находиться идентификатор. Более простые языкисконструированы так, что семантика идентификатора не влияет на корректностьсинтаксического разбора. Вид программной сущности, обозначаемой этимидентификатором (подпрограмма, переменная, имя типа, исключение, метка и т.п.),смысл данного конкретного вхождения (объявление или использование)?—?все этовыявляется далее, как правило, являясь предметом следующей фазы компиляции?—?семантического анализа.

Для языка Си++ такая схема не проходит. Чтобы быть в состояниисинтаксически распознать многие конструкции, требовалась семантическаяинтерпретация имени. Иными словами, на вход синтаксическому анализаторуследовало поставлять не абстрактную лексему "идентификатор", а результатанализа того, что именно представляет собой этот идентификатор: "имя типа","новое имя в объявлении", "имя не-типа в выражении" и т.д. Заметим, чтосинтаксическому анализатору для Java?—?непосредственного потомка Си++?—?вполне хватает понятия идентификатора без каких-либо уточнений.

Всего для Си++ получилось около десятка таких "суперлексем", а лексема"идентификатор" вообще исчезла из синтаксиса. Понятно, что лексическийанализатор, который и поставляет лексемы, пришлось наделить дополнительным"интеллектом". Теперь он должен был не просто выделять из текста программыочередную лексему, но и обращаться в таблицы трансляции за информацией о том,что за идентификатор он выловил. Реально эти действия выполняет отдельныймодуль, названный "расширенным лексическим анализатором". Введениедополнительного модуля не привело к усложнению компилятора в целом, так какидентификация имен так или иначе должна производиться; мы просто перенесли еена более ранний этап компиляции. А синтаксис заметно упростился, стал болеенаглядным, информативным и в конечном счете более эффективным.









 


Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Верх