Однако при внимательном анализе оказывается, что в языке имеется сравнительно
большое число «микро»-регулярностей — часто повторяющихся устойчивых
последовательностей лексем. Например, пары пустых скобки: ,
Во-вторых, в синтаксисе есть неоднозначности. Это надо оценить: в Стандарте (!)
языка программирования прямо написано, что некоторые конструкции можно
трактовать двояко — либо как объявление, либо как оператор! В несколько
упрощенном виде формулировка из стандарта выглядит так: "выражение, содержащее
в качестве своего самого левого подвыражения явное преобразование типа, которое
записано в функциональном стиле, может быть неотличимо от объявления, в котором
первый декларатор начинается с левой круглой скобки". Классический пример: что
такое
Смысл правил разрешения неоднозначностей сводится, по существу, к поразительной
фразе, простодушно выведенной в "Зеленой книге": "если конструкция выглядит как
объявление, то это и есть объявление. В противном случае это оператор". Иными
словами, чтобы разрешить неоднозначность, следует рассмотреть всю конструкцию
целиком; фрагмент "
Человеку хорошо, он ко всему привыкает, рано или поздно он разберется, но как заставить анализатор понимать эту чехарду? Пока он не доберется до точки с запятой, он, в общем случае, ничего не сможет сказать о конструкции. Друзья, не пишите объявления, которые невозможно отличить от операторов! Пожалейте компилятор, ему же тяжело! Кроме того, можно запросто ошибиться и самому…
Несколько дней прошли в бесплодных попытках выразить неоднозначности на входном языке YACC. Выход был похоже, только в организации просмотра вперед, причем на заранее не известное количество лексем. Алгоритм разбора, заложенный в YACC, этого делать не умеет. В принципе известны и доступны системы, в которых заявлена подобная возможность, однако мы были ограничены требованием: синтаксический анализатор писать на YACCе, более того, на его версии, сделанной в одном европейском университете… Пришлось пойти на ухищрения и "сломать" классическую схему разбора: делать предварительный анализ еще на уровне разбора лексем и, встретив левую скобку после имени типа (а еще пойди распознай, что идентификатор — имя типа, а не какой-то другой сущности!), "отменять" автоматический анализ и организовывать "ручной" перебор последующих лексем, складывая их про запас в буфер.
Спасибо, в "Зеленой книге" подсказали схему такого анализа. Не знаем, как и благодарить, сами бы ни за что не придумали…
Что такое идентификатор?
Помимо неоднозначностей в синтаксисе быстро обнаружились другие неприятности. На примерах их показать сложнее, так что придется рассказывать словами.