omp_specification_directive: omp_threadprivate_directive ; omp_execution_directive: omp_parallel_begin_directive | omp_parallel_end_directive | omp_sections_begin_directive | omp_sections_end_directive | omp_section_directive | omp_do_begin_directive | omp_do_end_directive | omp_single_begin_directive | omp_single_end_directive | omp_workshare_begin_directive | omp_workshare_end_directive | omp_parallel_do_begin_directive | omp_parallel_do_end_directive | omp_parallel_sections_begin_directive | omp_parallel_sections_end_directive | omp_parallel_workshare_begin_directive | omp_parallel_workshare_end_directive | omp_master_begin_directive | omp_master_end_directive | omp_ordered_begin_directive | omp_ordered_end_directive | omp_barrier_directive | omp_atomic_directive | omp_flush_directive | omp_critical_begin_directive | omp_critical_end_directive ; ompdvm_onethread: OMPDVM_ONETHREAD end_spec { $$ = get_bfnd(fi,OMP_ONETHREAD_DIR,SMNULL,LLNULL,LLNULL,LLNULL); }; omp_parallel_end_directive: OMPDVM_ENDPARALLEL end_spec { $$ = make_endparallel(); }; omp_parallel_begin_directive: OMPDVM_PARALLEL end_spec opt_key_word parallel_clause_list { $$ = make_parallel(); $$->entry.Template.ll_ptr1 = $4; opt_kwd_ = NO; } | OMPDVM_PARALLEL end_spec opt_key_word { $$ = make_parallel(); opt_kwd_ = NO; }; parallel_clause_list: opt_comma opt_key_word parallel_clause opt_key_word { $$ = set_ll_list($3,LLNULL,EXPR_LIST); } | parallel_clause_list opt_comma opt_key_word parallel_clause opt_key_word { $$ = set_ll_list($1,$4,EXPR_LIST); } ; parallel_clause: ompprivate_clause | ompreduction_clause | ompshared_clause | ompdefault_clause | ompfirstprivate_clause | omplastprivate_clause | ompcopyin_clause | ompif_clause | ompnumthreads_clause ; omp_variable_list_in_par: op_slash_1 LEFTPAR op_slash_0 omp_variable_list RIGHTPAR { $$ = $4; }; ompprivate_clause: PRIVATE omp_variable_list_in_par { $$ = make_llnd(fi,OMP_PRIVATE,$2,LLNULL,SMNULL); }; ompfirstprivate_clause: OMPDVM_FIRSTPRIVATE omp_variable_list_in_par { $$ = make_llnd(fi,OMP_FIRSTPRIVATE,$2,LLNULL,SMNULL); } ; omplastprivate_clause: OMPDVM_LASTPRIVATE omp_variable_list_in_par { $$ = make_llnd(fi,OMP_LASTPRIVATE,$2,LLNULL,SMNULL); } ; ompcopyin_clause: OMPDVM_COPYIN omp_variable_list_in_par { $$ = make_llnd(fi,OMP_COPYIN,$2,LLNULL,SMNULL); } ; ompshared_clause: OMPDVM_SHARED omp_variable_list_in_par { $$ = make_llnd(fi,OMP_SHARED,$2,LLNULL,SMNULL); } ; ompdefault_clause: DEFAULT_CASE LEFTPAR needkeyword def_expr RIGHTPAR { $$ = make_llnd(fi,OMP_DEFAULT,$4,LLNULL,SMNULL); } ; def_expr: PRIVATE { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "private"; $$->type = global_string; } | OMPDVM_SHARED { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "shared"; $$->type = global_string; } | OMPDVM_NONE { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "none"; $$->type = global_string; } ; ompif_clause: OMPDVM_IF LEFTPAR expr RIGHTPAR { $$ = make_llnd(fi,OMP_IF,$3,LLNULL,SMNULL); } ; ompnumthreads_clause: OMPDVM_NUM_THREADS LEFTPAR expr RIGHTPAR { $$ = make_llnd(fi,OMP_NUM_THREADS,$3,LLNULL,SMNULL); } ; ompreduction_clause: REDUCTION LEFTPAR ompreduction RIGHTPAR { PTR_LLND q; q = set_ll_list($3,LLNULL,EXPR_LIST); $$ = make_llnd(fi,OMP_REDUCTION,q,LLNULL,SMNULL); }; ompreduction: opt_key_word ompreduction_op COLON ompreduction_vars {$$ = make_llnd(fi,DDOT,$2,$4,SMNULL);} ; ompreduction_vars: variable_list; ompreduction_op: PLUS { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "+"; $$->type = global_string; } | MINUS { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "-"; $$->type = global_string; } | ASTER { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "*"; $$->type = global_string; } | SLASH { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "/"; $$->type = global_string; } | MIN { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "min"; $$->type = global_string; } | MAX { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "max"; $$->type = global_string; } | OR { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) ".or."; $$->type = global_string; } | AND { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) ".and."; $$->type = global_string; } | EQV { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) ".eqv."; $$->type = global_string; } | NEQV { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) ".neqv."; $$->type = global_string; } | IAND { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "iand"; $$->type = global_string; } | IEOR { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "ieor"; $$->type = global_string; } | IOR { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "ior"; $$->type = global_string; } | UNKNOWN { err("Illegal reduction operation name", 70); errcnt--; $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "unknown"; $$->type = global_string; } ; omp_sections_begin_directive: OMPDVM_SECTIONS end_spec opt_key_word sections_clause_list { $$ = make_sections($4); opt_kwd_ = NO; } | OMPDVM_SECTIONS end_spec opt_key_word { $$ = make_sections(LLNULL); opt_kwd_ = NO; }; sections_clause_list: opt_comma opt_key_word sections_clause opt_key_word { $$ = set_ll_list($3,LLNULL,EXPR_LIST); } | sections_clause_list opt_comma opt_key_word sections_clause opt_key_word { $$ = set_ll_list($1,$4,EXPR_LIST); } ; sections_clause: ompprivate_clause | ompreduction_clause | ompfirstprivate_clause | omplastprivate_clause ; omp_sections_end_directive: OMPDVM_ENDSECTIONS end_spec opt_key_word ompnowait_clause { PTR_LLND q; $$ = make_endsections(); q = set_ll_list($4,LLNULL,EXPR_LIST); $$->entry.Template.ll_ptr1 = q; opt_kwd_ = NO; } | OMPDVM_ENDSECTIONS end_spec opt_key_word { $$ = make_endsections(); opt_kwd_ = NO; }; omp_section_directive: OMPDVM_SECTION end_spec { $$ = make_ompsection(); }; omp_do_begin_directive: OMPDVM_DO end_spec opt_key_word do_clause_list { $$ = get_bfnd(fi,OMP_DO_DIR,SMNULL,$4,LLNULL,LLNULL); opt_kwd_ = NO; } | OMPDVM_DO end_spec opt_key_word { $$ = get_bfnd(fi,OMP_DO_DIR,SMNULL,LLNULL,LLNULL,LLNULL); opt_kwd_ = NO; }; omp_do_end_directive: OMPDVM_ENDDO end_spec opt_key_word ompnowait_clause { PTR_LLND q; q = set_ll_list($4,LLNULL,EXPR_LIST); $$ = get_bfnd(fi,OMP_END_DO_DIR,SMNULL,q,LLNULL,LLNULL); opt_kwd_ = NO; } | OMPDVM_ENDDO end_spec opt_key_word { $$ = get_bfnd(fi,OMP_END_DO_DIR,SMNULL,LLNULL,LLNULL,LLNULL); opt_kwd_ = NO; }; do_clause_list: opt_comma opt_key_word do_clause opt_key_word { $$ = set_ll_list($3,LLNULL,EXPR_LIST); } | do_clause_list opt_comma opt_key_word do_clause opt_key_word { $$ = set_ll_list($1,$4,EXPR_LIST); } ; do_clause: ompprivate_clause | ompreduction_clause | ompfirstprivate_clause | omplastprivate_clause | ompschedule_clause | ompordered_clause ; ompordered_clause: OMPDVM_ORDERED { /*$$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "ORDERED"; $$->type = global_string;*/ $$ = make_llnd(fi,OMP_ORDERED,LLNULL,LLNULL,SMNULL); } ; ompschedule_clause: OMPDVM_SCHEDULE LEFTPAR needkeyword ompschedule_op COMMA expr RIGHTPAR { $$ = make_llnd(fi,OMP_SCHEDULE,$4,$6,SMNULL); } | OMPDVM_SCHEDULE LEFTPAR needkeyword ompschedule_op RIGHTPAR { $$ = make_llnd(fi,OMP_SCHEDULE,$4,LLNULL,SMNULL); } ; ompschedule_op: STATIC { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "STATIC"; $$->type = global_string; } | DYNAMIC { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "DYNAMIC"; $$->type = global_string; } | OMPDVM_GUIDED { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "GUIDED"; $$->type = global_string; } | OMPDVM_RUNTIME { $$ = make_llnd(fi,KEYWORD_VAL,LLNULL,LLNULL,SMNULL); $$->entry.string_val = (char *) "RUNTIME"; $$->type = global_string; } ; omp_single_begin_directive: OMPDVM_SINGLE end_spec opt_key_word single_clause_list { $$ = make_single(); $$->entry.Template.ll_ptr1 = $4; opt_kwd_ = NO; } | OMPDVM_SINGLE end_spec opt_key_word { $$ = make_single(); opt_kwd_ = NO; }; single_clause_list: opt_comma opt_key_word single_clause opt_key_word { $$ = set_ll_list($3,LLNULL,EXPR_LIST); } | single_clause_list opt_comma opt_key_word single_clause opt_key_word { $$ = set_ll_list($1,$4,EXPR_LIST); } ; single_clause: ompprivate_clause | ompfirstprivate_clause ; omp_single_end_directive: OMPDVM_ENDSINGLE end_spec opt_key_word end_single_clause_list { $$ = make_endsingle(); $$->entry.Template.ll_ptr1 = $4; opt_kwd_ = NO; } | OMPDVM_ENDSINGLE end_spec opt_key_word { $$ = make_endsingle(); opt_kwd_ = NO; }; end_single_clause_list: opt_comma opt_key_word end_single_clause opt_key_word { $$ = set_ll_list($3,LLNULL,EXPR_LIST); } | end_single_clause_list opt_comma opt_key_word end_single_clause opt_key_word { $$ = set_ll_list($1,$4,EXPR_LIST); } ; end_single_clause: ompnowait_clause | ompcopyprivate_clause ; ompcopyprivate_clause: OMPDVM_COPYPRIVATE omp_variable_list_in_par { $$ = make_llnd(fi,OMP_COPYPRIVATE,$2,LLNULL,SMNULL); } ; ompnowait_clause: OMPDVM_NOWAIT { $$ = make_llnd(fi,OMP_NOWAIT,LLNULL,LLNULL,SMNULL); } ; omp_workshare_begin_directive: OMPDVM_WORKSHARE end_spec { $$ = make_workshare(); }; omp_workshare_end_directive: OMPDVM_ENDWORKSHARE end_spec opt_key_word ompnowait_clause { PTR_LLND q; $$ = make_endworkshare(); q = set_ll_list($4,LLNULL,EXPR_LIST); $$->entry.Template.ll_ptr1 = q; opt_kwd_ = NO; } | OMPDVM_ENDWORKSHARE end_spec opt_key_word { $$ = make_endworkshare(); opt_kwd_ = NO; }; omp_parallel_do_begin_directive: OMPDVM_PARALLELDO end_spec opt_key_word paralleldo_clause_list { $$ = get_bfnd(fi,OMP_PARALLEL_DO_DIR,SMNULL,$4,LLNULL,LLNULL); opt_kwd_ = NO; } | OMPDVM_PARALLELDO end_spec opt_key_word { $$ = get_bfnd(fi,OMP_PARALLEL_DO_DIR,SMNULL,LLNULL,LLNULL,LLNULL); opt_kwd_ = NO; } ; paralleldo_clause_list: opt_comma opt_key_word paralleldo_clause opt_key_word { $$ = set_ll_list($3,LLNULL,EXPR_LIST); } | paralleldo_clause_list opt_comma opt_key_word paralleldo_clause opt_key_word { $$ = set_ll_list($1,$4,EXPR_LIST); } ; paralleldo_clause: ompprivate_clause | ompreduction_clause | ompshared_clause | ompdefault_clause | ompfirstprivate_clause | omplastprivate_clause | ompcopyin_clause | ompif_clause | ompnumthreads_clause | ompschedule_clause | ompordered_clause ; omp_parallel_do_end_directive: OMPDVM_ENDPARALLELDO end_spec { $$ = get_bfnd(fi,OMP_END_PARALLEL_DO_DIR,SMNULL,LLNULL,LLNULL,LLNULL); }; omp_parallel_sections_begin_directive: OMPDVM_PARALLELSECTIONS end_spec opt_key_word parallel_clause_list { $$ = make_parallelsections($4); opt_kwd_ = NO; } | OMPDVM_PARALLELSECTIONS end_spec opt_key_word { $$ = make_parallelsections(LLNULL); opt_kwd_ = NO; }; omp_parallel_sections_end_directive: OMPDVM_ENDPARALLELSECTIONS end_spec { $$ = make_endparallelsections(); }; omp_parallel_workshare_begin_directive: OMPDVM_PARALLELWORKSHARE end_spec opt_key_word parallel_clause_list { $$ = make_parallelworkshare(); $$->entry.Template.ll_ptr1 = $4; opt_kwd_ = NO; } | OMPDVM_PARALLELWORKSHARE end_spec opt_key_word { $$ = make_parallelworkshare(); opt_kwd_ = NO; }; omp_parallel_workshare_end_directive: OMPDVM_ENDPARALLELWORKSHARE end_spec { $$ = make_endparallelworkshare(); }; omp_threadprivate_directive: OMPDVM_THREADPRIVATE in_dcl omp_variable_list_in_par { $$ = get_bfnd(fi,OMP_THREADPRIVATE_DIR, SMNULL, $3, LLNULL, LLNULL); }; omp_master_begin_directive: OMPDVM_MASTER end_spec { $$ = make_master(); }; omp_master_end_directive: OMPDVM_ENDMASTER end_spec { $$ = make_endmaster(); }; omp_ordered_begin_directive: OMPDVM_ORDERED end_spec { $$ = make_ordered(); }; omp_ordered_end_directive: OMPDVM_ENDORDERED end_spec { $$ = make_endordered(); }; omp_barrier_directive: OMPDVM_BARRIER end_spec { $$ = get_bfnd(fi,OMP_BARRIER_DIR,SMNULL,LLNULL,LLNULL,LLNULL); }; omp_atomic_directive: OMPDVM_ATOMIC end_spec { $$ = get_bfnd(fi,OMP_ATOMIC_DIR,SMNULL,LLNULL,LLNULL,LLNULL); }; omp_flush_directive: OMPDVM_FLUSH end_spec omp_variable_list_in_par { $$ = get_bfnd(fi,OMP_FLUSH_DIR,SMNULL,$3,LLNULL,LLNULL); } | OMPDVM_FLUSH end_spec { $$ = get_bfnd(fi,OMP_FLUSH_DIR,SMNULL,LLNULL,LLNULL,LLNULL); } ; omp_critical_begin_directive: OMPDVM_CRITICAL end_spec LEFTPAR ident RIGHTPAR { $$ = make_critical(); $$->entry.Template.ll_ptr1 = $4; } | OMPDVM_CRITICAL end_spec { $$ = make_critical(); } ; omp_critical_end_directive: OMPDVM_ENDCRITICAL end_spec LEFTPAR ident RIGHTPAR { $$ = make_endcritical(); $$->entry.Template.ll_ptr1 = $4; } | OMPDVM_ENDCRITICAL end_spec { $$ = make_endcritical(); } ; omp_common_var: SLASH name op_slash_1 SLASH op_slash_0 { PTR_SYMB s; PTR_LLND l; s = make_common($2); l = make_llnd(fi,VAR_REF, LLNULL, LLNULL, s); $$ = make_llnd(fi,OMP_THREADPRIVATE, l, LLNULL, SMNULL); }; omp_variable_list: omp_common_var { $$ = set_ll_list($1,LLNULL,EXPR_LIST); } | ident { $$ = set_ll_list($1,LLNULL,EXPR_LIST); } | omp_variable_list COMMA omp_common_var { $$ = set_ll_list($1,$3,EXPR_LIST); } | omp_variable_list COMMA ident { $$ = set_ll_list($1,$3,EXPR_LIST); } ; op_slash_1 : { operator_slash = 1; }; op_slash_0 : { operator_slash = 0; };