/* ===================================================================== Source: expr.rule ===================================================================== */ fgl_expr_c : boolean_expr | function_call_expr | KW_NULL { $$=A4GL_new_expr_simple(ET_EXPR_NULL); } | fgl_expr_c KW_AND fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_AND,0); } | fgl_expr_c KW_OR fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_OR,0); } | fgl_expr_c KW_SPACES { int expr_dtype; expr_dtype=expr_datatype(NULL,yylineno, $1) & DTYPE_MASK; if (expr_dtype==DTYPE_INT || expr_dtype==DTYPE_SMINT || expr_dtype==DTYPE_INT8 || expr_dtype==DTYPE_SERIAL) ; else { A4GL_warn("Possible use of non-integer datatype with 'SPACES'"); } $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_SPACES); add_feature("ET_EXPR_SPACES"); } | fgl_expr_c CONCAT_PIPES fgl_expr_c { if ($1->expr_type==ET_EXPR_LITERAL_STRING && $3->expr_type==ET_EXPR_LITERAL_STRING) { char *s; s=malloc(1+strlen($1->expr_str_u.expr_string)+strlen($3->expr_str_u.expr_string)); strcpy(s,$1->expr_str_u.expr_string); strcat(s,$3->expr_str_u.expr_string); $$=A4GL_new_literal_string(s); free(s); } else { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_CONCAT,0); } } | report_only_expr | builtin_expr | pdf_expr | literal_expr | variable_entry | OPEN_SQUARE fgl_expr_list_ptr CLOSE_SQUARE { $$=A4GL_new_expr_binding(expand_variables_in_expr_str_list($2,0,0)); } | KW_MINUS fgl_expr_c %prec UMINUS { $$=A4GL_new_expr_neg($2); } | KW_PLUS fgl_expr_c { $$=$2; } | fgl_expr_c MATCHES fgl_expr_c expr_escape { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_MATCHES,$4); add_feature("ET_EXPR_MATCHES"); } | fgl_expr_c NOT_MATCHES fgl_expr_c expr_escape { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_NOT_MATCHES,$4); add_feature("ET_EXPR_NOT_MATCHES"); } | fgl_expr_c LIKE fgl_expr_c expr_escape { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_LIKE,$4); } | fgl_expr_c NOT_LIKE fgl_expr_c expr_escape { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_NOT_LIKE,$4); } | fgl_expr_c MATCHES fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_MATCHES,0); add_feature("ET_EXPR_MATCHES"); } | fgl_expr_c NOT_MATCHES fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_NOT_MATCHES,0); add_feature("ET_EXPR_NOT_MATCHES"); } | fgl_expr_c LIKE fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_LIKE,0); } | fgl_expr_c NOT_LIKE fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_NOT_LIKE,0); } | fgl_expr_c KW_USING fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_USING,0); } | fgl_expr_c KW_PLUS fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_ADD,0); } | fgl_expr_c KW_MINUS fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_SUB,0); } | fgl_expr_c KW_MULTIPLY fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_MULT,0); } | fgl_expr_c KW_DIVIDE fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_DIV,0); } | fgl_expr_c KW_MOD fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_MOD,0); } | fgl_expr_c KW_POWER fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_POWER,0); } | fgl_expr_c KW_CLIPPED { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_CLIP); } | fgl_expr_c IS_NULL { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_ISNULL); } | fgl_expr_c IS_NOT_NULL { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_ISNOTNULL); } | fgl_expr_c EQUAL fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_EQUAL,0); } | fgl_expr_c LESS_THAN fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_LESS_THAN,0); } | fgl_expr_c GREATER_THAN fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_GREATER_THAN,0); } | fgl_expr_c NOT_EQUAL fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_NOT_EQUAL,0); } | fgl_expr_c LESS_THAN_EQ fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_LESS_THAN_EQ,0); } | fgl_expr_c GREATER_THAN_EQ fgl_expr_c { $$=A4GL_new_op_expr($1,$3,ET_EXPR_OP_GREATER_THAN_EQ,0); } | fgl_expr_c EQUAL ALL OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_EQUAL_ALL,0); } | fgl_expr_c LESS_THAN ALL OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_LESS_THAN_ALL,0); } | fgl_expr_c GREATER_THAN ALL OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_GREATER_THAN_ALL,0); } | fgl_expr_c NOT_EQUAL ALL OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_NOT_EQUAL_ALL,0); } | fgl_expr_c LESS_THAN_EQ ALL OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_LESS_THAN_EQ_ALL,0); } | fgl_expr_c GREATER_THAN_EQ ALL OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_GREATER_THAN_EQ_ALL,0); } | fgl_expr_c EQUAL ANY OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_EQUAL_ANY,0); } | fgl_expr_c LESS_THAN ANY OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_LESS_THAN_ANY,0); } | fgl_expr_c GREATER_THAN ANY OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_GREATER_THAN_ANY,0); } | fgl_expr_c NOT_EQUAL ANY OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_NOT_EQUAL_ANY,0); } | fgl_expr_c LESS_THAN_EQ ANY OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_LESS_THAN_EQ_ANY,0); } | fgl_expr_c GREATER_THAN_EQ ANY OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_GREATER_THAN_EQ_ANY,0); } | fgl_expr_c EQUAL SOME OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_EQUAL_ANY,0); } | fgl_expr_c LESS_THAN SOME OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_LESS_THAN_ANY,0); } | fgl_expr_c GREATER_THAN SOME OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_GREATER_THAN_ANY,0); } | fgl_expr_c NOT_EQUAL SOME OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_NOT_EQUAL_ANY,0); } | fgl_expr_c LESS_THAN_EQ SOME OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_LESS_THAN_EQ_ANY,0); } | fgl_expr_c GREATER_THAN_EQ SOME OPEN_BRACKET in_select_statement CLOSE_BRACKET { $$=A4GL_new_op_expr($1,$5,ET_EXPR_OP_GREATER_THAN_EQ_ANY,0); } | fgl_expr_c UNITS_YEAR { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_YEAR); } | fgl_expr_c UNITS_MONTH { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_MONTH); } | fgl_expr_c UNITS_DAY { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_DAY); } | fgl_expr_c UNITS_HOUR { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_HOUR); } | fgl_expr_c UNITS_MINUTE { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_MINUTE); } | fgl_expr_c UNITS_SECOND { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_OP_SECOND); } | fgl_expr_c KW_IN OPEN_BRACKET in_select_statement CLOSE_BRACKET { add_feature("ET_EXPR_IN_SELECT"); $$=A4GL_expr_in_sq($1,1,$4); } | fgl_expr_c NOT_IN OPEN_BRACKET in_select_statement CLOSE_BRACKET { add_feature("ET_EXPR_NOT_IN_SELECT"); add_feature("ET_EXPR_IN_SELECT"); $$=A4GL_expr_in_sq($1,0,$4); } | fgl_expr_c KW_IN OPEN_BRACKET inexpr_list CLOSE_BRACKET { $$=A4GL_expr_in($1,1,$4); add_feature("ET_EXPR_IN"); } | fgl_expr_c NOT_IN OPEN_BRACKET inexpr_list CLOSE_BRACKET { $$=A4GL_expr_in($1,0,$4); add_feature("ET_EXPR_NOT_IN"); } ; expr_escape : KW_ESCAPE CHAR_VALUE { $$=A4GL_new_literal_string(A4GL_strip_quotes($2)); } ; op_fgl_expr_ret_list_v2: {$$=0;} | fgl_expr_ret_list { $$=expand_variables_in_expr_str_list($1,0,1); } ; fgl_expr_ret : fgl_expr_c /* | KW_NULL {$$=A4GL_new_expr_simple(ET_EXPR_NULL);} */ ; fgl_expr_ret_list : fgl_expr_ret { $$=A4GL_new_ptr_list($1); } | fgl_expr_ret_list KW_COMMA fgl_expr_ret { $$=A4GL_new_append_ptr_list($1,$3); } ; fgl_expr_list_ptr: fgl_expr_c { $$=A4GL_new_ptr_list($1); } | fgl_expr_list_ptr KW_COMMA fgl_expr_c { $$=A4GL_new_append_ptr_list($1,$3); } ; expanded_fgl_expr_list_ptr: fgl_expr_list_ptr { /* Can pass a whole array around */ $$=expand_variables_in_expr_str_list($1,0,0); } ; fgl_expr_concat : expanded_fgl_expr_list_ptr { $$=$1; dump_list($1); } ; /****************************************************************/ boolean_expr: KW_NOT fgl_expr_c { $$=A4GL_new_expr_simple_expr($2,ET_EXPR_NOT); } | KW_TRUE { $$=A4GL_new_expr_simple(ET_EXPR_TRUE); } | KW_FALSE { $$=A4GL_new_expr_simple(ET_EXPR_FALSE); } | OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { $$=A4GL_new_expr_simple_expr($2,ET_EXPR_BRACKET); } | EXISTS OPEN_BRACKET in_select_statement CLOSE_BRACKET { add_feature("ET_EXPR_EXISTS"); $$=A4GL_expr_exists_sq(1,$3); } | NOT_EXISTS OPEN_BRACKET in_select_statement CLOSE_BRACKET { add_feature("ET_EXPR_NOT_EXISTS"); $$=A4GL_expr_exists_sq(0,$3); } ; literal_expr: CHAR_VALUE { if (strcmp($1,"\"\"")==0) { $$=A4GL_new_literal_empty_str (); } else { $$=A4GL_new_literal_string(A4GL_strip_quotes($1)); } } | CHAR_VALUE_TRANSLATED { if (strcmp($1,"\"\"")==0) { $$=A4GL_new_literal_empty_str (); } else { char *ptr; ptr=$1; if (ptr[0]=='"') { $$=A4GL_new_literal_string(A4GL_strip_quotes($1)); } else { $$=A4GL_new_translated_string($1); } } } | real_number { $$=A4GL_new_literal_double_str($1); } | INT_VALUE { $$=A4GL_new_literal_long_str($1); #ifdef LONG_MAX if ($$->expr_str_u.expr_long==LONG_MAX) { $$=A4GL_new_literal_double_str($1); } #endif } | CURR_LINE_NO { $$=A4GL_new_literal_long_long(token_read_on_line); } | CURR_FILE_NAME { $$=A4GL_new_literal_string(infilename); } | SQLERRMESSAGE { $$=A4GL_new_expr_simple(ET_EXPR_SQLERRMESSAGE); } ; ensured_variable_usage_expression: variable_usage_expression { char errbuff[256]; $$=ensure_variable(errbuff,$1,1); if ($$==0) { a4gl_yyerror(errbuff); YYERROR; } } ; ensured_variable_possibly_array_usage_expression: variable_usage_expression { char errbuff[256]; $$=ensure_variable(errbuff,$1,0); if ($$==0) { a4gl_yyerror(errbuff); YYERROR; } } ; variable_entry : variable_usage_expression { char errbuff[256]; if ($1->expr_type==ET_EXPR_VARIABLE_USAGE) { $$=ensure_variable(errbuff,$1,1); } if ($$==0) { a4gl_yyerror(errbuff); YYERROR; } inc_var_usage($$); } | member_fcall {$$=$1;} /* | variable_usage_expression OPEN_BRACKET opt_func_call_args CLOSE_BRACKET { char errbuff[256]; enum e_scope scope; struct variable*v; struct variable_usage *vu_top; vu_top=$1->expr_str_u.expr_variable_usage; v=find_variable_vu_ptr(errbuff, vu_top, &scope,0); $$=A4GL_new_expr_member_fcall($1,$3,A4GL_compiling_module_basename(),lastlineno,get_namespace($1)); inc_var_usage($$); } */ | variable_usage_expression THRU variable_usage_expression { char errbuff[256]; $$=A4GL_new_expr_list(); $$->expr_type=ET_EXPR_THROUGH; A4GL_new_append_ptr_list($$->expr_str_u.expr_list,$1); A4GL_new_append_ptr_list($$->expr_str_u.expr_list,$3); $$=ensure_variable(errbuff,$$,1); inc_var_usage($$); if ($$==0) { a4gl_yyerror(errbuff); YYERROR; } } ; report_only_expr: COLUMN fgl_expr_c { $$=A4GL_new_expr_simple_expr($2,ET_EXPR_COLUMN); } | COLUMNS fgl_expr_c { $$=A4GL_new_expr_simple_expr($2,ET_EXPR_COLUMN); } | RIGHT_ALIGNED fgl_expr_c KW_TO fgl_expr_c { $$=A4GL_new_expr_aligned(ET_EXPR_RIGHT_ALIGNED, $2,$4); } | KW_TAG OPEN_BRACKET fgl_expr_c KW_COMMA fgl_expr_c CLOSE_BRACKET { $$=A4GL_new_expr_aligned(ET_EXPR_TAG, $3,$5); } | rep_agg { if (!isin_command("REPORT")) { a4gl_yyerror("This can only be done in a report!"); YYERROR; } insql=0; $$=$1; } | KW_GROUP {insql=1;set_ingroup();} rep_agg { if (!isin_command("REPORT")) { a4gl_yyerror("This can only be done in a report!");YYERROR; } insql=0; $$=$3; } ; inexpr_list : fgl_expr_c { $$=A4GL_new_ptr_list($1); } | inexpr_list KW_COMMA fgl_expr_c { $$=A4GL_new_append_ptr_list($1,$3); } ; op_extend_di: {$$=-1;} | dtime_val KW_TO dtime_val {$$=$1*16+$3;} ; op_extend_ii: interval_qual_i { $$=$1;} ; dtime_fcall_expr: DATETIME OPEN_BRACKET CHAR_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF1(buff,"%s",$3); $$=A4GL_new_datetime_expr(buff,$5); } | DATETIME OPEN_BRACKET INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF1(buff,"\"%s\"",$3); $$=A4GL_new_datetime_expr(buff,$5); } | DATETIME OPEN_BRACKET NUMBER_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF1(buff,"\"%s\"",$3); $$=A4GL_new_datetime_expr(buff,$5); } | DATETIME OPEN_BRACKET INT_VALUE COLON INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF2(buff,"\"%s:%s\"",$3,$5); $$=A4GL_new_datetime_expr(buff,$7); } | DATETIME OPEN_BRACKET INT_VALUE COLON NUMBER_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF2(buff,"\"%s:%s\"",$3,$5); $$=A4GL_new_datetime_expr(buff,$7); } | DATETIME OPEN_BRACKET INT_VALUE COLON INT_VALUE COLON INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF3(buff,"\"%s:%s:%s\"",$3,$5,$7); $$=A4GL_new_datetime_expr(buff,$9); } | DATETIME OPEN_BRACKET INT_VALUE COLON INT_VALUE COLON NUMBER_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF3(buff,"\"%s:%s:%s\"",$3,$5,$7); $$=A4GL_new_datetime_expr(buff,$9); } | DATETIME OPEN_BRACKET INT_VALUE INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF2(buff,"\"%s:%s\"",$3,$4); $$=A4GL_new_datetime_expr(buff,$6); } | DATETIME OPEN_BRACKET INT_VALUE INT_VALUE COLON INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF3(buff,"\"%s %s:%s\"",$3,$4,$6); $$=A4GL_new_datetime_expr(buff,$8); } | DATETIME OPEN_BRACKET INT_VALUE INT_VALUE COLON INT_VALUE COLON INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF4(buff,"\"%s %s:%s:%s\"",$3,$4,$6,$8); $$=A4GL_new_datetime_expr(buff,$10); } | DATETIME OPEN_BRACKET INT_VALUE INT_VALUE COLON INT_VALUE COLON NUMBER_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF4(buff,"\"%s %s:%s:%s\"",$3,$4,$6,$8); $$=A4GL_new_datetime_expr(buff,$10); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF2(buff,"\"%s-%s\"",$3,$5); $$=A4GL_new_datetime_expr(buff,$7); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE KW_MINUS INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF3(buff,"\"%s-%s-%s\"",$3,$5,$7); $$=A4GL_new_datetime_expr(buff,$9); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF3(buff,"\"%s-%s %s\"",$3,$5,$6); $$=A4GL_new_datetime_expr(buff,$8); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE KW_MINUS INT_VALUE INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF4(buff,"\"%s-%s-%s %s\"",$3,$5,$7,$8); $$=A4GL_new_datetime_expr(buff,$10); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE KW_MINUS INT_VALUE INT_VALUE COLON INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF5(buff,"\"%s-%s-%s %s:%s\"",$3,$5,$7,$8,$10); $$=A4GL_new_datetime_expr(buff,$12); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE KW_MINUS INT_VALUE INT_VALUE COLON INT_VALUE COLON INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF6(buff,"\"%s-%s-%s %s:%s:%s\"",$3,$5,$7,$8,$10,$12); $$=A4GL_new_datetime_expr(buff,$14); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE KW_MINUS INT_VALUE INT_VALUE COLON INT_VALUE COLON NUMBER_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF6(buff,"\"%s-%s-%s %s:%s:%s\"",$3,$5,$7,$8,$10,$12); $$=A4GL_new_datetime_expr(buff,$14); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE INT_VALUE COLON INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF4(buff,"\"%s-%s %s:%s\"",$3,$5,$6,$8); $$=A4GL_new_datetime_expr(buff,$10); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE INT_VALUE COLON INT_VALUE COLON INT_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF5(buff,"\"%s-%s %s:%s:%s\"",$3,$5,$6,$8,$10); $$=A4GL_new_datetime_expr(buff,$12); } | DATETIME OPEN_BRACKET INT_VALUE KW_MINUS INT_VALUE INT_VALUE COLON INT_VALUE COLON NUMBER_VALUE CLOSE_BRACKET op_extend_di { char buff[256]; SPRINTF5(buff,"\"%s-%s %s:%s:%s\"",$3,$5,$6,$8,$10); $$=A4GL_new_datetime_expr(buff,$12); } ; function_call_expr: KW_DATE OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { $$=A4GL_new_expr_simple_expr($3,ET_EXPR_DATE_FUNC); } | TIME OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { $$=A4GL_new_expr_simple_expr($3,ET_EXPR_TIME_FUNC); } | MONTH OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { $$=A4GL_new_expr_simple_expr($3,ET_EXPR_MONTH_FUNC); } | DAY OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { $$=A4GL_new_expr_simple_expr($3,ET_EXPR_DAY_FUNC); } | YEAR OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { $$=A4GL_new_expr_simple_expr($3,ET_EXPR_YEAR_FUNC); } | INTERVAL OPEN_BRACKET interval_func_params CLOSE_BRACKET op_extend_ii { $$=A4GL_new_interval_expr($3,$5); } | dtime_fcall_expr { $$=$1; } | FGL_SIZEOF OPEN_BRACKET ensured_variable_possibly_array_usage_expression CLOSE_BRACKET { $$=A4GL_new_expr_simple_expr($3,ET_EXPR_FGL_SIZEOF); } | FGL_ADDRESSOF OPEN_BRACKET ensured_variable_possibly_array_usage_expression CLOSE_BRACKET { $$=A4GL_new_expr_simple_expr($3,ET_EXPR_FGL_ADDRESSOF); } | FGL_ISDYNARR_ALLOCATED OPEN_BRACKET variable_usage_expression CLOSE_BRACKET { $$=A4GL_new_expr_simple_expr($3,ET_EXPR_FGL_ISDYNARR_ALLOCATED); } | FGL_DYNARR_EXTENTSIZE OPEN_BRACKET variable_usage_expression KW_COMMA INT_VALUE CLOSE_BRACKET { $$=A4GL_new_expr_simple(ET_EXPR_FGL_DYNARR_EXTENTSIZE); $$->expr_str_u.expr_dynarr_extent=malloc(sizeof(struct s_expr_dynarr_extent)); $$->expr_str_u.expr_dynarr_extent->var=$3; $$->expr_str_u.expr_dynarr_extent->n=atoi($5); } | FIELDTOWIDGET OPEN_BRACKET field_name_as_struct CLOSE_BRACKET { $$=A4GL_new_expr_simple(ET_EXPR_FIELDTOWIDGET); $$->expr_str_u.expr_field_entry=$3; } | ID_TO_INT OPEN_BRACKET field_name_as_struct CLOSE_BRACKET { $$=A4GL_new_expr_simple(ET_EXPR_ID_TO_INT); $$->expr_str_u.expr_field_entry=$3; } | INFIELD OPEN_BRACKET field_name_list_or_char_as_struct CLOSE_BRACKET { add_feature("ET_EXPR_INFIELD"); /* Informix allows this outside of a input/construct... */ if (isin_command("INPUT")&&!isin_command("CONSTRUCT")) { $$=A4GL_new_expr_infield(get_sio_id("ALL"),$3,A4GL_compiling_module_basename(),lastlineno); } else { $$=A4GL_new_expr_infield(-1,$3,A4GL_compiling_module_basename(),lastlineno); } } | FGL_SYNCFIELDS OPEN_BRACKET CLOSE_BRACKET { if (isin_command("INPUT")) { $$=A4GL_new_expr_syncfields(get_sio_id("ALL"),"I",A4GL_compiling_module_basename(),lastlineno); } else { a4gl_yyerror("FGL_SYNCFIELDS can only be used in an INPUT statement"); } } | FIELD_TOUCHED OPEN_BRACKET field_name_list_as_struct CLOSE_BRACKET { add_feature("ET_EXPR_FIELD_TOUCHED"); if (!isin_command("INPUT")&&!isin_command("CONSTRUCT")) { a4gl_yyerror("field_touched can only be used in an input or construct"); YYERROR; } $$=A4GL_new_expr_field_touched(get_sio_id("ALL"),$3,A4GL_compiling_module_basename(),lastlineno); } | NOT_FIELD_TOUCHED OPEN_BRACKET field_name_list_as_struct CLOSE_BRACKET { add_feature("ET_EXPR_NOT_FIELD_TOUCHED"); if (!isin_command("INPUT")&&!isin_command("CONSTRUCT")) { a4gl_yyerror("field_touched can only be used in an input or construct"); YYERROR; } $$=A4GL_new_expr_not_field_touched(get_sio_id("ALL"),$3,A4GL_compiling_module_basename(),lastlineno); } /* Might add these in a future version - not for now though */ /* | FIELD_TOUCHED_CURRENT OPEN_BRACKET CLOSE_BRACKET { add_feature("ET_EXPR_FIELD_TOUCHED"); if (!isin_command("INPUT")&&!isin_command("CONSTRUCT")) { a4gl_yyerror("field_touched can only be used in an input or construct"); YYERROR; } $$=A4GL_new_expr_field_touched(get_sio_id("ALL"),NULL,A4GL_compiling_module_basename(),lastlineno); } | NOT_FIELD_TOUCHED_CURRENT OPEN_BRACKET CLOSE_BRACKET { add_feature("ET_EXPR_NOT_FIELD_TOUCHED"); if (!isin_command("INPUT")&&!isin_command("CONSTRUCT")) { a4gl_yyerror("field_touched can only be used in an input or construct"); YYERROR; } $$=A4GL_new_expr_not_field_touched(get_sio_id("ALL"),NULL,A4GL_compiling_module_basename(),lastlineno); } */ | UPSHIFT OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { add_feature("ET_EXPR_UPSHIFT"); $$=A4GL_new_expr_simple_expr($3,ET_EXPR_UPSHIFT); } | DOWNSHIFT OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { add_feature("ET_EXPR_DOWNSHIFT"); $$=A4GL_new_expr_simple_expr($3,ET_EXPR_DOWNSHIFT); } | KW_ASCII fgl_expr_c { add_feature("ET_EXPR_ASCII"); $$=A4GL_new_expr_simple_expr($2,ET_EXPR_ASCII); } | KW_ASCII_OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { add_feature("ET_EXPR_ASCII"); $$=A4GL_new_expr_simple_expr($2,ET_EXPR_ASCII); } | EXTEND OPEN_BRACKET fgl_expr_c op_datetime_qual_i CLOSE_BRACKET { $$=A4GL_new_expr_extend($3,$4); } | KW_CAST OPEN_BRACKET fgl_expr_c KW_AS cast_dtype CLOSE_BRACKET { make_cast(A4GL_compiling_module_basename(),lastlineno, $3,$5,0,1); $$=$3; } /*************************************************************************/ /* */ /* These can potentially return more than one value... */ /* */ /*************************************************************************/ | identifier OPEN_BRACKET opt_func_call_args CLOSE_BRACKET { char buff[256]; ADDMAP("Call",$1); $$=A4GL_new_expr_fcall($1,$3,A4GL_compiling_module_basename(),lastlineno, get_namespace($1)); if (!A4GL_check_fcall_for_builtin_functions($$,buff,NULL,0)) { a4gl_yyerror(buff); $$=0; } add_to_call_list_by_expr($$); map_call($$); } | KW_CHANNEL_READ OPEN_BRACKET func_call_args CLOSE_BRACKET { char errbuff[200]; $$=A4GL_new_expr_shared_fcall("channel", "read",$3,A4GL_compiling_module_basename(),lastlineno, get_namespace("channel::read"),errbuff); if ($$==NULL) { a4gl_yyerror(errbuff); } else { add_to_call_list_by_expr($$); } } | identifier DOUBLE_COLON identifier OPEN_BRACKET opt_func_call_args CLOSE_BRACKET { char errbuff[200]; $$=A4GL_new_expr_shared_fcall($1,$3,$5,A4GL_compiling_module_basename(),lastlineno, get_namespace($1),errbuff); if ($$==NULL) { a4gl_yyerror(errbuff); } else { add_to_call_list_by_expr($$); } } | SHARED identifier KW_IN identifier OPEN_BRACKET opt_func_call_args CLOSE_BRACKET { char errbuff[200]; $$=A4GL_new_expr_shared_fcall($2,$4,$6,A4GL_compiling_module_basename(),lastlineno, get_namespace($2),errbuff); add_to_call_list_by_expr($$); } | CURSOR_NAME_FUNCTION OPEN_BRACKET fgl_expr_c CLOSE_BRACKET { if ($3->expr_type!=ET_EXPR_LITERAL_STRING) { $$=A4GL_new_expr_simple_expr($3,ET_EXPR_CURSOR_NAME_FUNCTION); } else { // We can do it here... $$=A4GL_new_literal_string(do_clobbering_sql(&this_module, clobber,downshift(A4GL_strip_quotes($3->expr_str_u.expr_string)))) ; } } | REFERENCE OPEN_BRACKET variable_usage_expression CLOSE_BRACKET { $$=A4GL_new_expr_reference($3); } | REFERENCE variable_usage_expression { $$=A4GL_new_expr_reference($2); } | GET_FLDBUF OPEN_BRACKET field_name_list_as_struct CLOSE_BRACKET { add_feature("ET_EXPR_GET_FLDBUF"); if (!isin_command("INPUT")&&!isin_command("CONSTRUCT")) { a4gl_yyerror("get_fldbuf can only be used in an input or construct"); YYERROR; } if (isin_command("INPUT")) { $$=A4GL_new_expr_get_fldbuf(get_sio_id("INPUT"),$3,A4GL_compiling_module_basename(),lastlineno); } if (isin_command("CONSTRUCT")) { $$=A4GL_new_expr_get_fldbuf(get_sio_id("CONSTRUCT"),$3,A4GL_compiling_module_basename(),lastlineno); } } | EXTERNAL remote_host_name COLON remote_func_name OPEN_SQUARE valid_port_eptr CLOSE_SQUARE OPEN_BRACKET opt_func_call_args CLOSE_BRACKET opt_without_waiting { char fname[64]; char buff[256]; SPRINTF3(buff,"%s:%s(%p)",$2,$4,$6); ADDMAP("External",buff); if (strcmp($11,"WITHOUT WAITING")==0) { strcpy(fname,"1,"); strcat(fname,$4); } else { strcpy(fname,"0,"); strcat(fname,$4); } $$=A4GL_new_expr_call_external($2,$4,$6,$9,$11,A4GL_compiling_module_basename(),lastlineno,get_namespace($4)); add_to_call_list_by_expr($$); } | pdf_functions_expr { $$=$1; } ; pdf_expr : fgl_expr_c KW_POINTS { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_POINTS); } | fgl_expr_c MM { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_MM); } | fgl_expr_c CM { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_CM); } | fgl_expr_c INCHES { $$=A4GL_new_expr_simple_expr($1,ET_EXPR_INCHES); } ; builtin_expr : curr_v_clause { $$=$1; } | KW_DATE { $$=A4GL_new_expr_simple(ET_EXPR_DATE_EXPR); } | TIME { $$=A4GL_new_expr_simple(ET_EXPR_TIME_EXPR); } | FGL_MODULE { $$=A4GL_new_expr_simple(ET_EXPR_MODULE_FUNC); } ; interval_func_params : CHAR_VALUE { strcpy($$,$1); } | numeric_time_interval { strcpy($$,$1); } ; numeric_time_interval: KW_MINUS numeric_time_interval {SPRINTF1($$,"-%s",$2);} | numeric_time_unit_big {SPRINTF1($$,"\"%s\"",$1);} | numeric_time_unit_small {SPRINTF1($$,"\"%s\"",$1);} ; numeric_time_unit_small : INT_VALUE INT_VALUE {SPRINTF2($$,"%s %s",$1,$2);} /* DD HH */ | INT_VALUE INT_VALUE COLON INT_VALUE {SPRINTF3($$,"%s %s:%s",$1,$2,$4);} /* DD HH:MM */ | INT_VALUE INT_VALUE COLON INT_VALUE COLON INT_VALUE {SPRINTF4($$,"%s %s:%s:%s",$1,$2,$4,$6);} /* DD HH:MM:SS*/ | INT_VALUE INT_VALUE COLON INT_VALUE COLON NUMBER_VALUE {SPRINTF4($$,"%s %s:%s:%s",$1,$2,$4,$6);} /* DD HH MM SS.FFFF*/ | INT_VALUE COLON INT_VALUE {SPRINTF2($$,"%s:%s",$1,$3);} /* HH MM */ | INT_VALUE COLON INT_VALUE COLON INT_VALUE {SPRINTF3($$,"%s:%s:%s",$1,$3,$5);} /* HH MM SS*/ | INT_VALUE COLON INT_VALUE COLON NUMBER_VALUE {SPRINTF3($$,"%s:%s:%s",$1,$3,$5);} /* HH MM SS.FFFF*/ | INT_VALUE COLON NUMBER_VALUE {SPRINTF2($$,"%s:%s",$1,$3);} /* MM SS.FFFF*/ | NUMBER_VALUE {SPRINTF1($$,"%s",$1);} /* SS.FFFF*/ | KW_DOT INT_VALUE {SPRINTF1($$,"0.%s",$2);} ; numeric_time_unit_big: INT_VALUE | INT_VALUE KW_MINUS INT_VALUE { SPRINTF2($$,"%s-%s",$1,$3); } ; field_name_list_as_struct : field_name_as_struct { $$=new_field_list(); $$=append_field_to_list($$,$1); } | field_name_list_as_struct KW_COMMA field_name_as_struct { $$=append_field_to_list($1,$3); } ; field_name_list_or_char_as_struct : field_name_or_char_as_struct { $$=new_field_list(); $$=append_field_to_list($$,$1); } | field_name_list_or_char_as_struct KW_COMMA field_name_or_char_as_struct { $$=append_field_to_list($1,$3); } ; curr_v_clause : KW_CURRENT { $$=A4GL_new_expr_current(1, 10);} | KW_CURRENT s_curr_v KW_TO s_curr_v {$$=A4GL_new_expr_current($2, $4);} ; s_curr_v: YEAR {$$=1;} | MONTH {$$=2;} | DAY {$$=3;} | HOUR {$$=4;} | MINUTE {$$=5;} | SECOND {$$=6;} | FRACTION {$$=6+2; } | FRACTION OPEN_BRACKET INT_VALUE CLOSE_BRACKET {$$=atoi($3)+6;} ; cast_dtype: KW_CHAR { $$=DTYPE_CHAR+ENCODE_SIZE(1); } | NCHAR { $$=DTYPE_NCHAR+ENCODE_SIZE(1); } | KW_CHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=DTYPE_CHAR+ENCODE_SIZE(atol($3)); } | NCHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=DTYPE_NCHAR+ENCODE_SIZE(atol($3)); } | VARCHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=DTYPE_CHAR+ENCODE_SIZE(atol($3)); } | VARCHAR OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { $$=DTYPE_VCHAR+ENCODE_SIZE(atol($3)); } | NVARCHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=DTYPE_VCHAR+ENCODE_SIZE(atol($3)); } | NVARCHAR OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { $$=DTYPE_VCHAR+ENCODE_SIZE(atol($3)); } | INTEGER { $$=DTYPE_INT; } | SERIAL { $$=DTYPE_SERIAL; } | INTEGER8 { $$=DTYPE_INT8; } | SERIAL8 { $$=DTYPE_SERIAL8; } | SMALLINT { $$=DTYPE_SMINT; } | KW_DECIMAL { $$=DTYPE_DECIMAL; } | KW_DECIMAL OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=DTYPE_DECIMAL+ENCODE_SIZE((atoi($3)*256+2)); } | KW_DECIMAL OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { $$=DTYPE_DECIMAL+ENCODE_SIZE((atoi($3)*256+atoi($5))); } | MONEY { $$=DTYPE_MONEY; } | MONEY OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=DTYPE_MONEY+ENCODE_SIZE((atoi($3)*256+2)); } | MONEY OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { $$=DTYPE_MONEY+ENCODE_SIZE((atoi($3)*256+atoi($5))); } | KW_FLOAT { $$=DTYPE_FLOAT; } | DOUBLE_PRECISION { $$=DTYPE_FLOAT; } | REAL { $$=DTYPE_FLOAT; } | SMALLFLOAT { $$=DTYPE_SMFLOAT; } | KW_DATE { $$=DTYPE_DATE; } | KW_BYTE { $$=DTYPE_BYTE; } | BYTES_USE_AS_IMAGE { $$=DTYPE_BYTE; } | BYTES_USE_AS_ASCII { $$=DTYPE_BYTE; } | KW_TEXT { $$=DTYPE_TEXT; } | DATETIME datetime_qual { $$=DTYPE_DTIME+ENCODE_SIZE($2); } | INTERVAL interval_qual { $$=DTYPE_INTERVAL+ENCODE_SIZE($2); } | TIME { $$=DTYPE_DTIME+ENCODE_SIZE(72); } | TIME OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=DTYPE_DTIME+ENCODE_SIZE((70+atoi($3))); } | TIMESTAMP { $$=DTYPE_DTIME+ENCODE_SIZE(72);} | TIMESTAMP OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=DTYPE_DTIME+ENCODE_SIZE((22+atoi($3))); } | LIKE define_table_name KW_DOT col_name { int rval; int idtype; int isize; char *ccol; rval = A4GLSQL_get_columns ($2, $4, &idtype, &isize); rval = A4GLSQL_next_column (&ccol, &idtype, &isize); if (rval==0) { a4gl_yyerror("Unable to find column for CAST LIKE"); $$=0; } $$=idtype+ENCODE_SIZE(isize); } ; member_fcall: variable_usage_expression OPEN_BRACKET opt_func_call_args CLOSE_BRACKET { struct variable *v; struct variable_usage *vu_top=NULL,*vu=NULL, *vu_n=NULL,*vu_bottom=NULL; int datatype; struct expr_str *var; char errbuff[256]=""; enum e_scope scope; char *s; char *func; char *objtype; var=$1; /* The last part is the name of the function - so we need to strip that out */ vu_top=$1->expr_str_u.expr_variable_usage; vu=vu_top; while (vu->next) { vu_n=vu; vu=vu->next; } /* Remove the link to the function */ vu_n->next = 0; /* But get the function name */ func = vu->variable_name; /* Can we find a variable with the name ? */ v=find_variable_vu_ptr(errbuff, vu_top, &scope,0); vu_bottom = usage_bottom_level (vu_top); datatype = vu_bottom->datatype & DTYPE_MASK; if (v) { if (v->arr_subscripts.arr_subscripts_len) { if (v->arr_subscripts.arr_subscripts_val[0]<0 && isDynamicFunction(func)) { datatype=DTYPE_DYNAMIC_ARRAY; } } } objtype=""; if (v==0) { /* Nope - but all is not lost - if its a 'static' member function and the 'variable' is the name of the object - eg ui.window */ s = cmds_get_variable_usage_as_string (vu_top); if(A4GL_check_isobject_name(s)) { /* Yeah - Its an object type */ objtype=s; datatype=DTYPE_OBJECT; var=NULL; } else { /* Nope - cant use it */ set_yytext(s); a4gl_yyerror("Is not an object type, or variable does not exist"); } } else { /* Its a straightforward variable */ /* If its really an object - object type will be set to a non-empty string */ objtype=vu_top->object_type; } if (strcmp(objtype,"base.channel")==0 && strcmp(func,"read")==0) { if ( $3) { if ( $3->list.list_len==1) { if ( $3->list.list_val[0]->expr_type==ET_EXPR_VARIABLE_USAGE) { $3->list.list_val[0]=A4GL_new_expr_binding(expand_variables_in_expr_str_list(A4GL_new_ptr_list( $3->list.list_val[0]),0,0)); } } } } $$=A4GL_new_expr_member_fcall_n(var,func, objtype, datatype, $3,A4GL_compiling_module_basename(),lastlineno,get_namespace("-")); inc_var_usage($$); } ; /* ============================ expr.rule =========================== */