C. Gramática de OpenMP C y C++
C.1 Notación
Las reglas gramaticales constan del nombre de un no terminal, seguido de dos puntos, seguidos de alternativas de reemplazo en líneas independientes.
El término de expresión sintáctica opt indica que el término es opcional dentro del reemplazo.
El término de expresión sintáctica optseq equivale a term-seqopt con las siguientes reglas adicionales:
term-seq:
term
term-seq term
term-seq ,
term
C.2 Reglas
La notación se describe en la sección 6.1 del estándar de C. En este apéndice de gramática se muestran las extensiones de la gramática del lenguaje base para las directivas de C y C++ de OpenMP.
/* in C++ (ISO/IEC 14882:1998) */
statement-seq:
instrucción
openmp-directive
statement-seq statement
statement-seq openmp-directive
/* in C90 (ISO/IEC 9899:1990) */
statement-list:
instrucción
openmp-directive
statement-list statement
statement-list openmp-directive
/* in C99 (ISO/IEC 9899:1999) */
block-item:
declaration
instrucción
openmp-directive
/* standard statements */
instrucción:
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:
instrucción
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 (
expression )
num_threads (
expression )
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
/* standard declarations */
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:
Uno de: + \* - & ^ | && ||
/* in C */
variable-list:
identifier
variable-list ,
identifier
/* in C++ */
variable-list:
id-expression
variable-list ,
id-expression