Sdílet prostřednictvím


Souhrn gramatiky preprocesoru (C/C++)

Tento článek popisuje formální gramatiku preprocesoru jazyka C a C++. Zahrnuje syntaxi direktiv a operátorů předběžného zpracování. Další informace naleznete v tématu Preprocessor a Direktivy Pragma a __pragma klíčová slova._Pragma

Definice shrnutí gramatiky

Terminály jsou koncové body v definici syntaxe. Žádné jiné řešení není možné. Terminály obsahují sadu vyhrazených slov a uživatelské identifikátory.

Neterminály jsou zástupné symboly v syntaxi. Většina je definována jinde v tomto souhrnu syntaxe. Definice mohou být rekurzivní. Následující neterminaly jsou definovány v části Lexikální konvence referenční dokumentace jazyka C++:

constant, constant-expression, identifier, keyword, , operatorpunctuator

Volitelná komponenta je označená dolním indexem. Například následující syntaxe označuje volitelný výraz uzavřený ve složených závorkách:

{expressionvolit }

Konvence dokumentů

Úmluvy používají odlišné atributy písma pro různé součásti syntaxe. Symboly a písma jsou následující:

Atribut Popis
nonterminal Kurzíva označuje neterminály.
#include Terminály tučného typu jsou slova a symboly vyhrazená literály, které je nutné zadat tak, jak je znázorněno. Znaky v tomto kontextu vždy rozlišují velká a malá písmena.
volit Neterminaly následované výslovným souhlasem jsou vždy volitelné.
výchozí písmo Znaky ze sady, které jsou popsány nebo uvedeny v tomto písmu, lze použít jako terminály v příkazech.

Dvojtečka (:) po netermiálním objektu zavádí jeho definici. Alternativní definice jsou uvedeny na samostatných řádcích.

V blocích syntaxe kódu mají tyto symboly výchozího písma zvláštní význam:

Symbol Popis
[ ] Hranaté závorky obklopují volitelný prvek.
{ | } Složené závorky obklopují alternativní prvky oddělené svislými pruhy.
... Označuje, že předchozí vzor prvku lze opakovat.

V blocích syntaxe kódu jsou literály čárky (,), tečky (.), středníky (;), dvojtečky (:), závorky (( )), dvojité uvozovky (") a jednoduché uvozovky (').

Gramatika preprocesoru

control-line:
#defineidentifier token-stringvolit
#defineidentifier ( identifieropt , ... , identifieropt opt ) token-string
#include "path-spec"
#include <path-spec>
#linedigit-sequence "filename"volit
#undef identifier
#error token-string
#pragma token-string

constant-expression:
defined( identifier )
defined identifier
 jakýkoli jiný konstantní výraz

conditional:
if-partelif-partsopt opt 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: jeden z
0 1 2 3 4 5 6 7 8 9

token-string:
 Řetězec token

token:
keyword
identifier
constant
operator
punctuator

filename:
 Název souboru právního operačního systému

path-spec:
 Cesta k souboru z právních předpisů

text:
 Libovolná posloupnost textu

Poznámka:

Následující neterminaly jsou rozšířeny v části Lexikální konvence jazyka C++:constant , , constant-expression, identifierkeyword, operatora punctuator.

Viz také

Referenční dokumentace preprocesoru C/C++