Diff for /parser3/src/main/compile.tab.C between versions 1.81.2.13.2.27 and 1.81.2.13.2.31

version 1.81.2.13.2.27, 2003/04/03 12:40:52 version 1.81.2.13.2.31, 2003/04/04 06:33:26
Line 1053  case 8: Line 1053  case 8:
 {  {
         const String& command=*LA2S(*yyvsp[-2]);          const String& command=*LA2S(*yyvsp[-2]);
         YYSTYPE strings_code=yyvsp[0];          YYSTYPE strings_code=yyvsp[0];
         if(strings_code->count()<1*2) {          if(strings_code->count()<1*OPERATIONS_PER_OPVALUE) {
                 strcpy(PC.error, "@");                  strcpy(PC.error, "@");
                 strcat(PC.error, command.cstr());                  strcat(PC.error, command.cstr());
                 strcat(PC.error, " is empty");                  strcat(PC.error, " is empty");
Line 1066  case 8: Line 1066  case 8:
                         strcat(PC.error, "'");                          strcat(PC.error, "'");
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->count()==1*2) {                  if(strings_code->count()==1*OPERATIONS_PER_OPVALUE) {
                         // new class' name                          // new class' name
                         const String& name=*LA2S(*strings_code);                          const String& name=*LA2S(*strings_code);
                         // creating the class                          // creating the class
Line 1076  case 8: Line 1076  case 8:
                         // append to request's classes                          // append to request's classes
                         PC.request.classes().put(name, cclass);                          PC.request.classes().put(name, cclass);
                 } else {                  } else {
                         strcpy(PC.error, "@"CLASS_NAME" must contain sole name");                          strcpy(PC.error, "@"CLASS_NAME" must contain only one line with class name (contains more then one)");
                         YYERROR;                          YYERROR;
                 }                  }
         } else if(command==USE_CONTROL_METHOD_NAME) {          } else if(command==USE_CONTROL_METHOD_NAME) {
                 for(size_t i=0; i<strings_code->count(); i+=2)                   for(size_t i=0; i<strings_code->count(); i+=OPERATIONS_PER_OPVALUE) 
                         PC.request.use_file(PC.request.main_class, *LA2S(*strings_code, i));                          PC.request.use_file(PC.request.main_class, *LA2S(*strings_code, i));
         } else if(command==BASE_NAME) {          } else if(command==BASE_NAME) {
                 if(PC.cclass->base_class()) { // already changed from default?                  if(PC.cclass->base_class()) { // already changed from default?
Line 1089  case 8: Line 1089  case 8:
                         strcat(PC.error, "'");                          strcat(PC.error, "'");
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->count()==1*2) {                  if(strings_code->count()==1*OPERATIONS_PER_OPVALUE) {
                         const String& base_name=*LA2S(*strings_code);                          const String& base_name=*LA2S(*strings_code);
                         if(Value* base_class_value=PC.request.classes().get(base_name)) {                          if(Value* base_class_value=PC.request.classes().get(base_name)) {
                                 // @CLASS == @BASE sanity check                                  // @CLASS == @BASE sanity check
Line 1135  case 16: Line 1135  case 16:
         ArrayString* params_names=0;          ArrayString* params_names=0;
         if(int size=params_names_code->count()) {          if(int size=params_names_code->count()) {
                 params_names=new ArrayString;                  params_names=new ArrayString;
                 for(int i=0; i<size; i+=2)                  for(int i=0; i<size; i+=OPERATIONS_PER_OPVALUE)
                         *params_names+=LA2S(*params_names_code, i);                          *params_names+=LA2S(*params_names_code, i);
         }          }
   
Line 1143  case 16: Line 1143  case 16:
         ArrayString* locals_names=0;          ArrayString* locals_names=0;
         if(int size=locals_names_code->count()) {          if(int size=locals_names_code->count()) {
                 locals_names=new ArrayString;                  locals_names=new ArrayString;
                 for(int i=0; i<size; i+=2)                  for(int i=0; i<size; i+=OPERATIONS_PER_OPVALUE)
                         *locals_names+=LA2S(*locals_names_code, i);                          *locals_names+=LA2S(*locals_names_code, i);
         }          }
   
Line 1193  case 42: Line 1193  case 42:
         ArrayOperation* diving_code=yyvsp[0];          ArrayOperation* diving_code=yyvsp[0];
         const String* first_name=LA2S(*diving_code);          const String* first_name=LA2S(*diving_code);
         // self.xxx... -> xxx...          // self.xxx... -> xxx...
         // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...          // OP_VALUE+origin+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...
         if(first_name && *first_name==SELF_ELEMENT_NAME) {          if(first_name && *first_name==SELF_ELEMENT_NAME) {
                 O(*yyval, OP_WITH_SELF); /* stack: starting context */                  O(*yyval, OP_WITH_SELF); /* stack: starting context */
                 P(*yyval, *diving_code,                   P(*yyval, *diving_code, 
                         /* skip over... */                          /* skip over... */
                         diving_code->count()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/);                          diving_code->count()>=4?4/*OP_VALUE+origin+string+OP_GET_ELEMENTx*/:3/*OP_+origin+string*/);
         } else {          } else {
                 O(*yyval, OP_WITH_READ); /* stack: starting context */                  O(*yyval, OP_WITH_READ); /* stack: starting context */
   
                 // ^if ELEMENT -> ^if ELEMENT_OR_OPERATOR                  // ^if ELEMENT -> ^if ELEMENT_OR_OPERATOR
                 // OP_VALUE+string+OP_GET_ELEMENT. -> OP_VALUE+string+OP_GET_ELEMENT_OR_OPERATOR.                  // OP_VALUE+origin+string+OP_GET_ELEMENT. -> OP_VALUE+origin+string+OP_GET_ELEMENT_OR_OPERATOR.
                 if(PC.in_call_value && diving_code->count()==3)                  if(PC.in_call_value && diving_code->count()==4)
                         diving_code->put(2, OP_GET_ELEMENT_OR_OPERATOR);                          diving_code->put(4-1, OP_GET_ELEMENT_OR_OPERATOR);
                 P(*yyval, *diving_code);                  P(*yyval, *diving_code);
         }          }
         /* diving code; stack: current context */          /* diving code; stack: current context */
Line 1233  case 50: Line 1233  case 50:
         ArrayOperation* diving_code=yyvsp[0];          ArrayOperation* diving_code=yyvsp[0];
         const String* first_name=LA2S(*diving_code);          const String* first_name=LA2S(*diving_code);
         // $self.xxx... -> $xxx...          // $self.xxx... -> $xxx...
         // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...          // OP_VALUE+origin+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...
         if(first_name && *first_name==SELF_ELEMENT_NAME) {          if(first_name && *first_name==SELF_ELEMENT_NAME) {
                 O(*yyval, OP_WITH_SELF); /* stack: starting context */                  O(*yyval, OP_WITH_SELF); /* stack: starting context */
                 P(*yyval, *diving_code,                   P(*yyval, *diving_code, 
                         /* skip over... */                          /* skip over... */
                         diving_code->count()>=3?3/*OP_VALUE+string+OP_GET_ELEMENTx*/:2/*OP_+string*/);                          diving_code->count()>=4?4/*OP_VALUE+origin+string+OP_GET_ELEMENTx*/:3/*OP_+origin+string*/);
         } else {          } else {
                 O(*yyval, OP_WITH_ROOT); /* stack: starting context */                  O(*yyval, OP_WITH_ROOT); /* stack: starting context */
                 P(*yyval, *diving_code);                  P(*yyval, *diving_code);
Line 1324  case 69: Line 1324  case 69:
         yyval=yyvsp[-3]; /* with_xxx,diving code; stack: context,method_junction */          yyval=yyvsp[-3]; /* with_xxx,diving code; stack: context,method_junction */
   
         YYSTYPE params_code=yyvsp[-1];          YYSTYPE params_code=yyvsp[-1];
         if(params_code->count()==3) { // probably [] case. [OP_VALUE + Void + STORE_PARAM]          if(params_code->count()==4) { // probably [] case. [OP_VALUE+origin+Void+STORE_PARAM]
                 if(Value* value=LA2V(*params_code)) // it is OP_VALUE + value?                  if(Value* value=LA2V(*params_code)) // it is OP_VALUE+origin+value?
                         if(!value->is_defined()) // value is VVoid?                          if(!value->is_defined()) // value is VVoid?
                                 params_code=0; // ^zzz[] case. don't append lone empty param.                                  params_code=0; // ^zzz[] case. don't append lone empty param.
         }          }
Line 2629  break2: Line 2629  break2:
                 }                  }
         }          }
         if(!pc.string.is_empty()) { // something accumulated?          if(!pc.string.is_empty()) { // something accumulated?
                 // create STRING value: array of OP_VALUE+vstring                  // create STRING value: array of OP_VALUE+origin+vstring
                 *lvalp=VL(                  *lvalp=VL(
                         new VString(*new String(pc.string, String::L_CLEAN)),                          new VString(*new String(pc.string, String::L_CLEAN)),
                         pc.file_no, pc.string_start.line, pc.string_start.col);                          pc.file_no, pc.string_start.line, pc.string_start.col);

Removed from v.1.81.2.13.2.27  
changed lines
  Added in v.1.81.2.13.2.31


E-mail: