Книга: Язык программирования Си. Издание 3-е, исправленное

A13. Грамматика

A13. Грамматика

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

Здесь не приводятся определения следующих символов-терминов: целая-константа, символьная-константа, константа-с-плавающей-точкой, идентификатор, строка и константа-перечисление. Слова, набранные обычным латинским шрифтом (не курсивом), и знаки рассматриваются как символы-термины и используются точно в том виде, как записаны. Данную грамматику можно механически трансформировать в текст, понятный системе автоматической генерации грамматического распознавателя. Для этого помимо добавления некоторых синтаксических пометок, предназначенных для указания альтернативных продукций, потребуется расшифровка конструкции со словами "один из" и дублирование каждой продукции, использующей символ с индексом необ., причем один вариант продукции должен быть написан с этим символом, а другой - без него. С одним изменением, а именно - удалением продукции 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 : инструкция
инструкция-выражение:
    выражениенеоб;
составная-инструкция:
    ( список-объявленийнеоб список-инструкцийнеоб)
список-инструкций:
    инструкция
    список-инструкций инструкция
инструкция-выбора:
    if ( выражение ) инструкция
    if ( выражение ) инструкция else инструкция
    switch ( выражение ) инструкция
циклическая-инструкция:
    while ( выражение ) инструкция
    do инструкция while ( выражение )
    return выражениенеоб;
выражение:
    выражение-присваивания
    выражение , выражение-присваивания
выражение-присваивания:
    условное-выражение
    унарное-выражение оператор-присваивания выражение-присваивания
оператор-присваивания: один из
    =   *=   /=   %=   +=   -=   <<=   >>=   &=   ^=   |=
условное-выражение:
    логическое-ИЛИ-выражение
    логическое-ИЛИ-выражение ? выражение : условное-выражение
константное-выражение:
    условное-выражение
логическое-ИЛИ-выражение:
    логическое-И-выражение
    логическое-ИЛИ-выражение || логическое-И-выражение
логическое-И-выражение:
    ИЛИ-выражение
    логическое-И-выражение && ИЛИ-выражение
ИЛИ-выражение:
    исключающее-ИЛИ-выражение
    ИЛИ-выражение | исключающее-ИЛИ-выражение
исключающее-ИЛИ-выражение:
    И-выражение
    исключающее-ИЛИ-выражение ^ И-выражение
И-выражение:
    выражение-равенства
    И-выражение & выражение-равенства
выражение-равенства:
    выражение-отношения
    выражение-равенства == выражение-отношения
    выражение-равенства != выражение-отношения
выражение-отношения:
    сдвиговое-выражение
    выражение-отношения < сдвиговое-выражение
    выражение-отношения > сдвиговое-выражение
    выражение-отношения <= сдвиговое-выражение
    выражение-отношения >= сдвиговое-выражение
сдвиговое-выражение:
    аддитивное-выражение
    сдвиговое-выражение >> аддитивное-выражение
    сдвиговое-выражение << аддитивное-выражение
аддитивное-выражение:
    мультипликативное-выражение
    аддитивное-выражение + мультипликативное-выражение
    аддитивное-выражение - мультипликативное-выражение
мультипликативное-выражение:
    выражение-приведенное-к-типу
    мультипликативное-выражение * выражение-приведенное-к-типу
    мультипликативное-выражение / выражение-приведенное-к-типу
    мультипликативное-выражение % выражение-приведенное-к-типу
выражение-приведенное-к-типу:
    унарное-выражение
    ( имя-типа ) выражение-приведенное-к-типу
унарное-выражение:
    постфиксное –выражение
    ++ унарное-выражение
    -- унарное-выражение
    унарный-оператор выражение-приведенное-к-типу
    sizeof унарное-выражение
    sizeof( имя-типа )
унарный-оператор: один из
    &   *   +   -   ~   !
постфиксное-выражение:
    первичное-выражение
    постфиксное-выражение [ выражение ]
    постфиксное-выражение ( список-аргументов-выраженийнеоб )
    постфиксное-выражение , идентификатор
    постфиксное-выражение -> идентификатор
    постфиксное-выражение ++
    постфиксное-выражение --
первичное -выражение:
    идентификатор
    константа
    строка
    ( выражение )
список-аргументов-выражений:
    выражение-присваивания
    список-аргументов-выражений , выражение-присваивания
константа:
    целая-константа
    символьная-константа
    константа-с-плавающей-точкой
    константа-перечисление

Ниже приводится грамматика языка препроцессора в виде перечня структур управляющих строк. Для механического получения программы грамматического разбора она не годится. Грамматика включает символ текст, который означает текст обычной программы, безусловные управляющие строки препроцессора и его законченные условные конструкции.

управляющая-строка:
    #define идентификатор последовательность-лексем
    #define идентификатор ( идентификатор, ..., идентификатор) последовательность-лексем
    #undef идентификатор
    #include <имя-файла>
    #include "имя-файла"
    #include последовательность-лексем
    #line константа "идентификатор"
    #line константа
    #error последовательность-лексемнеоб
    #pragma последовательность-лексемнеоб
    #
    условная-конструкция-препроцессора
условная-конструкция-препроцессора:
    if-строка текст elif-части else-частьнеоб #endif
if-строка:
    #if константное-выражение
    #ifdef идентификатор
    #ifndef идентификатор
elif-части:
    elif-строка текст
    elif-частинеоб
elif-строка:
    #elif константное-выражение
else-часть:
    else-строка текст
else-строка:
    #else

Оглавление книги


Генерация: 0.335. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз