Первые радости
Первые радости
Начнем с синтаксиса (самого, казалось бы, простого аспекта, однако борьбой с ним завершаются попытки очень многих). Несколько первых впечатлений. Во-первых, язык просто очень большой. Это означает, что синтаксические таблицы?—?составленные вручную или построенные каким-нибудь генератором распознавателей, вроде YACC, будут довольно велики, что, естественно, замедлит скорость синтаксического разбора.
Однако при внимательном анализе оказывается, что в языке имеется сравнительно большое число «микро»-регулярностей?—?часто повторяющихся устойчивых последовательностей лексем. Например, пары пустых скобки: (), [], пустой список параметров (void), завершитель списка параметров ...) встречаются очень часто. После служебных слов if, switch, while всегда должна стоять левая круглая скобка, после break и continue?—?точка с запятой, а после слова goto располагаются идентификатор и точка с запятой. Таких регулярностей набирается несколько десятков, так что если рассматривать их как отдельные лексемы, объем синтаксиса заметно сокращается. Введение каждой такой "суперлексемы" экономит по крайней мере одно обращение синтаксического анализатора к таблице разбора. Усложнение распознавателя лексем (сканера), вынужденного составлять суперлексемы из пар или троек обычных лексем, при этом получается весьма незначительное; более того, если сканер во время одного вызова распознает, например, не только служебное слово switch, но и левую круглую скобку, идущую за ним, получится экономия и на числе обращений к сканеру!
Во-вторых, в синтаксисе есть неоднозначности. Это надо оценить: в Стандарте (!) языка программирования прямо написано, что некоторые конструкции можно трактовать двояко?—?либо как объявление, либо как оператор! В несколько упрощенном виде формулировка из стандарта выглядит так: "выражение, содержащее в качестве своего самого левого подвыражения явное преобразование типа, которое записано в функциональном стиле, может быть неотличимо от объявления, в котором первый декларатор начинается с левой круглой скобки". Классический пример: что такое T(a); если T?—?некоторый тип? С одной стороны, это как бы объявление переменной с именем a, тип которой задан как T. С другой?—?конструкцию можно трактовать как преобразование типа уже объявленной где-то ранее переменной a к типу T. Все дело в том, что в Си++ статус операторов и объявлений полностью уравнен; последние даже и называются declaration-statements?—?операторы-объявления, то есть традиционные операторы и объявления могут записываться вперемежку. Все же радости с круглыми скобками перекочевали в Си++ прямо из Си, в котором типы конструируются подобно выражениям, и тривиальное объявление можно задать либо как "int a;", либо как "int(a);". Все это понятно, но от этого не легче. И такой язык любят миллионы программистов?! Мир сошел с ума. Яду мне, яду!..
Смысл правил разрешения неоднозначностей сводится, по существу, к поразительной фразе, простодушно выведенной в "Зеленой книге": "если конструкция выглядит как объявление, то это и есть объявление. В противном случае это оператор". Иными словами, чтобы разрешить неоднозначность, следует рассмотреть всю конструкцию целиком; фрагмент "T(a)" для анализа недостаточен?—?за ним сразу может следовать либо точка с запятой, тогда выбор делается в пользу объявления, либо "что-то еще". Например, вся конструкция может выглядеть как "T(a)?m = 7;" или "T(a)++;"?—?это, конечно, операторы (точнее, операторы-выражения, в терминах стандарта). Ну а как понимать следующее: "T(e)[5];" или "T(c)=7;"? А это, будьте уверены, еще не самые разительные примеры?—?загляните в разд. 6.8 Стандарта.
Человеку хорошо, он ко всему привыкает, рано или поздно он разберется, но как заставить анализатор понимать эту чехарду? Пока он не доберется до точки с запятой, он, в общем случае, ничего не сможет сказать о конструкции. Друзья, не пишите объявления, которые невозможно отличить от операторов! Пожалейте компилятор, ему же тяжело! Кроме того, можно запросто ошибиться и самому…
Несколько дней прошли в бесплодных попытках выразить неоднозначности на входном языке YACC. Выход был похоже, только в организации просмотра вперед, причем на заранее не известное количество лексем. Алгоритм разбора, заложенный в YACC, этого делать не умеет. В принципе известны и доступны системы, в которых заявлена подобная возможность, однако мы были ограничены требованием: синтаксический анализатор писать на YACCе, более того, на его версии, сделанной в одном европейском университете… Пришлось пойти на ухищрения и "сломать" классическую схему разбора: делать предварительный анализ еще на уровне разбора лексем и, встретив левую скобку после имени типа (а еще пойди распознай, что идентификатор?—?имя типа, а не какой-то другой сущности!), "отменять" автоматический анализ и организовывать "ручной" перебор последующих лексем, складывая их про запас в буфер.
Спасибо, в "Зеленой книге" подсказали схему такого анализа. Не знаем, как и благодарить, сами бы ни за что не придумали…
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Первые СБР
Первые СБР Рост популярности Linux привел к появлению ее вариантов, ориентированных на так называемого конечного пользователя. Для снижения порога «вхождения в тему» были придуманы системы, снабженные простым в использовании инсталлятором, позволяющим сразу же получить
Последствия первые...
Последствия первые... Таким образом, Ubuntu понадобилось всего около года для того, чтобы добиться той популярности среди узкого круга широких народных масс, к которой на протяжении более чем десятилетия стремились и Red Hat, и Suse, и Debian, и Mandrake с Mandriva.Одним из главных следствий
Первые дополнения
Первые дополнения Итак, ICANN, умело лавируя между довольными и недовольными, опираясь на лидеров мнений и законодателей мод, рассмотрев силами рабочей группы поступившие заявки, в 2001 году приняла решение о введении семи новых доменов верхнего уровня общего назначения: BIZ,
Чемпионат по футболу и прочие радости фанатов как инструменты продаж
Чемпионат по футболу и прочие радости фанатов как инструменты продаж В России очень хорошо работают акции и скидки, связанные с различными массовыми мероприятиями, широко ротируемыми в СМИ (рис. 48). Например, чемпионат Европы по футболу, Олимпийские игры, «Евровидение» и
Первые шаги
Первые шаги Запускаем Excel и начинаем рассматривать эту пока еще для нас диковинку. Нажмите кнопочку Пуск, зайдите в меню Все программы, далее выполните команду Microsoft Office ? Microsoft Office Excel 2007. Думаю, первое впечатление у вас будет сопровождаться облегченным вздохом. Ведь как
Первые шаги
Первые шаги Практика — это самый лучший способ научиться программировать для мобильных устройств под .NET Compact Framework. Чтобы поверить в свои силы, нужно создать простейшее приложение. На его примере можно будет изучить различия между .NET Compact Framework и обычной .NET Framework.Прежде
Первые шаги
Первые шаги После запуска Visual Studio .NET 2005 надо создать новый проект. При выборе типа проекта надо указать, что будет использоваться .NET Compact Framework 1.0. Для начала на форме следует разместить текстовое поле с именем txtEditor. Для свойства Multiline надо задать значение True, а свойство
ПИСЬМОНОСЕЦ: Радости пубертатного периода
ПИСЬМОНОСЕЦ: Радости пубертатного периода Автор: Владимир ГуриевНомер 10 (630) от 14 марта, стр. 75, верхний колонтитул: #06 [626] 14 февраля 2006. Я перепугался, думал, что кучу номеров пропустил… ну ничего, обложка спасла от сердечного приступа…Юрий Николаевич ШишкинОТ РЕДАКЦИИ: Мы
Первые 3000 лет
Первые 3000 лет Почти четыре тысячи лет тому назад в древнеегипетском городе Менет-Хуфу на берегу Нила один опытный писец нарисовал иероглифы, рассказавшие историю жизни его господина. Сделав это, он стал родоначальником документально зафиксированной истории
Очки Google в руках простых пользователей: первые впечатления, первые вопросы, первые проблемы Евгений Золотов
Очки Google в руках простых пользователей: первые впечатления, первые вопросы, первые проблемы Евгений Золотов Опубликовано 19 апреля 2013 Однажды это непременно случается: долгожданный продукт попадает в руки первых пользователей и происходит
ОГОРОД КОЗЛОВСКОГО: В поисках радости
ОГОРОД КОЗЛОВСКОГО: В поисках радости Автор: Козловский ЕвгенийВ «Огороде» "В гости к Голубицкому, или Заметки неофита" я рассказал, как вдруг запал на не бог весть какую новинку — GPS-навигатор, встроенный в крохотный коммуникатор P3300 от HTC с собственным именем Artemis. Понял
Дизайнеры шутят: квадратные куриные яйца, рыбы с проушиной под крючок и прочие радости ГМО Николай Маслухин
Дизайнеры шутят: квадратные куриные яйца, рыбы с проушиной под крючок и прочие радости ГМО Николай Маслухин Опубликовано 15 февраля 2013 С тех пор как генная инженерия хорошенько развернулась и неплохо зарекомендовала себя в научной среде, прочно
Первые раздумья о ЦВМ
Первые раздумья о ЦВМ Настоящим венцом деятельности Лебедева в области электрических сетей стал проект сверхмощной (до 600–1000 МВт) и сверхдальней (около 1000 км) магистральной линии электропередачи «Куйбышев — Москва», разработанный им в 1939–1940 годах в
Глава 15 Цифровая фотография — источник радости
Глава 15 Цифровая фотография — источник радости • Фотография в рамке• Фотокартина• Фотосувениры• О повышении мастерства• Развивайте воображение• О дальнейшем «наращивании» фототехники• Как заработать деньги, используя цифровую фотокамеруФотография не