/* ===================================================================== Source:define.rule ===================================================================== */ define_section : { $$=NULL;set_local_variables(NULL);} | define_multiple { $$=$1; set_local_variables($$); sort_variables_v($$); } ; define_multiple : define_set { $$=$1; set_local_variables($$); } | define_multiple define_set { $$=merge_variable_list($1,$2); set_local_variables($$); } ; opt_semi: | SEMICOLON ; define_set : DEFINE def_part opt_semi { remap_top_variables_in_list($2); $$=$2; } | DEFINE_NEW_TYPE var_def_name KW_AS dtype opt_semi { $$=new_variable_list(make_new_type($2, $4)); } | error { $$=NULL; } ; def_part : def_part2 {$$=$1;} | def_part KW_COMMA def_part2 { $$=merge_variable_list($1,$3); } ; define_ident : { in_define=1; } identifier { in_define=0; strcpy($$,$2); set_yytext($$); if (A4GL_bad_identifiers($$)) { a4gl_yyerror("You can't use this identifier as it is a reserved word in the target language"); YYERROR; } } ; define_constant: KW_CONSTANT define_ident op_equal CHAR_VALUE { $$=new_constant('c',$4,$2); ADDMAP("Constant",$2); add_feature("DEFINE_CONSTANT"); } | KW_CONSTANT define_ident op_equal identifier { $$=new_constant('C',$4,$2); ADDMAP("Constant",$2); add_feature("DEFINE_CONSTANT"); } | KW_CONSTANT define_ident op_equal real_number { $$=new_constant('f',$4,$2); ADDMAP("Constant",$2); add_feature("DEFINE_CONSTANT"); } | KW_CONSTANT define_ident op_equal INT_VALUE { $$=new_constant('i',$4,$2); ADDMAP("Constant",$2); add_feature("DEFINE_CONSTANT"); } | define_ident KW_CONSTANT constant_value { char buff[20]; strncpy(buff,$3,3); add_feature("DEFINE_CONSTANT"); if (buff[0]=='"') { $$=new_constant('c',$3,$1); } else { if (strchr($3,'.')) { $$=new_constant('f',$3,$1); } else { $$=new_constant('i',$3,$1); } } ADDMAP("Constant",$1); } ; def_part2 : define_constant { $$=new_variable_list($1); } | var_def_list dtype_ident { $$=create_variable_list($1,$2); } | error { $$=NULL; } ; constant_value : INT_VALUE {strcpy($$,$1);} | CHAR_VALUE {strcpy($$,$1);} | real_number {strcpy($$,$1);} | KW_MINUS INT_VALUE { SPRINTF1($$,"-%d",$2); } ; var_def_name : define_ident { strcpy($$,$1); } ; var_def_list : var_def_name { $$=new_str_list($1); } | var_def_list KW_COMMA var_def_name { add_str_list($1,$3); } ; op_char : {strcpy($$,"");} | KW_CHAR {strcpy($$,"");} /* syntactic sugar - just makes it look pretty */ ; ranking : { $$=-1; } | WITH_1_DIMENSION { $$=-1; } | WITH_2_DIMENSION { $$=-2; } | WITH_3_DIMENSION { $$=-3; } ; array_variable : ARRAY OPEN_SQUARE number_arr_list CLOSE_SQUARE KW_OF dtype_ident { $$=$6; if ($$) { if ($3.i2) { $$->arr_subscripts.arr_subscripts_len=3; $$->arr_subscripts.arr_subscripts_val=malloc(sizeof(int)* $$->arr_subscripts.arr_subscripts_len); $$->arr_subscripts.arr_subscripts_val[0]=$3.i0; $$->arr_subscripts.arr_subscripts_val[1]=$3.i1; $$->arr_subscripts.arr_subscripts_val[2]=$3.i2; } else { if ($3.i1) { $$->arr_subscripts.arr_subscripts_len=2; $$->arr_subscripts.arr_subscripts_val=malloc(sizeof(int)* $$->arr_subscripts.arr_subscripts_len); $$->arr_subscripts.arr_subscripts_val[0]=$3.i0; $$->arr_subscripts.arr_subscripts_val[1]=$3.i1; } else { if ($3.i0) { $$->arr_subscripts.arr_subscripts_len=1; $$->arr_subscripts.arr_subscripts_val=malloc(sizeof(int)* $$->arr_subscripts.arr_subscripts_len); $$->arr_subscripts.arr_subscripts_val[0]=$3.i0; } } } } } | DYNAMIC_ARRAY ranking KW_OF dtype_ident { add_feature("DEFINE_DYNAMIC_ARRAY"); $$=$4; /****************************************************************************************/ /* We dont store the individual sizes - because we dont have any (its dynamic remember) */ /* so instead we define the number of dimensions.. */ /* the number stored is negative to differentiate it from the normal arrays... */ /****************************************************************************************/ if ($$) { $$->arr_subscripts.arr_subscripts_len=1; $$->arr_subscripts.arr_subscripts_val=malloc(sizeof(int)); $$->arr_subscripts.arr_subscripts_val[0]=$2; } } | ASSOCIATE op_char assoc_open_bracket INT_VALUE assoc_close_bracket WITH_ARRAY OPEN_SQUARE number_arr_assoc CLOSE_SQUARE KW_OF dtype_ident { $$=new_associate_variable(atol($4),$8,$11); } ; assoc_open_bracket : OPEN_BRACKET | OPEN_SHEV ; assoc_close_bracket : CLOSE_BRACKET | CLOSE_SHEV ; number_arr_assoc : INT_VALUE { $$=atoi($1); } ; number_arr_list : number_value_arr KW_COMMA number_value_arr KW_COMMA number_value_arr { $$.i0=$1; $$.i1=$3; $$.i2=$5; #ifdef DEBUG A4GL_debug("Triplet"); #endif } | number_value_arr KW_COMMA number_value_arr { $$.i0=$1; $$.i1=$3; $$.i2=0; #ifdef DEBUG A4GL_debug("double"); #endif } | number_value_arr { $$.i0=$1; $$.i1=0; $$.i2=0; } ; number_value_arr : INT_VALUE { $$=atoi($1); } ; define_table_name : identifier { SPRINTF1($$,"%s",$1); } | identifier COLON identifier { SPRINTF2($$,"%s:%s",$1,$3); } | identifier ATSIGN identifier COLON identifier { SPRINTF3($$,"%s@%s:%s",$1,$3,$5); } ; record_variable : RECORD def_part END_RECORD { $$=new_variable_record(NULL, $2); } | RECORD_LIKE define_table_name KW_DOT define_ident KW_DOT KW_MULTIPLY { /* Postgresql SCHEMA : schema.table.* */ char buff[200]; add_feature("DEFINE_LIKE"); sprintf(buff,"%s.%s",$2,$4); add_dependant_table(buff); #ifdef DEBUG A4GL_debug("Link Table : %s\n",buff); #endif $$=new_variable_pushLikeAllTableColumns(buff,NULL); } | RECORD_LIKE define_table_name KW_DOT KW_MULTIPLY { add_feature("DEFINE_LIKE"); add_dependant_table($2); #ifdef DEBUG A4GL_debug("Link Table : %s\n",$2); #endif $$=new_variable_pushLikeAllTableColumns($2,NULL); } | LINKED_TO define_table_name PRIMARY_KEY OPEN_BRACKET link_to_pk_list CLOSE_BRACKET { add_dependant_table($2); #ifdef DEBUG A4GL_debug("Table:%s\n",$3); #endif add_feature("DEFINE_LINKED"); #ifdef DEBUG A4GL_debug("Push record...\n"); #endif $$=new_variable_pushLikeAllTableColumns($2,$5); } ; link_to_pk_list : link_to_pk {$$=new_str_list($1);} | link_to_pk_list KW_COMMA link_to_pk { add_str_list($1,$3); } ; link_to_pk : define_ident { strcpy($$,$1); } ; dtype_ident : dtype2 { $$=$1; } | error { $$=NULL; } ; op_as_static : | AS_STATIC ; dtype2 : dtype op_as_static { $$=$1; } ; dtype : array_variable { $$=$1; } | record_variable { $$=$1; } | KW_CHAR { $$=new_simple_variable(NULL,DTYPE_CHAR,1,0); add_feature("DEFINE_CHAR"); } | NCHAR { $$=new_simple_variable(NULL,DTYPE_NCHAR,1,0); add_feature("DEFINE_NCHAR"); } | KW_CHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET { if (atoi($3)>32767) { a4gl_yyerror("Character column size is too big"); YYERROR; } $$=new_simple_variable(NULL,DTYPE_CHAR,atol($3),0); add_feature("DEFINE_CHAR"); } | NCHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=new_simple_variable(NULL,DTYPE_NCHAR,atol($3),0); add_feature("DEFINE_NCHAR"); } | VARCHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=new_simple_variable(NULL,DTYPE_VCHAR,atol($3),0); add_feature("DEFINE_VARCHAR"); } | VARCHAR OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { $$=new_simple_variable(NULL,DTYPE_VCHAR,atol($3),0); add_feature("DEFINE_VARCHAR"); } | NVARCHAR OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=new_simple_variable(NULL,DTYPE_CHAR,atol($3),0); add_feature("DEFINE_NVARCHAR"); } | NVARCHAR OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { $$=new_simple_variable(NULL,DTYPE_CHAR,atol($3),0); add_feature("DEFINE_NVARCHAR"); } | INTEGER { $$=new_simple_variable(NULL,DTYPE_INT,0,0); add_feature("DEFINE_INTEGER"); } | SERIAL { $$=new_simple_variable(NULL,DTYPE_SERIAL,0,0); A4GL_warn("Use of SERIAL as a 4GL datatype is not portable"); add_feature("DEFINE_SERIAL"); } | INTEGER8 { $$=new_simple_variable(NULL,DTYPE_INT8,0,0); add_feature("DEFINE_INTEGER"); } | SERIAL8 { $$=new_simple_variable(NULL,DTYPE_SERIAL8,0,0); A4GL_warn("Use of SERIAL as a 4GL datatype is not portable"); add_feature("DEFINE_SERIAL"); } | KW_AS define_ident { $$=new_variable_dim($2); if ($$==NULL) { a4gl_yyerror("Unknown datatype"); YYERROR; } } | USER_DTYPE_NEW { $$=new_variable_dim($1); if ($$==NULL) { a4gl_yyerror("Unknown datatype"); YYERROR; } } | USER_DTYPE_ORIG { char buff[256]; strcpy(buff,$1); if (A4GL_find_datatype(upshift(buff))!=-1) { /* char *(*function) (void); function=A4GL_get_datatype_function_n(upshift(buff),"OUTPUT"); if ((int)function != -1 && (int)function != 0) { strcpy(buff,function()); push_type(function(),0,0); } */ $$=new_variable_userdtype(buff); if ($$==NULL) { a4gl_yyerror("Unknown datatype"); } //A4GL_assertion(1,"Not implemented yet"); } else { a4gl_yyerror("Unknown datatype"); } } | SMALLINT { $$=new_simple_variable(NULL,DTYPE_SMINT,0,0); add_feature("DEFINE_SMALLINT"); } | KWFORM { $$=new_variable_object("FORM"); } | UIWINDOW { $$=new_variable_object("ui.window"); } | OMDOMNODE { $$=new_variable_object("om.domnode"); } | OMNODELIST { $$=new_variable_object("om.nodelist"); } | UIFORM { $$=new_variable_object("ui.form"); } | UICOMBOBOX { $$=new_variable_object("ui.combobox"); } | UIBROWSER { $$=new_variable_object("ui.browser"); } | UIPROGRESS { $$=new_variable_object("ui.progress"); } | UIGANTT { $$=new_variable_object("ui.gantt"); } | STRING { if (A4GL_isyes(acl_getenv("STRING_AS_OBJECT"))) { $$=new_variable_object("STRING"); } else { $$=new_simple_variable(NULL,DTYPE_CHAR,19000,0); } } | BASECHANNEL { $$=new_variable_object("base.channel"); } | KW_OBJECT OPEN_BRACKET class_name CLOSE_BRACKET { $$=new_variable_object(downshift($3)); A4GL_used_object_type(&this_module, downshift($3)); } | KW_OBJECT class_name { $$=new_variable_object(downshift($2)); A4GL_used_object_type(&this_module, downshift($2)); } | KW_LOADED_OBJECT_NAME { $$=new_variable_object(downshift($1)); A4GL_used_object_type(&this_module, downshift($1)); } | STATUSBOX { $$=new_variable_object("STATUSBOX"); } | KW_DECIMAL { $$=new_simple_variable(NULL,DTYPE_DECIMAL,16*256+2,0); add_feature("DEFINE_DECIMAL"); } | KW_DECIMAL OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=new_simple_variable(NULL,DTYPE_DECIMAL,atoi($3)*256+2,0); add_feature("DEFINE_DECIMAL"); } | KW_DECIMAL OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { $$=new_simple_variable(NULL,DTYPE_DECIMAL,atoi($3)*256+atoi($5),0); add_feature("DEFINE_DECIMAL"); } | MONEY { $$=new_simple_variable(NULL,DTYPE_MONEY,16*256+2,0); add_feature("DEFINE_MONEY"); } | MONEY OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=new_simple_variable(NULL,DTYPE_MONEY,atoi($3)*256+2,0); add_feature("DEFINE_MONEY"); } | MONEY OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { $$=new_simple_variable(NULL,DTYPE_MONEY,atoi($3)*256+atoi($5),0); add_feature("DEFINE_MONEY"); } | KW_FLOAT op_prec { $$=new_simple_variable(NULL,DTYPE_FLOAT,0,0); add_feature("DEFINE_FLOAT"); } | DOUBLE_PRECISION op_prec { $$=new_simple_variable(NULL,DTYPE_FLOAT,0,0); add_feature("DEFINE_DOUBLE"); } | REAL { $$=new_simple_variable(NULL,DTYPE_FLOAT,0,0); add_feature("DEFINE_REAL"); } | SMALLFLOAT op_prec { $$=new_simple_variable(NULL,DTYPE_SMFLOAT,0,0); add_feature("DEFINE_SMALLFLOAT"); } | KW_DATE { $$=new_simple_variable(NULL,DTYPE_DATE,0,0); add_feature("DEFINE_DATE"); } | KW_BYTE { add_feature("DEFINE_BYTE"); $$=new_simple_variable(NULL,DTYPE_BYTE,0,0); } | BYTES_USE_AS_IMAGE { $$=new_simple_variable(NULL,DTYPE_BYTE,0,0); add_feature("DEFINE_BYTE"); } | BYTES_USE_AS_ASCII { $$=new_simple_variable(NULL,DTYPE_TEXT,0,0); add_feature("DEFINE_TEXT"); } | KW_TEXT { $$=new_simple_variable(NULL,DTYPE_TEXT,0,0); add_feature("DEFINE_TEXT"); } | DATETIME datetime_qual { $$=new_simple_variable(NULL,DTYPE_DTIME,$2,0); add_feature("DEFINE_DATETIME"); } | time_dtypes { $$=$1; } | INTERVAL interval_qual { $$=new_simple_variable(NULL,DTYPE_INTERVAL,$2,0); add_feature("DEFINE_INTERVAL"); } | like_var { $$=new_variable_like($1); } ; time_dtypes: TIME { /* equivalent to Informix DATETIME HOUR TO FRACTION */ $$=new_simple_variable(NULL,DTYPE_DTIME,72,0); add_feature("DEFINE_DATETIME"); } | TIME OPEN_BRACKET INT_VALUE CLOSE_BRACKET { int n; n=atoi($3); switch (n) { case 0: $$=new_simple_variable(NULL,DTYPE_DTIME,70,0); break; /* DATETIME HOUR TO SECOND */ case 1: $$=new_simple_variable(NULL,DTYPE_DTIME,71,0); break; /* DATETIME HOUR TO FRACTION(n) */ case 2: $$=new_simple_variable(NULL,DTYPE_DTIME,72,0); break; /* DATETIME HOUR TO FRACTION(n) */ case 3: $$=new_simple_variable(NULL,DTYPE_DTIME,73,0); break; /* DATETIME HOUR TO FRACTION(n) */ case 4: $$=new_simple_variable(NULL,DTYPE_DTIME,74,0); break; /* DATETIME HOUR TO FRACTION(n) */ case 5: $$=new_simple_variable(NULL,DTYPE_DTIME,75,0); break; /* DATETIME HOUR TO FRACTION(n) */ default: a4gl_yyerror("Invalid time"); YYERROR; } } | TIMESTAMP { $$=new_simple_variable(NULL,DTYPE_DTIME,24,0); } | TIMESTAMP OPEN_BRACKET INT_VALUE CLOSE_BRACKET { int n; n=atoi($3); switch (n) { case 0: $$=new_simple_variable(NULL,DTYPE_DTIME,22,0);break; /* DATETIME YEAR TO SECOND */ case 1: $$=new_simple_variable(NULL,DTYPE_DTIME,23,0);break; /* DATETIME YEAR TO FRACTION(n) */ case 2: $$=new_simple_variable(NULL,DTYPE_DTIME,24,0);break; /* DATETIME YEAR TO FRACTION(n) */ case 3: $$=new_simple_variable(NULL,DTYPE_DTIME,25,0);break; /* DATETIME YEAR TO FRACTION(n) */ case 4: $$=new_simple_variable(NULL,DTYPE_DTIME,26,0);break; /* DATETIME YEAR TO FRACTION(n) */ case 5: $$=new_simple_variable(NULL,DTYPE_DTIME,27,0);break; /* DATETIME YEAR TO FRACTION(n) */ default: a4gl_yyerror("Invalid timestamp"); YYERROR; } } ; op_prec : {$$=0;} | OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=atoi($2); } | OPEN_BRACKET INT_VALUE KW_COMMA INT_VALUE CLOSE_BRACKET { $$=atoi($2); } ; like_var : LIKE identifier KW_DOT identifier KW_DOT identifier { char buff[200]; SPRINTF2(buff,"%s.%s", $2,$4); add_feature("DEFINE_LIKE"); SPRINTF2($$,"%s.%s",buff,$6); add_dependant_table(buff); } | LIKE identifier KW_DOT col_name { char buff[200]; SPRINTF2($$,"%s.%s",$2,$4); add_dependant_table($2); } | LIKE identifier COLON identifier KW_DOT col_name { char buff[200]; SPRINTF2(buff,"%s:%s",$2,$4); add_dependant_table(buff); SPRINTF2($$,"%s.%s",buff,$6); } | LIKE identifier ATSIGN identifier COLON identifier KW_DOT col_name{ char buff[200]; SPRINTF3(buff,"%s@%s:%s",$2,$4,$6); add_dependant_table(buff); SPRINTF2($$,"%s.%s",buff,$8); } | LIKE CHAR_VALUE KW_DOT define_table_name KW_DOT col_name { add_dependant_table($4); SPRINTF2($$,"%s.%s",$4,$6); } ; col_name : identifier { #ifdef DEBUG A4GL_debug("--->%s\n",$1); #endif strcpy($$,$1); } ; datetime_qual : { $$=0; } | dtime_start KW_TO dtime_end { #ifdef DEBUG A4GL_debug("Real datetime %s to %s\n",$1,$3); #endif $$=$1*16+$3; } ; interval_qual : int_start KW_TO int_end { $$=$1*16+$3; } ; interval_qual_i : int_start KW_TO int_end { $$=$1*16+$3; } ; dtime_start : dtime_val { $$=$1; } ; dtime_val : YEAR { $$=1; } | MONTH { $$=2; } | DAY { $$=3; } | HOUR { $$=4; } | MINUTE { $$=5; } | SECOND { $$=6; } | FRACTION opt_frac { $$=$2+6; } ; dtime_end : dtime_val { $$=$1; } ; opt_frac : { $$=2; #ifdef DEBUG A4GL_debug("Nothing in fraction - assume 2"); #endif } | OPEN_BRACKET dtfrac CLOSE_BRACKET { #ifdef DEBUG A4GL_debug("Read fraction .. "); A4GL_debug(" %s",$2); #endif $$=$2; } ; opt_unit_size : { $$=2; #ifdef DEBUG A4GL_debug("Nothing in fraction - assume 2"); #endif } | OPEN_BRACKET INT_VALUE CLOSE_BRACKET { $$=atoi($2); } ; dtfrac : INT_VALUE { if (atoi($1)>5) { a4gl_yyerror("Fraction values are between 0 and 5"); YYERROR; } $$=atoi($1); } ; int_start : int_start_unit opt_unit_size { $$=$2*16+$1; } ; int_start_unit : YEAR { $$=1; } | MONTH { $$=2; } | DAY { $$=3; } | HOUR { $$=4; } | MINUTE { $$=5; } | SECOND { $$=6; } | FRACTION opt_frac { #ifdef DEBUG A4GL_debug("opt_frac returns %s",$2); #endif $$=$2+6; } ; int_end : int_start_unit { $$=$1; } ; op_equal : | EQUAL ;