spf_directive: spf_analysis | spf_parallel | spf_transform | spf_parallel_reg | spf_end_parallel_reg | spf_checkpoint ; spf_analysis: SPF_ANALYSIS in_unit LEFTPAR analysis_spec_list RIGHTPAR { $$ = get_bfnd(fi,SPF_ANALYSIS_DIR,SMNULL,$4,LLNULL,LLNULL);} ; spf_parallel: SPF_PARALLEL in_unit LEFTPAR parallel_spec_list RIGHTPAR { $$ = get_bfnd(fi,SPF_PARALLEL_DIR,SMNULL,$4,LLNULL,LLNULL);} ; spf_transform: SPF_TRANSFORM in_unit LEFTPAR transform_spec_list RIGHTPAR { $$ = get_bfnd(fi,SPF_TRANSFORM_DIR,SMNULL,$4,LLNULL,LLNULL);} ; spf_parallel_reg: SPF_PARALLEL_REG in_unit region_name { $$ = get_bfnd(fi,SPF_PARALLEL_REG_DIR,$3,LLNULL,LLNULL,LLNULL);} | SPF_PARALLEL_REG in_unit region_name COMMA needkeyword SPF_APPLY_REGION LEFTPAR characteristic_list RIGHTPAR opt_clause_apply_fragment { $$ = get_bfnd(fi,SPF_PARALLEL_REG_DIR,$3,$8,$10,LLNULL);} | SPF_PARALLEL_REG in_unit region_name COMMA needkeyword SPF_APPLY_FRAGMENT LEFTPAR characteristic_list RIGHTPAR opt_clause_apply_region { $$ = get_bfnd(fi,SPF_PARALLEL_REG_DIR,$3,$10,$8,LLNULL);} ; characteristic_list: characteristic { $$ = set_ll_list($1,LLNULL,EXPR_LIST); } | characteristic_list COMMA characteristic { $$ = set_ll_list($1,$3,EXPR_LIST); } ; characteristic: needkeyword SPF_CODE_COVERAGE { $$ = make_llnd(fi,SPF_CODE_COVERAGE_OP,LLNULL,LLNULL,SMNULL);} | needkeyword SPF_WEIGHT LEFTPAR DP_CONSTANT RIGHTPAR { PTR_LLND w; w = make_llnd(fi,DOUBLE_VAL, LLNULL, LLNULL, SMNULL); w->entry.string_val = copys(yytext); w->type = global_double; $$ = make_llnd(fi,SPF_WEIGHT_OP,w,LLNULL,SMNULL); } ; opt_clause_apply_fragment: { $$ = LLNULL;} | COMMA needkeyword SPF_APPLY_FRAGMENT LEFTPAR characteristic_list RIGHTPAR { $$ = $5;} ; opt_clause_apply_region: { $$ = LLNULL;} | COMMA needkeyword SPF_APPLY_REGION LEFTPAR characteristic_list RIGHTPAR { $$ = $5;} ; spf_end_parallel_reg: SPF_END_PARALLEL_REG in_unit { $$ = get_bfnd(fi,SPF_END_PARALLEL_REG_DIR,SMNULL,LLNULL,LLNULL,LLNULL);} ; analysis_spec_list: analysis_spec { $$ = set_ll_list($1,LLNULL,EXPR_LIST); } | analysis_spec_list COMMA analysis_spec { $$ = set_ll_list($1,$3,EXPR_LIST); } ; analysis_spec: analysis_reduction_spec | analysis_private_spec | analysis_process_private_spec | analysis_parameter_spec | analysis_cover_spec ; analysis_reduction_spec: needkeyword REDUCTION LEFTPAR reduction_list RIGHTPAR { $$ = make_llnd(fi,REDUCTION_OP,$4,LLNULL,SMNULL); } ; analysis_private_spec: needkeyword PRIVATE LEFTPAR variable_list RIGHTPAR { $$ = make_llnd(fi,ACC_PRIVATE_OP,$4,LLNULL,SMNULL);} ; analysis_process_private_spec: needkeyword SPF_PROCESS_PRIVATE LEFTPAR variable_list RIGHTPAR { $$ = make_llnd(fi,SPF_PROCESS_PRIVATE_OP,$4,LLNULL,SMNULL);} ; analysis_cover_spec: needkeyword SPF_COVER LEFTPAR integer_constant RIGHTPAR { $$ = make_llnd(fi,SPF_COVER_OP,$4,LLNULL,SMNULL);} ; analysis_parameter_spec: needkeyword PARAMETER LEFTPAR spf_parameter_list RIGHTPAR { $$ = make_llnd(fi,SPF_PARAMETER_OP,$4,LLNULL,SMNULL);} ; spf_parameter_list: spf_parameter { $$ = set_ll_list($1, LLNULL, EXPR_LIST); } | spf_parameter_list COMMA spf_parameter { $$ = set_ll_list($1, $3, EXPR_LIST); } ; spf_parameter: array_element EQUAL expr { $$ = make_llnd(fi, ASSGN_OP, $1, $3, SMNULL); } ; parallel_spec_list: parallel_spec { $$ = set_ll_list($1,LLNULL,EXPR_LIST); } | parallel_spec_list COMMA parallel_spec { $$ = set_ll_list($1,$3,EXPR_LIST); } ; parallel_spec: parallel_shadow_spec | parallel_across_spec | parallel_remote_access_spec ; parallel_shadow_spec: needkeyword SHADOW LEFTPAR shadow_list RIGHTPAR { $$ = make_llnd(fi,SHADOW_OP,$4,LLNULL,SMNULL);} ; parallel_across_spec: needkeyword ACROSS LEFTPAR shadow_list RIGHTPAR { $$ = make_llnd(fi,ACROSS_OP,$4,LLNULL,SMNULL);} ; parallel_remote_access_spec: needkeyword REMOTE_ACCESS_SPEC LEFTPAR remote_data_list RIGHTPAR { $$ = make_llnd(fi,REMOTE_ACCESS_OP,$4,LLNULL,SMNULL);} ; transform_spec_list: transform_spec { $$ = set_ll_list($1,LLNULL,EXPR_LIST); } | transform_spec_list COMMA transform_spec { $$ = set_ll_list($1,$3,EXPR_LIST); } ; transform_spec: needkeyword SPF_NOINLINE { $$ = make_llnd(fi,SPF_NOINLINE_OP,LLNULL,LLNULL,SMNULL);} | needkeyword SPF_FISSION LEFTPAR ident_list RIGHTPAR { $$ = make_llnd(fi,SPF_FISSION_OP,$4,LLNULL,SMNULL);} | needkeyword SPF_EXPAND { $$ = make_llnd(fi,SPF_EXPAND_OP,LLNULL,LLNULL,SMNULL);} | needkeyword SPF_EXPAND LEFTPAR ident_list RIGHTPAR { $$ = make_llnd(fi,SPF_EXPAND_OP,$4,LLNULL,SMNULL);} /* | needkeyword SPF_SHRINK LEFTPAR ident LEFTPAR digit_list RIGHTPAR RIGHTPAR */ | needkeyword SPF_SHRINK LEFTPAR array_element_list RIGHTPAR { $$ = make_llnd(fi,SPF_SHRINK_OP,$4,LLNULL,SMNULL);} | needkeyword SPF_UNROLL { $$ = make_llnd(fi,SPF_UNROLL_OP,LLNULL,LLNULL,SMNULL);} | needkeyword SPF_UNROLL LEFTPAR unroll_list RIGHTPAR { $$ = make_llnd(fi,SPF_UNROLL_OP,$4,LLNULL,SMNULL);} | needkeyword SPF_MERGE { $$ = make_llnd(fi,SPF_MERGE_OP,LLNULL,LLNULL,SMNULL);} ; unroll_list: expr COMMA expr COMMA expr { $$ = set_ll_list($1, $3, EXPR_LIST); $$ = set_ll_list($$, $5, EXPR_LIST); } ; region_name: name { $$ = make_parallel_region($1);} ; array_element_list: array_element { $$ = set_ll_list($1, LLNULL, EXPR_LIST); } | array_element_list COMMA array_element { $$ = set_ll_list($1, $3, EXPR_LIST); } ; spf_checkpoint: SPF_CHECKPOINT in_unit LEFTPAR checkpoint_spec_list RIGHTPAR { $$ = get_bfnd(fi,SPF_CHECKPOINT_DIR,SMNULL,$4,LLNULL,LLNULL);} ; checkpoint_spec_list: checkpoint_spec { $$ = set_ll_list($1,LLNULL,EXPR_LIST); } | checkpoint_spec_list COMMA checkpoint_spec { $$ = set_ll_list($1,$3,EXPR_LIST); } ; checkpoint_spec: needkeyword TYPE LEFTPAR spf_type_list RIGHTPAR { $$ = make_llnd(fi,SPF_TYPE_OP,$4,LLNULL,SMNULL);} | needkeyword VARLIST LEFTPAR ident_list RIGHTPAR { $$ = make_llnd(fi,SPF_VARLIST_OP,$4,LLNULL,SMNULL);} | needkeyword SPF_EXCEPT LEFTPAR ident_list RIGHTPAR { $$ = make_llnd(fi,SPF_EXCEPT_OP,$4,LLNULL,SMNULL);} | needkeyword SPF_FILES_COUNT LEFTPAR expr RIGHTPAR { $$ = make_llnd(fi,SPF_FILES_COUNT_OP,$4,LLNULL,SMNULL);} | needkeyword SPF_INTERVAL LEFTPAR interval_spec COMMA expr RIGHTPAR { $$ = make_llnd(fi,SPF_INTERVAL_OP,$4,$6,SMNULL);} ; spf_type_list: spf_type { $$ = set_ll_list($1,LLNULL,EXPR_LIST); } | spf_type_list COMMA spf_type { $$ = set_ll_list($1,$3,EXPR_LIST); } ; spf_type: needkeyword ACC_ASYNC { $$ = make_llnd(fi,ACC_ASYNC_OP, LLNULL,LLNULL,SMNULL);} | needkeyword SPF_FLEXIBLE { $$ = make_llnd(fi,SPF_FLEXIBLE_OP, LLNULL,LLNULL,SMNULL);} ; interval_spec: needkeyword SPF_TIME { $$ = make_llnd(fi,SPF_TIME_OP, LLNULL,LLNULL,SMNULL);} | needkeyword SPF_ITER { $$ = make_llnd(fi,SPF_ITER_OP, LLNULL,LLNULL,SMNULL);} ; in_unit: { if(position==IN_OUTSIDE) err("Misplaced SPF-directive",103); } ;