Язык программирования Си. Издание 3-е, исправленное — страница 59 из 69

Ниже приведены грамматические правила, которые мы уже рассматривали в данном приложении. Они имеют то же содержание, но даны в ином порядке.

Здесь не приводятся определения следующих символов-терминов: целая-константа, символьная-константа, константа-с-плавающей-точкой, идентификатор, строка и константа-перечисление. Слова, набранные обычным латинским шрифтом (не курсивом), и знаки рассматриваются как символы-термины и используются точно в том виде, как записаны. Данную грамматику можно механически трансформировать в текст, понятный системе автоматической генерации грамматического распознавателя. Для этого помимо добавления некоторых синтаксических пометок, предназначенных для указания альтернативных продукций, потребуется расшифровка конструкции со словами "один из" и дублирование каждой продукции, использующей символ с индексом необ., причем один вариант продукции должен быть написан с этим символом, а другой - без него. С одним изменением, а именно - удалением продукции typedef-имя:идентификатор и объявлением typedef-имени символом-термином, данная грамматика будет понятна генератору грамматического распознавателя YACC. Ей присуще лишь одно противоречие, вызываемое неоднозначностью конструкции if-else.

единица–трансляции:

внешнее-объявление

единица-трансляции внешнее-объявление

внешнее-объявление:

определение-функции

объявление

определение функции:

спецификаторы-объявлениянеоб объявитель

список-объявленийнеоб составная-инструкция

объявление:

спецификаторы-объявления список-инициализаторов-объявителейнеоб

список-объявлений:

объявление

список-объявлений объявление

спецификаторы-объявления:

спецификатор-класса-памяти спецификаторы-объявлениянеоб

спецификатор-типа спецификаторы-объявлениянеоб

квалификатор-типа спецификаторы-объявлениянеоб

спецификатор-класса-памяти: один из

    auto     register     static     extern     typedef

спецификатор-типа: один из

    void char short int long float double signed unsigned

спецификатор-структуры-или-объединения

спецификатор-перечисления

typedef-имя

квалификатор-типа: один из

    const    volatile

спецификатор-структуры-или-объединения:

структуры-или-объединения-идентификаторнеоб { список-объявлений-структуры }

структуры-или-объединения идентификатор

структура-или-объединение: одно из

    struct   union

список-объявлений-структуры:

объявление-структуры

список-объявлений-структуры объявление-структуры

список-объявителей-ииициализаторов:

объявитель-инициализатор

список-объявителей-инициализаторов , объявитель-инициализатор

объявитель-инициализатор:

    объявитель

объявитель = инициализатор

объявление-структуры:

список-спецификаторов-квалификаторов список-объявителей-структуры

список-спецификаторов-квалификаторов:

спецификатор-типа список-спецификаторов-квалификаторовнеоб

квалификатор-типа список-спецификаторов-квалификаторовнеоб

список-структуры-объявителей:

структуры–объявитель

список-структуры-объявителей , структуры-объявитель

структуры-объявитель:

объявитель

объявительнеоб : константное-выражение

спецификатор-перечисления:

    enum идентификаторнеоб { список-перечислителей }

    enum идентификатор

список-перечислителей:

перечислитель

список-перечислителей перечислитель

перечислитель:

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

указательнеоб собственно-объявитель

собственно-объявитель:

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

    ( объявитель )

собственно-объявитель [ константное-выражениенеоб ]

собственно-объявитель ( список-типов-параметров )

собственно-объявитель ( список-идентификаторовнеоб )

указатель:

    * список~квалификаторов-типанеоб

    * список-квалификаторов-типанеоб указатель

список-квалификаторов-типа:

квалификатор-типа

список-квалификаторов-типа квалификатор-типа

список-типов-параметров:

список-параметров

список-параметров , ...

список-параметров:

объявление-параметра

список-параметров , объявление-параметра

объявление-параметра:

спецификаторы-объявления объявитель

спецификаторы-объявления абстрактный-объявительнеоб

список-идентификаторов:

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

список-идентификаторов , идентификатор

инициализатор:

выражение-присваивания

    { список-инициализаторов }

    { список-инициализаторов, }

список-инициализаторов:

инициализатор

список-инициализаторов , инициализатор

имя-типа:

список-спецификаторое-квалификаторов абстрактный-объявительнеоб

абстрактный-объявитель:

указатель

указательнеоб собственно-абстрактный-объявитель

собственно-абстрактный-объявитель:

    ( абстрактный-объявитель )

собственно-абстрактный-объявительнеоб [константное-выражениенеоб]

собственно-абстрактный-объявительнеоб (список-типов-параметровнеоб)

typedef-имя:

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

инструкция:

помеченная-инструкция

инструкция–выражение

составная-инструкция

инструкция-выбора

циклическая-инструкция

инструкция-перехода

помеченная-инструкция:

идентификатор : инструкция

    case константное-выражение : инструкция

    default :