--- capa/capa51/pProj/capaGrammarDef.y 1999/10/20 19:57:37 1.5 +++ capa/capa51/pProj/capaGrammarDef.y 2000/02/22 18:19:02 1.9 @@ -36,17 +36,18 @@ case S_VAR: case S_CONSTANT: \ printf("STR(%s)\n",(xx)->s_str); break; \ } } -#else +#else /* YACC_DBUG */ #define YYDBUG_PR1(xx) { } #define YYDBUG_PR2(xx,yy) { } #define YYDBUG_PR3(xx,yy,zz) { } #define YYDBUG_PR4(xx,yy,zz,aa) { } #define YYDBUG_SYM(xx) { } -#endif +#endif /* YACC_DBUG */ int yylex(); void yyerror(char*); void free_calc_expr(Symbol*); +void assign_pts (Symbol *, Symbol *, Symbol *); /******************************************************************************/ /* GLOBAL VARIABLES */ /******************************************************************************/ @@ -287,36 +288,36 @@ statement : IDENTIFIER '=' calc_expr ; rqo_def : rqo_speca { rqo_1spec(); } - | rqo_speca "," rqo_def { rqo_2spec(); } + | rqo_speca ',' rqo_def { rqo_2spec(); } ; rqo_speca : an_integer {start_rqo_type(SINGLE);append_rqo($1);} - | an_integer "!" {start_rqo_type(IMMOBILE);append_rqo($1);} - | an_integer "-" an_integer {start_rqo_type(RANGE);append_rqo($1); + | an_integer '!' {start_rqo_type(IMMOBILE);append_rqo($1);} + | an_integer '-' an_integer {start_rqo_type(RANGE);append_rqo($1); append_rqo($3); } - | an_integer "~" rqo_specb {prefix_rqo($1);} - | an_integer "+" rqo_specc {prefix_rqo($1);} + | an_integer '~' rqo_specb {prefix_rqo($1);} + | an_integer '+' rqo_specc {prefix_rqo($1);} ; rqo_specb : an_integer {start_rqo_type(ALL_MIX);append_rqo($1);} - | an_integer "~" rqo_specb {prefix_rqo($1);} - | an_integer "+" an_integer {start_rqo_type(LAST_FIXED);append_rqo($1); + | an_integer '~' rqo_specb {prefix_rqo($1);} + | an_integer '+' an_integer {start_rqo_type(LAST_FIXED);append_rqo($1); append_rqo($3);} ; rqo_specc : an_integer {start_rqo_type(ALL_FIXED);append_rqo($1);} - | an_integer "+" rqo_specd {prefix_rqo($1);} - | an_integer "~" rqo_spece {prefix_rqo($1);} + | an_integer '+' rqo_specd {prefix_rqo($1);} + | an_integer '~' rqo_spece {prefix_rqo($1);} ; rqo_specd : an_integer {start_rqo_type(ALL_FIXED);append_rqo($1);} - | an_integer "+" rqo_specd {prefix_rqo($1);} + | an_integer '+' rqo_specd {prefix_rqo($1);} ; rqo_spece : an_integer {start_rqo_type(FIRST_FIXED);append_rqo($1);} - | an_integer "~" rqo_spece {prefix_rqo($1);} - | an_integer "+" an_integer {start_rqo_type(BOTH_FIXED);append_rqo($1); + | an_integer '~' rqo_spece {prefix_rqo($1);} + | an_integer '+' an_integer {start_rqo_type(BOTH_FIXED);append_rqo($1); append_rqo($3);} ; @@ -554,54 +555,64 @@ pt_list : pt_list ',' point_coo | pt_range { } ; -pt_range : point_coord ':' point_coord '#' IDENTIFIER { PointsList_t *pt; - - if( LastPtsList != NULL ) { - LastPtsList->pts_next = gen_ptslist( $1, $3, $5 ); - pt = LastPtsList->pts_next; - while( pt->pts_next != NULL ) { - pt = pt->pts_next; - } - LastPtsList = pt; - } else { - CurrPtsList = gen_ptslist( $1, $3, $5 ); - LastPtsList = CurrPtsList; - } - if( $1->s_type == S_CONSTANT ) { - capa_mfree($1->s_str); capa_mfree((char *)$1); - } - if( $3->s_type == S_CONSTANT ) { - capa_mfree($3->s_str); capa_mfree((char *)$3); - } - } - | point_coord ':' point_coord '#' a_number { PointsList_t *pt; - - if( LastPtsList != NULL ) { - LastPtsList->pts_next = gen_ptslist( $1, $3, $5 ); - pt = LastPtsList->pts_next; - while( pt->pts_next != NULL ) { - pt = pt->pts_next; - } - LastPtsList = pt; - } else { - CurrPtsList = gen_ptslist( $1, $3, $5 ); - LastPtsList = CurrPtsList; - } - if( $1->s_type == S_CONSTANT ) { - capa_mfree($1->s_str); capa_mfree((char *)$1); - } - if( $3->s_type == S_CONSTANT ) { - capa_mfree($3->s_str); capa_mfree((char *)$3); - } - if( $5->s_type == I_CONSTANT || $5->s_type == R_CONSTANT) { - capa_mfree((char *)$5); - } - } +pt_range : point_coord ':' point_coord '#' IDENTIFIER + { + assign_pts($1,$3,$5); + /*PointsList_t *pt; + if( LastPtsList != NULL ) { + LastPtsList->pts_next = gen_ptslist( $1, $3, $5 ); + pt = LastPtsList->pts_next; + while( pt->pts_next != NULL ) { + pt = pt->pts_next; + } + LastPtsList = pt; + } else { + CurrPtsList = gen_ptslist( $1, $3, $5 ); + LastPtsList = CurrPtsList; + } + if( $1->s_type == S_CONSTANT ) { + capa_mfree($1->s_str); capa_mfree((char *)$1); + } + if( $3->s_type == S_CONSTANT ) { + capa_mfree($3->s_str); capa_mfree((char *)$3); + } + */ + } + | point_coord ':' point_coord '#' ARRAY_ID '[' calc_expr ']' + { assign_pts($1,$3,get_array_symbol($5,$7,1)); } + | point_coord ':' point_coord '#' a_number + { + assign_pts($1,$3,$5); + /*PointsList_t *pt; + + if( LastPtsList != NULL ) { + LastPtsList->pts_next = gen_ptslist( $1, $3, $5 ); + pt = LastPtsList->pts_next; + while( pt->pts_next != NULL ) { + pt = pt->pts_next; + } + LastPtsList = pt; + } else { + CurrPtsList = gen_ptslist( $1, $3, $5 ); + LastPtsList = CurrPtsList; + } + if( $1->s_type == S_CONSTANT ) { + capa_mfree($1->s_str); capa_mfree((char *)$1); + } + if( $3->s_type == S_CONSTANT ) { + capa_mfree($3->s_str); capa_mfree((char *)$3); + } + if( $5->s_type == I_CONSTANT || $5->s_type == R_CONSTANT) { + capa_mfree((char *)$5); + } + */ + } ; -point_coord : IDENTIFIER { $$ = $1; } - | S_CONSTANT { $$ = $1; } +point_coord : IDENTIFIER { $$ = $1; } + | ARRAY_ID '[' calc_expr ']' { $$ = get_array_symbol($1,$3,1); } + | S_CONSTANT { $$ = $1; } ; @@ -834,7 +845,10 @@ an_integer : I_CONSTANT a_real : R_CONSTANT { $$ = $1; } ; -an_array : ARRAY_ID '[' calc_expr ']' { $$=get_array_symbol($1,$3,1); } +an_array : ARRAY_ID '[' calc_expr ']' { + YYDBUG_PR1(" an_array <= ARRAY_ID '['calc_expr ']' "); + $$=get_array_symbol($1,$3,1); + } ; startQ : { /* first matching will occur before first line of input text */ @@ -917,7 +931,7 @@ Symbol *name,*index;int free_symbols; sprintf(key,"%s[%s]",name->s_name,tmp); a_p = find_arrayid(name->s_name); /* use the array name to search array tree */ - /* */ + /* did not check for error! */ s_p = find_array_by_index(a_p,key); /* use the index portion to search along array linked list */ capa_mfree((char *)tmp); capa_mfree((char *)key); @@ -1078,7 +1092,7 @@ append_warn(type,str) int type;char *str /*********** if *b is a constant symbol, destroy (free) b ********************/ /*********** if *a is a var symbol, create a new symbol **********************/ /* do not free(*a) */ -/* */ +/* If either a or b is invalid it propagates the error up the parse tree */ Symbol * symbols_op(a, b, op) Symbol *a; Symbol *b; int op; { @@ -1093,12 +1107,11 @@ if( a->s_type == IDENTIFIER || b->s_type if(a->s_type == IDENTIFIER) { /* a is IDENTIFIER */ sprintf(warn_msg,"var \"%s\" not defined before use.\n", a->s_name); capa_msg(MESSAGE_ERROR,warn_msg); - return (b); + return (a); } else { /* b is IDENTIFIER */ - sprintf(warn_msg, - "var \"%s\" not defined before use.\n",b->s_name); + sprintf(warn_msg,"var \"%s\" not defined before use.\n",b->s_name); capa_msg(MESSAGE_ERROR,warn_msg); - return (a); + return (b); } } else { /* a and b are neither identifiers */ if( (a->s_type == I_VAR) || @@ -1789,6 +1802,32 @@ assign_id_list( s ) Symbol *s; } } +/* void assign_pts ( Symbol* coord1, Symbol* coord2, Symbol* num) { */ +void assign_pts (coord1, coord2, num)Symbol *coord1;Symbol *coord2;Symbol *num; +{ + PointsList_t *pt; + if( LastPtsList != NULL ) { + LastPtsList->pts_next = gen_ptslist( coord1, coord2, num ); + pt = LastPtsList->pts_next; + while( pt->pts_next != NULL ) { + pt = pt->pts_next; + } + LastPtsList = pt; + } else { + CurrPtsList = gen_ptslist( coord1, coord2, num ); + LastPtsList = CurrPtsList; + } + if(coord1->s_type == S_CONSTANT) { + capa_mfree(coord1->s_str); capa_mfree((char *)coord1); + } + if(coord2->s_type == S_CONSTANT) { + capa_mfree(coord2->s_str); capa_mfree((char *)coord2); + } + if(num->s_type == I_CONSTANT || num->s_type == R_CONSTANT) { + capa_mfree((char *)num); + } +} + /* =========================================================================== */