Udostępnij za pośrednictwem


Podsumowanie gramatyki preprocesora (C/C++)

W tym artykule opisano formalną gramatykę preprocesora C i C++. Obejmuje on składnię dyrektyw i operatorów przetwarzania wstępnego. Aby uzyskać więcej informacji, zobacz Preprocesor i Pragma dyrektywy oraz __pragma słowa kluczowe i ._Pragma

Definicje dla podsumowania dotyczącego gramatyki

Terminale są punktami końcowymi w definicji składni. Nie jest możliwe żadne inne rozwiązanie. Terminale obejmują zestaw zastrzeżonych wyrazów i identyfikatorów zdefiniowanych przez użytkownika.

Symbole zastępcze w składni są symbolami zastępczymi. Większość z tych elementów jest definiowana w innym miejscu w tym podsumowaniu składni. Definicje mogą być rekursywne. Następujące wartości nieterminalne są zdefiniowane w sekcji Konwencje leksykalne w dokumentacji językowej języka C++:

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

Opcjonalny składnik jest wskazywany przez wyrażenie zgody na indeks dolny. Na przykład następująca składnia wskazuje opcjonalne wyrażenie ujęte w nawiasy klamrowe:

{expressionZdecydować }

Konwencje dokumentów

Konwencje używają różnych atrybutów czcionki dla różnych składników składni. Symbole i czcionki są następujące:

Atrybut opis
nonterminal Typ kursywy wskazuje nieterminalne.
#include Terminale w typie pogrubienia to zastrzeżone wyrazy i symbole, które należy wprowadzić, jak pokazano. Znaki w tym kontekście są zawsze uwzględniane wielkości liter.
Zdecydować Nieterminalne, po których następuje wyrażenie zgody , są zawsze opcjonalne.
domyślny typface Znaki w zestawie opisanym lub wymienionym w tym typface mogą być używane jako terminale w instrukcjach.

Dwukropek (:) po nieterminalnym wprowadza jego definicję. Definicje alternatywne są wyświetlane w oddzielnych wierszach.

W blokach składni kodu te symbole w domyślnym kroju typów mają specjalne znaczenie:

Symbol opis
[ ] Nawiasy kwadratowe otaczają opcjonalny element.
{ | } Nawiasy klamrowe otaczają elementy alternatywne oddzielone pionowymi słupkami.
... Wskazuje, że poprzedni wzorzec elementu można powtórzyć.

W blokach składni kodu przecinki (,), kropki (.), średniki (;), dwukropki (:), nawiasy (( )), cudzysłowy (), cudzysłowy ("') i cudzysłowy () są literałami.

Gramatyka preprocesora

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

constant-expression:
defined( identifier )
defined identifier
 dowolne inne wyrażenie stałe

conditional:
if-partelif-partsopt opt 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:
 Ciąg token

token:
keyword
identifier
constant
operator
punctuator

filename:
 Legalna nazwa pliku systemu operacyjnego

path-spec:
 Ścieżka pliku prawnego

text:
 Dowolna sekwencja tekstu

Uwaga

Poniższe wartości nieterminalne są rozszerzane w sekcji Konwencje leksykalne w dokumentacji językowej języka C++: constant, , constant-expressionidentifier, keyword, operatori punctuator.

Zobacz też

Dokumentacja preprocesora języka C/C++