C. C- und C++-Grammatik in OpenMP
C.1 Notation
Die Grammatikregeln bestehen aus dem Namen für ein Nicht-Terminal, gefolgt von einem Doppelpunkt, gefolgt von Ersetzungsalternativen in separaten Zeilen.
Der Syntaktikausdrucksausdruckopt gibt an, dass der Ausdruck innerhalb des Ersetzungstyps optional ist.
Der syntaktische Ausdruck termoptseq entspricht term-seqopt mit den folgenden zusätzlichen Regeln:
term-seq:
term
term-seq term
term-seq ,
term
C.2 Regeln
Die Notation wird in Abschnitt 6.1 des C-Standards beschrieben. In diesem Grammatikanhang sind die Erweiterungen für die Grammatik der Basissprache für die OpenMP C- und C++-Direktiven aufgeführt.
/* in C++ (ISO/IEC 14882:1998) */
statement-seq:
Anweisung
openmp-directive
statement-seq statement
statement-seq openmp-directive
/* in C90 (ISO/IEC 9899:1990) */
statement-list:
Anweisung
openmp-directive
statement-list-Anweisung
statement-list openmp-directive
/* in C99 (ISO/IEC 9899:1999) */
block-item:
declaration
Anweisung
openmp-directive
/* standard statements */
statement:
openmp-construct
openmp-construct:
parallel-construct
for-construct
sections-construct
single-construct
parallel-for-construct
parallel-sections-construct
master-construct
critical-construct
atomic-construct
ordered-construct
openmp-directive:
barrier-directive
flush-directive
structured-block:
Anweisung
parallel-construct:
parallel-directive structured-block
parallel-directive:
# pragma omp parallel
parallel-clauseoptseq new-line
parallel-clause:
unique-parallel-clause
data-clause
unique-parallel-clause:
if (
Ausdruck )
num_threads (
Ausdruck )
for-construct:
for-directive iteration-statement
for-directive:
# pragma omp for
for-clauseoptseq new-line
for-clause:
unique-for-clause
data-clause
nowait
unique-for-clause:
ordered
schedule (
schedule-kind )
schedule (
schedule-kind ,
expression )
schedule-kind:
static
dynamic
guided
runtime
sections-construct:
sections-directive section-scope
sections-directive:
# pragma omp sections
sections-clauseoptseq new-line
sections-clause:
data-clause
nowait
section-scope:
{ section-sequence }
section-sequence:
section-directiveopt structured-block
section-sequence section-directive structured-block
section-directive:
# pragma omp section
new-line
single-construct:
single-directive structured-block
single-directive:
# pragma omp single
single-clauseoptseq new-line
single-clause:
data-clause
nowait
parallel-for-construct:
parallel-for-directive iteration-statement
parallel-for-directive:
# pragma omp parallel for
parallel-for-clauseoptseq new-line
parallel-for-clause:
unique-parallel-clause
unique-for-clause
data-clause
parallel-sections-construct:
parallel-sections-directive section-scope
parallel-sections-directive:
# pragma omp parallel sections
parallel-sections-clauseoptseq new-line
parallel-sections-clause:
unique-parallel-clause
data-clause
master-construct:
master-directive structured-block
master-directive:
# pragma omp master
new-line
critical-construct:
critical-directive structured-block
critical-directive:
# pragma omp critical
region-phraseopt new-line
region-phrase:
(identifier)
barrier-directive:
# pragma omp barrier
new-line
atomic-construct:
atomic-directive expression-statement
atomic-directive:
# pragma omp atomic
new-line
flush-directive:
# pragma omp flush
flush-varsopt new-line
flush-vars:
(variable-list)
ordered-construct:
ordered-directive structured-block
ordered-directive:
# pragma omp ordered
new-line
/* Standarddeklarationen */
declaration:
threadprivate-directive
threadprivate-directive:
# pragma omp threadprivate (
variable-list )
new-line
data-clause:
private (
variable-list )
copyprivate (
variable-list )
firstprivate (
variable-list )
lastprivate (
variable-list )
shared (
variable-list )
default ( shared )
default ( none )
reduction (
reduction-operator :
variable-list )
copyin (
variable-list )
reduction-operator:
Eines der Folgenden: + \* - & ^ | && ||
/* in C */
variable-list:
identifier
variable-list ,
identifier
/* in C++ */
variable-list:
id-expression
variable-list ,
id-expression