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