|   |
| Objektorientiertes Programmieren mit C++ und JAVA |
| Axel Rogat |
|   | A   C++-Grammatik |   |
Die hier aufgeführte kontextfreie Grammatik entspricht der des
Standard-Entwurfs des ANSI-Komittees auf dem Stand von 1997.
Sie ist direkt aus dem ANSI-Dokument übernommen worden -- die Namen aller
Symbole wurden in Englisch belassen.
Es sind dazu einige Vorbemerkungen nötig: Diese Grammatik beschreibt
nämlich eigentlich eine wesentlich größere Sprache als
C++.
C++ ist (wie die meisten höheren Programmiersprachen) eine
kontextsensitive Sprache, so daß zu der hier angegebenen
kontextfreien
Grammatik kontextsensitive Zusätze erforderlich sind. Dort wird
beispielsweise festgelegt, was Gültigkeitsbereiche von Bezeichnern
sind, welche Typen in welchen Zusammenhängen miteinander
verträglich sind, wann case-Statements erlaubt sind
(nämlich
nur in einem switch-Block), etc. Im ANSI-Dokument sind sie in
ausführlicher Prosa formuliert, werden hier aber ausgelassen.
Außerdem ist die Grammatik in dieser Form nicht eindeutig, und es
werden zusätzliche Regeln
(wiederum umgangssprachlich) angegeben, um diese Mehrdeutigkeiten
aufzulösen. Eine äquivalente eindeutige Grammatik wäre zu
unübersichtlich geworden, ohne Vorteile zu bringen.
Die erweiterte Backus-Naur-Form bringt besonders bei klammer-intensiven
Programmiersprachen wie C++
Probleme mit sich, da die Meta-Zeichen
( ) { } [ ] | der EBNF mit Tokens der Sprache verwechselt
werden könnten -- diese müßten dann "{",
usw. geschrieben werden.
Deshalb wird hier wie folgt verfahren: Verschachtelte Strukturen werden
durch Einführung genügend vieler Nicht-Terminale eliminiert. Dadurch
kann die Iteration mit { und } ganz entfallen. Die
Option
[symbol] wird geschrieben als symbolopt.
Die Alternative | ist nicht nötig, wenn mehrere Regeln zu
einem Nicht-Terminal einfach untereinander geschrieben werden. Für eine
Auswahl aus einer Vielzahl von Einzel-Tokens schreibt man "one of..."
Terminalsymbole der Grammatik:
Die Nicht-Terminalsymbole sind direkt aus den folgenden
Produktionen ablesbar. Das Startsymbol ist
translation-unit in Abschnitt A.4. (Der
Abschnitt A.1 "Introduction" ist hier ausgelassen.)
f<1>(0) könnte bedeuten:
Eine Semantik-Regel erzwingt die erste Interpretation: Wenn f Name
eines Templates ist, dann beginnt mit f< immer ein
qualifizierter template-name.
asm do if return try
auto double inline short
typedef
bool dynamic_cast int signed
typeid
break else long sizeof
typename
case enum mutable static
union
catch explicit namespace
static_cast unsigned
char extern new struct
using
class export operator switch
virtual
const false private template
void
const_cast float protected this
volatile
continue for public throw
wchar_t
default friend register true
while
delete goto reinterpret_cast
! &= ++ -> /=
<<= >> |
!= ( += ->* :
<= >>= |=
% ) , . ::
= ? ||
%= * - .* ;
== ^ }
& *= -- ... <
> ^= ~
&& + -= / <<
>= {
namespace-alias
template-id
\U hex-quad hex-quad
identifier
pp-number
character-literal
string-literal
preprocessing-op-or-punc
keyword
literal
operator
punctuator
"q-char-sequence
"
h-char-sequence h-char
q-char-sequence q-char
pp-number digit
pp-number nondigit
pp-number e
sign
pp-number E
sign
pp-number .
identifier nondigit
identifier digit
a b c d e f
g h i j k l
m
n o p q r s
t u v w x y
z
A B C D E F
G H I J K L
M
N O P Q R S
T U V W X Y
Z _
0 1 2 3 4
5 6 7 8 9
{ } [ ] # ##
( )
<: :> <% %> %:
%:%: ; : ...
new delete ? :: .
.*
+ - * / %
^ & | ~
! = < > +=
-= *= /= %=
^= &= |= <<
>> >>= <<= ==
!=
<= >= && ||
++ -- , ->* ->
and and_eq bitand bitor compl
not not_eq or or_eq
xor xor_eq
character-literal
floating-literal
string-literal
boolean-literal
octal-literal
integer-suffixopt
hexadecimal-literal
integer-suffixopt
decimal-literal digit
octal-literal
octal-digit
0X hexadecimal-digit
hexadecimal-literal
hexadecimal-digit
1 2 3 4 5
6 7 8 9
1 2 3 4 5
6 7
1 2 3 4 5
6 7 8 9
a b c d e f
A B C D E F
long-suffix
unsigned-suffixopt
u U
l L
L' c-char-sequence
'
c-char-sequence c-char
escape-sequence
universal-character-name
octal-escape-sequence
hexadecimal-escape-sequence
\' \" \? \\ \a
\b \f \n \r \t \v
\ octal-digit
octal-digit
\ octal-digit
octal-digit
octal-digit
hexadecimal-escape-sequence
hexadecimal-digit
digit-sequence
exponent-part
floating-suffixopt
digit-sequence .
E signopt
digit-sequence
+ -
digit-sequence digit
f l F L
L"
s-char-sequenceopt
"
s-char-sequence s-char
escape-sequence
universal-character-name
false   true
:: identifier
::
operator-function-id
:: qualified-id
( expression
)
id-expression
qualified-id
operator-function-id
conversion-function-id
template-id
namespace-name
postfix-expression
postfix-expression (
expression-listopt
)
simple-type-specifier
(
expression-listopt
)
postfix-expression .
templateopt
::opt
id-expression
postfix-expression ->
templateopt
::opt
id-expression
postfix-expression .
pseudo-destructor-name
postfix-expression ->
pseudo-destructor-name
postfix-expression ++
postfix-expression --
dynamic_cast <
type-id > (
expression )
static_cast <
type-id > (
expression )
reinterpret_cast <
type-id > (
expression )
const_cast <
type-id > (
expression )
typeid ( expression
)
typeid ( type-id
)
expression-list
::opt
nested-name-specifieropt
~ type-name
--unary-expression
unary-operator
cast-expression
sizeofunary-expression
sizeof ( type-id
)
new-expression
delete-expression
* & + - !
~
::opt new
new-placementopt
( type-id
)
new-initializeropt
direct-new-declarator
direct-new-declarator
[
constant-expression
]
::opt delete
[ ] cast-expression
pm-expression
pm-expression ->*
cast-expression
multiplicative-expression
multiplicative-expression
/ pm-expression
multiplicative-expression
% pm-expression
additive-expression
additive-expression -
multiplicative-expression
shift-expression
shift-expression >>
additive-expression
relational-expression
relational-expression
>
shift-expression
relational-expression
<=
shift-expression
relational-expression
>=
shift-expression
equality-expression
equality-expression !=
relational-expression
and-expression
exclusive-or-expression
inclusive-or-expression
logical-and-expression
logical-or-expression
logical-or-expression
logical-or-expression
assignment-operator
assignment-expression
throw-expression
= *= /= %=
+= -= >>= <<=
&= ^= |=
expression
expression-statement
compound-statement
selection-statement
iteration-statement
jump-statement
declaration-statement
try-block
case
constant-expression
:
statement
default : statement
statement-seq statement
if ( condition
) statement
else statement
switch ( condition
) statement
type-specifier-seq
declarator
do statement
while
( expression
) ;
for (
for-init-statement
conditionopt ;
expressionopt
) statement
simple-declaration
continue ;
return
expressionopt
;
goto identifier
;
declaration-seq
declaration
function-definition
template-declaration
explicit-instantiation
explicit-specialization
linkage-specification
namespace-definition
asm-definition
namespace-alias-definition
using-declaration
using-directive
type-specifier
function-specifier
typedef
register
static
extern
mutable
virtual
explicit
class-specifier
enum-specifier
elaborated-type-specifier
cv-qualifier
char
wchar_t
bool
short
int
long
signed
unsigned
float
double
void
enum-name
typedef-name
enum ::opt
nested-name-specifieropt
identifier
typename ::opt
nested-name-specifier
identifier
typename ::opt
nested-name-specifier
identifier <
template-argument-list
>
enumerator-list
enumerator
namespace-alias
unnamed-namespace-definition
extension-namespace-definition
using :: unqualified-id
;
extern string-literal
declaration
init-declarator-list
ptr-operator declarator
direct-declarator
direct-declarator [
constant-expressionopt
]
( declarator
)
&
::opt
nested-name-specifier
*
cv-qualifier-seqopt
volatile
::opt
nested-name-specifieropt
type-name
direct-abstract-declarator
direct-abstract-declarator
opt [
constant-expressionopt
]
(
abstract-declarator
)
parameter-declaration-list
, ...
parameter-declaration-list
decl-specifier-seq
declarator
decl-specifier-seq
abstract-declaratoropt
decl-specifier-seq
abstract-declaratoropt
=
assignment-expression
decl-specifier-seqopt
declarator
function-try-block
( expression-list
)
{ }
initializer-list
template-id
class-key
nested-name-specifier
identifier
base-clauseopt
struct
union
access-specifier
function-definition ;
opt
qualified-id ;
using-declaration
template-declaration
member-declarator-list
member-declarator
declarator
constant-initializeropt
identifieropt
base-specifier-list
virtual
access-specifieropt
::opt
nested-name-specifieropt
class-name
access-specifier virtual
opt
::opt
nested-name-specifieropt
class-name
protected
public
mem-initializer
identifier
new new[] delete
delete[] () []
+ - * / %
^ & | ~
! = < >
+= -= *= /=
%=
^= &= |= <<
>> >>= <<=
== !=
<= >= && ||
++ -- , ->*
->
template-parameter-list
parameter-declaration
class
identifieropt
= type-id
typename
identifieropt
typename
identifieropt =
type-id
template <
template-parameter-list
> class
identifieropt
template <
template-parameter-list
> class
identifieropt
= template-name
template-argument-list
type-id
template-name
type-specifier-seq
abstract-declarator
type-specifier-seq
type-id-list Bemerkungen zu Mehrdeutigkeiten und zur Semantik:
|   |
34: Oberfläche
Startseite
|
B: Standardfunktionen 
|
|
|   |