Поделиться через


Общие сведения о грамматике препроцессора (C/C++)

В этой статье описывается официальная грамматика препроцессора C и C++. Он охватывает синтаксис директив и операторов предварительной обработки. Дополнительные сведения см. в директивах Preprocessor и Pragma и _Pragma __pragma ключевых словах.

Общие сведения об определениях для грамматики

Терминальные слова — это конечные точки в определении синтаксиса. Никакое другое разрешение невозможно. Терминальные слова включают в себя набор зарезервированных ключевых слов и определенные пользователем идентификаторы.

Нетерминальные слова — это местозаполнители в синтаксисе. Большая их часть определена в других местах этой сводки синтаксиса. Определения могут быть рекурсивными. В разделе Лексических соглашений справочника по языку C++ определены следующие нетерминалы:

constant, , constant-expressionkeywordidentifieroperator,punctuator

Необязательный компонент обозначается атрибутом opt в нижнем индексе. Например, следующий синтаксис указывает необязательное выражение, заключенное в фигурные скобки:

{необ.expression }

Соглашения о документах

В соглашениях используются разные атрибуты шрифтов для различных компонентов синтаксиса. Ниже перечислены символы и шрифты.

Атрибут Description
nonterminal Курсивом выделяются нетерминальные символы.
#include Терминальные символы, выделенные жирным шрифтом, представляют литеральные зарезервированные слова и символы, которые должны вводиться, как показано. В знаках в этом контексте всегда учитывается регистр.
необ. Нетерминальные символы, за которыми следует атрибут opt, всегда являются необязательными.
Шрифт по умолчанию Знаки в наборе, описанные или перечисленные в этом шрифте, можно использовать в качестве терминальных символов в операторах.

Двоеточие (:) после нетерминального вводит его определение. Альтернативные определения перечисляются в отдельных строках.

В блоках синтаксиса кода эти символы в шрифте по умолчанию имеют особое значение:

Символ Description
[ ] Квадратные скобки окружают необязательный элемент.
{ | } Фигурные скобки окружают альтернативные элементы, разделенные вертикальными полосами.
... Указывает, что предыдущий шаблон элемента может повторяться.

В блоках синтаксиса кода запятые (,), запятые (), точки (.), точки с запятыми (:;), двоеточия (), круглые скобки (), двойные кавычки (( )") и одинарные кавычки (') — литералы.

Грамматика препроцессора

control-line:
#define identifier token-stringнеоб.
#defineidentifier ( identifieropt , ... , identifieropt opt opt ) token-string
#include "path-spec"
#include <path-spec>
#line digit-sequence "filename"необ.
#undef identifier
#error token-string
#pragma token-string

constant-expression:
defined( identifier )
defined identifier
 любое другое константное выражение

conditional:
if-part elif-partsнеоб. else-partнеоб. endif-line

if-part:
if-line text

if-line:
#if constant-expression
#ifdef identifier
#ifndef identifier

elif-parts:
elif-line text
elif-parts elif-line text

elif-line:
#elif constant-expression

else-part:
else-line text

else-line:
#else

endif-line:
#endif

digit-sequence:
digit
digit-sequence digit

digit: один из
0 1 2 3 4 5 6 7 8 9

token-string:
 Строка token

token:
keyword
identifier
constant
operator
punctuator

filename:
 Юридическое имя файла операционной системы

path-spec:
 Допустимый путь к файлу

text:
 Любая последовательность текста

Примечание.

В разделе "Лексические соглашения" справочника по языку C++ развернуты следующие нетерминалы: constant, , constant-expression, identifierkeywordи operatorpunctuator.

См. также

Справочник по препроцессору в C/C++