Diff for /capa/capa51/pProj/capaGrammarDef.y between versions 1.1 and 1.7

version 1.1, 1999/09/28 21:26:21 version 1.7, 1999/12/07 19:10:47
Line 194  a_line       :  startL  statement EoL Line 194  a_line       :  startL  statement EoL
              |  EoL                     { YYDBUG_PR1(" a_line <= (CR)\n");  }               |  EoL                     { YYDBUG_PR1(" a_line <= (CR)\n");  }
              |  VERBATIM                { YYDBUG_PR1(" a_line <= (VERBATIM)\n");               |  VERBATIM                { YYDBUG_PR1(" a_line <= (VERBATIM)\n");
                                   switch(Parsemode_f) {                                    switch(Parsemode_f) {
   case TeX_MODE: append_text("\begin{verbatim}");    case TeX_MODE: append_text("\\begin{verbatim}");
     break;      break;
   case HTML_MODE: append_text("<PRE>");    case HTML_MODE: append_text("<PRE>");
     break;      break;
Line 202  a_line       :  startL  statement EoL Line 202  a_line       :  startL  statement EoL
                                           append_text($1->s_str);                                            append_text($1->s_str);
                                           capa_mfree($1->s_str); capa_mfree((char *)$1);                                            capa_mfree($1->s_str); capa_mfree((char *)$1);
                                   switch(Parsemode_f) {                                    switch(Parsemode_f) {
   case TeX_MODE: append_text("\end{verbatim}");    case TeX_MODE: append_text("\\end{verbatim}\n");
     break;      break;
   case HTML_MODE: append_text("</PRE>");    case HTML_MODE: append_text("</PRE>\n");
     break;      break;
   }    }
                                         }                                          }
Line 332  q_text       :  TEXT_LINE Line 332  q_text       :  TEXT_LINE
              ;               ;
                             
 if_expr      :  CAPA_IF '(' calc_expr  ')'  if_expr      :  CAPA_IF '(' calc_expr  ')'
                                         { int leng; /* begin_next_line(); no use, can be get rid of */                                          { int leng=0; /* begin_next_line(); no use, can be get rid of */
                                           YYDBUG_PR2("(IF expr <IFcount=%d>)\n",IFcount);                                            YYDBUG_PR2("(IF expr <IFcount=%d>)\n",IFcount);
                                           switch($3->s_type) {                                            switch($3->s_type) {
                                             case IDENTIFIER:                                               case IDENTIFIER: 
Line 358  if_expr      :  CAPA_IF '(' calc_expr  ' Line 358  if_expr      :  CAPA_IF '(' calc_expr  '
                                                    }                                                     }
                                                    break;                                                     break;
                                             case S_CONSTANT:                                               case S_CONSTANT: 
                                                    leng = strlen($3->s_str);             if ( $3->s_str) {
                                                    capa_mfree($3->s_str);        leng = strlen($3->s_str);
                                                         capa_mfree($3->s_str);
                                                      } 
                                                    if(leng == 0) {                                                     if(leng == 0) {
                                                       IFstatus[IFcount] = IF_FALSE;                                                        IFstatus[IFcount] = IF_FALSE;
                                                       begin_if_skip();                                                        begin_if_skip();
Line 369  if_expr      :  CAPA_IF '(' calc_expr  ' Line 371  if_expr      :  CAPA_IF '(' calc_expr  '
                                                    }                                                     }
                                                    break;                                                     break;
                                             case S_VAR:                                              case S_VAR:
                                                    leng = strlen($3->s_str);             if ( $3->s_str) {
                                                    if(leng == 0) {        leng = strlen($3->s_str);
                                                         capa_mfree($3->s_str);
                                                      }
      if(leng == 0) {
                                                       IFstatus[IFcount] = IF_FALSE;                                                        IFstatus[IFcount] = IF_FALSE;
                                                       begin_if_skip();                                                        begin_if_skip();
                                                    }else{                                                     }else{
Line 549  pt_list      :   pt_list  ','  point_coo Line 554  pt_list      :   pt_list  ','  point_coo
              |   pt_range                           { }               |   pt_range                           { }
              ;               ;
   
 pt_range     :   point_coord   ':'  point_coord  '#'  IDENTIFIER   { PointsList_t *pt;  pt_range     :   point_coord   ':'  point_coord  '#'  IDENTIFIER   
                                 { 
                                                                      if( LastPtsList != NULL ) {   assign_pts($1,$3,$5);
                                                                         LastPtsList->pts_next = gen_ptslist( $1, $3, $5 );   /*PointsList_t *pt;
                                                                         pt = LastPtsList->pts_next;          if( LastPtsList != NULL ) {
                                                                         while( pt->pts_next != NULL ) {    LastPtsList->pts_next = gen_ptslist( $1, $3, $5 );
                                                                            pt = pt->pts_next;    pt = LastPtsList->pts_next;
                                                                         }    while( pt->pts_next != NULL ) {
                                                                         LastPtsList = pt;      pt = pt->pts_next;
                                                                      } else {    }
                                                                         CurrPtsList = gen_ptslist( $1, $3, $5 );    LastPtsList = pt;
                                                                         LastPtsList = CurrPtsList;   } else {
                                                                      }    CurrPtsList = gen_ptslist( $1, $3, $5 );
                                                                      if( $1->s_type == S_CONSTANT ) {    LastPtsList = CurrPtsList;
                                                                          capa_mfree($1->s_str); capa_mfree((char *)$1);   }
                                                                      }   if( $1->s_type == S_CONSTANT ) {
                                                                      if( $3->s_type == S_CONSTANT ) {    capa_mfree($1->s_str); capa_mfree((char *)$1);
                                                                          capa_mfree($3->s_str); capa_mfree((char *)$3);   }
                                                                      }   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 );               |   point_coord   ':'  point_coord  '#'  ARRAY_ID '[' calc_expr ']'
                                                                         pt = LastPtsList->pts_next;                                { assign_pts($1,$3,get_array_symbol($5,$7,1)); }
                                                                         while( pt->pts_next != NULL ) {               |   point_coord   ':'  point_coord  '#'  a_number     
                                                                            pt = pt->pts_next;                                { 
                                                                         }   assign_pts($1,$3,$5);
                                                                         LastPtsList = pt;   /*PointsList_t *pt;
                                                                      } else {        
                                                                         CurrPtsList = gen_ptslist( $1, $3, $5 );   if( LastPtsList != NULL ) {
                                                                         LastPtsList = CurrPtsList;     LastPtsList->pts_next = gen_ptslist( $1, $3, $5 );
                                                                      }     pt = LastPtsList->pts_next;
                                                                      if( $1->s_type == S_CONSTANT ) {     while( pt->pts_next != NULL ) {
                                                                          capa_mfree($1->s_str); capa_mfree((char *)$1);       pt = pt->pts_next;
                                                                      }     }
                                                                      if( $3->s_type == S_CONSTANT ) {     LastPtsList = pt;
                                                                          capa_mfree($3->s_str); capa_mfree((char *)$3);   } else {
                                                                      }     CurrPtsList = gen_ptslist( $1, $3, $5 );
                                                                      if( $5->s_type == I_CONSTANT || $5->s_type == R_CONSTANT) {     LastPtsList = CurrPtsList;
                                                                          capa_mfree((char *)$5);   }
                                                                      }   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;  }  point_coord  :   IDENTIFIER                 { $$ = $1;  }
              |   S_CONSTANT            { $$ = $1;  }               |   ARRAY_ID '[' calc_expr ']' { $$ = get_array_symbol($1,$3,1); }
                |   S_CONSTANT                 { $$ = $1;  }
              ;               ;
   
   
Line 646  answer_comp  : ANS_CS                  { Line 661  answer_comp  : ANS_CS                  {
   
   
 map_expr     : startM '(' basic_constr ';' var_list ';' arg_list ')'  map_expr     : startM '(' basic_constr ';' var_list ';' arg_list ')'
                                       { char   key[SIXTEEN];                                        { char   key[SMALL_LINE_BUFFER];
                                         char   warn_msg[WARN_MSG_LENGTH];                                          char   warn_msg[WARN_MSG_LENGTH];
                                         int    result=0;                                          int    result=0;
   
Line 674  map_expr     : startM '(' basic_constr ' Line 689  map_expr     : startM '(' basic_constr '
                                         free_arglist($7->s_argp);                                          free_arglist($7->s_argp);
                                       }                                        }
              | startR '(' basic_constr ';' var_list ';' arg_list ')'               | startR '(' basic_constr ';' var_list ';' arg_list ')'
                                       { char   key[SIXTEEN];                                        { char   key[SMALL_LINE_BUFFER];
                                         char   warn_msg[WARN_MSG_LENGTH];                                          char   warn_msg[WARN_MSG_LENGTH];
  int    result=0;   int    result=0;
   
Line 889  Symbol *name,*index;int free_symbols; Line 904  Symbol *name,*index;int free_symbols;
   Symbol  *s_p, *a_p;    Symbol  *s_p, *a_p;
   char    *key, *tmp;    char    *key, *tmp;
   int      leng, idx_len;    int      leng, idx_len;
     
   leng = strlen(name->s_name)+8; /* [ ] */    leng = strlen(name->s_name)+8; /* [ ] */
       
   switch(index->s_type) {    switch(index->s_type) {
Line 933  Symbol *ar_name;int num_elem; Line 947  Symbol *ar_name;int num_elem;
 {  {
   int     i;    int     i;
   Symbol *arg_list,*a_p;    Symbol *arg_list,*a_p;
   char    idx_str[SIXTEEN];    char    idx_str[MAX_BUFFER_SIZE];
       
   a_p = find_arrayid(ar_name);    a_p = find_arrayid(ar_name->s_name);
   i = 1;    i = 1;
   sprintf(idx_str,"%ld",i); /* create array elements with integer index */    sprintf(idx_str,"%s[%d]",ar_name->s_name,i); /* create array elements with integer index */
   arg_list = find_array_by_index(a_p,idx_str); /* will create a new element if not found */    arg_list = find_array_by_index(a_p,idx_str); /* will create a new element if not found */
   arg_list->s_argc=1;    arg_list->s_argc=1;
   arg_list->s_argp=new_arglist(arg_list);    arg_list->s_argp=new_arglist(arg_list);
       
   for (i=2;i<=num_elem;i++) {    for (i=2;i<=num_elem;i++) {
       sprintf(idx_str,"%ld",i);        sprintf(idx_str,"%s[%d]",ar_name->s_name,i);
       arg_list->s_argc++;        arg_list->s_argc++;
       arg_list->s_argp=addto_arglist(arg_list->s_argp,find_array_by_index(a_p,idx_str));        arg_list->s_argp=addto_arglist(arg_list->s_argp,find_array_by_index(a_p,idx_str));
   }    }
Line 1074  append_warn(type,str) int type;char *str Line 1088  append_warn(type,str) int type;char *str
 /*********** if *b is a constant symbol, destroy (free) b ********************/  /*********** if *b is a constant symbol, destroy (free) b ********************/
 /*********** if *a is a var symbol, create a new symbol **********************/  /*********** if *a is a var symbol, create a new symbol **********************/
 /*                 do not free(*a)     */  /*                 do not free(*a)     */
 /*           */  /*  If either a or b is invalid it propagates the error up the parse tree    */
 Symbol *  Symbol *
 symbols_op(a, b, op) Symbol *a; Symbol *b; int op;  symbols_op(a, b, op) Symbol *a; Symbol *b; int op;
 {  {
Line 1089  if( a->s_type == IDENTIFIER || b->s_type Line 1103  if( a->s_type == IDENTIFIER || b->s_type
    if(a->s_type == IDENTIFIER) { /* a is IDENTIFIER */     if(a->s_type == IDENTIFIER) { /* a is IDENTIFIER */
      sprintf(warn_msg,"var \"%s\" not defined before use.\n", a->s_name);       sprintf(warn_msg,"var \"%s\" not defined before use.\n", a->s_name);
      capa_msg(MESSAGE_ERROR,warn_msg);       capa_msg(MESSAGE_ERROR,warn_msg);
      return (b);       return (a);
    } else { /* b is IDENTIFIER */     } else { /* b is IDENTIFIER */
      sprintf(warn_msg,       sprintf(warn_msg,"var \"%s\" not defined before use.\n",b->s_name);
       "var \"%s\" not defined before use.\n",b->s_name);  
      capa_msg(MESSAGE_ERROR,warn_msg);       capa_msg(MESSAGE_ERROR,warn_msg);
      return (a);       return (b);
    }     }
  } else {  /* a and b are neither identifiers */   } else {  /* a and b are neither identifiers */
   if( (a->s_type == I_VAR) ||    if( (a->s_type == I_VAR) ||
Line 1139  if( a->s_type == IDENTIFIER || b->s_type Line 1152  if( a->s_type == IDENTIFIER || b->s_type
         (b->s_type == S_VAR) || (b->s_type == S_CONSTANT) ) { /* either a or b is a string */          (b->s_type == S_VAR) || (b->s_type == S_CONSTANT) ) { /* either a or b is a string */
       type = S_CONSTANT;  /* the return type is a string */        type = S_CONSTANT;  /* the return type is a string */
       if( (a->s_type == S_VAR) || (a->s_type == S_CONSTANT) ) { /* a is a string */        if( (a->s_type == S_VAR) || (a->s_type == S_CONSTANT) ) { /* a is a string */
         switch( b->s_type ) {   if (a->s_str == NULL || 
          case I_VAR:      (((b->s_type == S_VAR) || (b->s_type == S_CONSTANT)) && b->s_str == NULL)) {
          case I_CONSTANT:    if (a->s_str == NULL) {
                    leng = SIXTEEN; /* assuming a long integer does not exceed 16 digits*/      sprintf(warn_msg,"variable %s has not yet been assigned a value.\n",a->s_name);
                    b_str= capa_malloc(sizeof(char), leng);      capa_msg(MESSAGE_ERROR,warn_msg);
                    sprintf(b_str,"%ld", b->s_int);    }
                    break;    if (((b->s_type == S_VAR) || (b->s_type == S_CONSTANT)) && b->s_str == NULL) {
          case R_VAR:      sprintf(warn_msg,"variable %s has not yet been assigned a value.\n",a->s_name);
          case R_CONSTANT:      capa_msg(MESSAGE_ERROR,warn_msg);
                    leng = SMALL_LINE_BUFFER;/*assuming a double does not exceed128chars*/    }
                    b_str= capa_malloc(sizeof(char), leng);   } else { /* a is a valid string */
                    sprintf(b_str,"%.15g", b->s_real);    switch( b->s_type ) {
                    break;    case I_VAR:
          case S_VAR:    case I_CONSTANT:
          case S_CONSTANT: /* DONE: get rid of limitations on b_str[] */      leng = SMALL_LINE_BUFFER; /* assuming a long integer does not exceed 128 digits*/
                    leng =  strlen( b->s_str ) +  1;      b_str= capa_malloc(sizeof(char), leng);
                    b_str= capa_malloc(sizeof(char), leng);      sprintf(b_str,"%ld", b->s_int);
                    sprintf(b_str,"%s",b->s_str);      break;
                    /*if(b->s_type == S_CONSTANT)  capa_mfree(b->s_str);*/    case R_VAR:
                    break;    case R_CONSTANT:
         }      leng = SMALL_LINE_BUFFER;/*assuming a double does not exceed128chars*/
         switch( op ) {      b_str= capa_malloc(sizeof(char), leng);
          case ADD_op:      sprintf(b_str,"%.15g", b->s_real);
                    leng =  strlen( a->s_str ) + strlen(b_str) + 1;      break;
                    r_strp = capa_malloc(sizeof(char), leng);    /* **** */    case S_VAR:
                    strcat(r_strp, a->s_str);    case S_CONSTANT: /* DONE: get rid of limitations on b_str[] */
                    strcat(r_strp, b_str);  /* concatenate two strings together */      leng =  strlen( b->s_str ) +  1;
                    if( !new )   capa_mfree(a->s_str);        b_str= capa_malloc(sizeof(char), leng);
    a_symp->s_str = r_strp;      sprintf(b_str,"%s",b->s_str);
                    break;      /*if(b->s_type == S_CONSTANT)  capa_mfree(b->s_str);*/
          case SUB_op:      break;
          case MUL_op:    }
          case DIV_op:    switch( op ) {
          case IDIV_op:    case ADD_op:
                    if( !new )   capa_mfree(a->s_str);      leng =  strlen( a->s_str ) + strlen(b_str) + 1;
                    a_symp->s_str = strsave("<<Op NOT DEFINED>>");      r_strp = capa_malloc(sizeof(char), leng);    /* **** */
                    sprintf(warn_msg,"integer division (%%) cannot accept string operand!\n");      strcat(r_strp, a->s_str);
                    capa_msg(MESSAGE_ERROR,warn_msg);      strcat(r_strp, b_str);  /* concatenate two strings together */
                    break;      if( !new )   capa_mfree(a->s_str);  
          case EQ_op: a_symp->s_int = (strcmp(a->s_str, b_str) == 0? 1: 0);      a_symp->s_str = r_strp;
                      type = I_CONSTANT;  break;      break;
          case NE_op: a_symp->s_int = (strcmp(a->s_str, b_str) == 0? 0: 1);    case SUB_op:
                      type = I_CONSTANT;  break;    case MUL_op:
          case GT_op: a_symp->s_int = (strcmp(a->s_str, b_str) > 0? 1: 0);    case DIV_op:
                      type = I_CONSTANT;  break;    case IDIV_op:
          case GE_op: a_symp->s_int = (strcmp(a->s_str, b_str) >= 0? 1: 0);      if( !new )   capa_mfree(a->s_str);
                      type = I_CONSTANT;  break;      a_symp->s_str = strsave("<<Op NOT DEFINED>>");
          case LT_op: a_symp->s_int = (strcmp(a->s_str, b_str) < 0? 1: 0);      sprintf(warn_msg,"integer division (%%) cannot accept string operand!\n");
                      type = I_CONSTANT;  break;      capa_msg(MESSAGE_ERROR,warn_msg);
          case LE_op: a_symp->s_int = (strcmp(a->s_str, b_str) <= 0? 1: 0);      break;
                      type = I_CONSTANT;  break;    case EQ_op: a_symp->s_int = (strcmp(a->s_str, b_str) == 0? 1: 0);
          case AND_op: if( (a->s_str[0] != 0) && (b_str[0] != 0)) {      type = I_CONSTANT;  break;
                        a_symp->s_int = 1;    case NE_op: a_symp->s_int = (strcmp(a->s_str, b_str) == 0? 0: 1);
                       } else {      type = I_CONSTANT;  break;
                        a_symp->s_int = 0;    case GT_op: a_symp->s_int = (strcmp(a->s_str, b_str) > 0? 1: 0);
                       }       type = I_CONSTANT;  break;
                      type = I_CONSTANT;  break;    case GE_op: a_symp->s_int = (strcmp(a->s_str, b_str) >= 0? 1: 0);
          case OR_op: if( (a->s_str[0] != 0) || (b_str[0] != 0)) {      type = I_CONSTANT;  break;
                        a_symp->s_int = 1;    case LT_op: a_symp->s_int = (strcmp(a->s_str, b_str) < 0? 1: 0);
                       } else {      type = I_CONSTANT;  break;
                        a_symp->s_int = 0;    case LE_op: a_symp->s_int = (strcmp(a->s_str, b_str) <= 0? 1: 0);
                       }       type = I_CONSTANT;  break;
                      type = I_CONSTANT;  break;    case AND_op: 
         }      if( (a->s_str[0] != 0) && (b_str[0] != 0)) {
         a_symp->s_int = 1;
       } else {
         a_symp->s_int = 0;
       } 
       type = I_CONSTANT;  break;
     case OR_op: 
       if( (a->s_str[0] != 0) || (b_str[0] != 0)) {
         a_symp->s_int = 1;
       } else {
         a_symp->s_int = 0;
       } 
       type = I_CONSTANT;  break;
     }
    }
  if (b_str!=NULL) capa_mfree(b_str);   if (b_str!=NULL) capa_mfree(b_str);
       } else {  /* b is string and a is either integer or real */        } else {  /* b is string and a is either integer or real */
         switch( a->s_type ) {          switch( a->s_type ) {
Line 1326  char * Line 1353  char *
 format_toTeX( real ) char *real;  format_toTeX( real ) char *real;
 {  {
   int     idx, length, fraclength, i_exp;    int     idx, length, fraclength, i_exp;
   char   *expo_p, fracS[SIXTEEN], result[ONE_K], *areal;    char   *expo_p, fracS[SMALL_LINE_BUFFER], result[ONE_K], *areal;
   char    warn_msg[WARN_MSG_LENGTH];    char    warn_msg[WARN_MSG_LENGTH];
       
   length = strlen(real);    length = strlen(real);
Line 1374  char * Line 1401  char *
 format_toHTML( real ) char *real;  format_toHTML( real ) char *real;
 {  {
   int     idx, length, fraclength, i_exp;    int     idx, length, fraclength, i_exp;
   char   *expo_p, fracS[SIXTEEN], result[ONE_K], *areal;    char   *expo_p, fracS[SMALL_LINE_BUFFER], result[ONE_K], *areal;
   char    warn_msg[WARN_MSG_LENGTH];    char    warn_msg[WARN_MSG_LENGTH];
       
   length = strlen(real);    length = strlen(real);
Line 1487  display_var( s )Symbol *s; Line 1514  display_var( s )Symbol *s;
               }                }
             }              }
            break;             break;
      case S_VAR:  case S_CONSTANT:       case S_VAR:  case S_CONSTANT:  
             aline = (char *)capa_malloc(strlen(s->s_str)+1,1);              if (s->s_str == NULL) {
             sprintf(aline,"%s",s->s_str);        sprintf(warn_msg,"variable %s has not yet been assigned a value.\n",
         s->s_name);
         capa_msg(MESSAGE_ERROR,warn_msg);
         aline=(char *)capa_malloc(9,1);
         sprintf(aline,"NO VALUE");
               } else {
         aline = (char *)capa_malloc(strlen(s->s_str)+1,1);
         sprintf(aline,"%s",s->s_str);
       }
            break;             break;
    }     }
    append_text(aline);     append_text(aline);
    capa_mfree((char *)aline);     capa_mfree((char *)aline);
    if(s->s_format) {      if(s->s_format) { capa_mfree((char *)s->s_format); }
       capa_mfree((char *)s->s_format);  
    }  
    s->s_format = NULL;     s->s_format = NULL;
    switch(s->s_type) { /* free up spaces taken by constants */     switch(s->s_type) { /* free up spaces taken by constants */
      case I_CONSTANT:       case I_CONSTANT:
Line 1765  assign_id_list( s ) Symbol *s; Line 1798  assign_id_list( s ) Symbol *s;
   }    }
 }  }
   
   void assign_pts ( 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);
     }
   }
   
 /* =========================================================================== */  /* =========================================================================== */
   
   

Removed from v.1.1  
changed lines
  Added in v.1.7


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>