Edit

C. OpenMP C and C++ grammar

Learn about the grammar rules and syntax extensions in C and C++ for OpenMP, a parallel programming framework.

C.1 notation

The grammar rules consist of the name for a non-terminal, followed by a colon, followed by replacement alternatives on separate lines.

The syntactic expression termopt indicates that the term is optional within the replacement.

The syntactic expression termoptseq is equivalent to term-seqopt with the following additional rules:

term-seq:
 term
 term-seq term
 term-seq , term

C.2 rules

The notation is described in section 6.1 of the C standard. This grammar appendix shows the extensions to the base language grammar for the OpenMP C and C++ directives.

/* in C++ (ISO/IEC 14882:1998) */

statement-seq:
 statement
 openmp-directive
 statement-seq statement
 statement-seq openmp-directive

/* in C90 (ISO/IEC 9899:1990) */

statement-list:
 statement
 openmp-directive
 statement-list statement
 statement-list openmp-directive

/* in C99 (ISO/IEC 9899:1999) */

block-item:
 declaration
 statement
 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:
 statement

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:
 One of: + \* - & ^ | && ||

/* in C */

variable-list:
 identifier
 variable-list , identifier

/* in C++ */

variable-list:
 id-expression
 variable-list , id-expression