Diff for /parser3/src/main/compile.y between versions 1.204.2.2 and 1.204.2.6

version 1.204.2.2, 2003/01/30 14:59:44 version 1.204.2.6, 2003/02/04 09:44:27
Line 116  all: Line 116  all:
         one_big_piece {          one_big_piece {
         MethodPtr method(new Method(main_method_name, Method::CT_ANY,          MethodPtr method(new Method(main_method_name, Method::CT_ANY,
                 0, 0, /*min, max numbered_params_count*/                  0, 0, /*min, max numbered_params_count*/
                 ArrayConstStringPtr(0)/*param_names*/, ArrayConstStringPtr(0)/*local_names*/,                   ArrayStringPtr(0)/*param_names*/, ArrayStringPtr(0)/*local_names*/, 
                 $1/*parser_code*/, 0/*native_code*/));                  $1/*parser_code*/, 0/*native_code*/));
         PC.cclass->add_method(main_method_name, method);          PC.cclass->add_method(main_method_name, method);
 }  }
Line 129  method: control_method | code_method; Line 129  method: control_method | code_method;
   
 control_method: '@' STRING '\n'   control_method: '@' STRING '\n' 
                                 maybe_control_strings {                                  maybe_control_strings {
         ConstStringPtr command=LA2S(*$2);          StringPtr command=LA2S(*$2);
         YYSTYPE strings_code=$4;          YYSTYPE strings_code=$4;
         if(strings_code->count()<1*2) {          if(strings_code->count()<1*2) {
                 strcpy(PC.error, "@");                  strcpy(PC.error, "@");
Line 146  control_method: '@' STRING '\n' Line 146  control_method: '@' STRING '\n'
                 }                  }
                 if(strings_code->count()==1*2) {                  if(strings_code->count()==1*2) {
                         // new class' name                          // new class' name
                         ConstStringPtr name=LA2S(*strings_code);                          StringPtr name=LA2S(*strings_code);
                         // creating the class                          // creating the class
                         PC.cclass=VStateless_classPtr(new VClass);                          VStateless_classPtr cclass(new VClass);
                           PC.cclass=cclass.get();
                         PC.cclass->set_name(name);                          PC.cclass->set_name(name);
                         // append to request's classes                          // append to request's classes
                         PC.request->classes().put(name, PC.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 sole name");
                         YYERROR;                          YYERROR;
                 }                  }
         } else if(*command==USE_CONTROL_METHOD_NAME) {          } else if(*command==USE_CONTROL_METHOD_NAME) {
                 for(int i=0; i<strings_code->count(); i+=2)                   for(int i=0; i<strings_code->count(); i+=2) 
                         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?
                         strcpy(PC.error, "class already have a base '");                          strcpy(PC.error, "class already have a base '");
Line 167  control_method: '@' STRING '\n' Line 168  control_method: '@' STRING '\n'
                         YYERROR;                          YYERROR;
                 }                  }
                 if(strings_code->count()==1*2) {                  if(strings_code->count()==1*2) {
                         ConstStringPtr base_name=LA2S(*strings_code);                          StringPtr base_name=LA2S(*strings_code);
                         if(VStateless_classPtr base_class=PC.request->classes().get(base_name)) {                          if(ValuePtr base_class_value=PC.request->classes().get(base_name)) {
                                 // @CLASS == @BASE sanity check                                  // @CLASS == @BASE sanity check
                                 if(PC.cclass.get()==base_class.get()) {                                  if(VStateless_class *base_class=base_class_value->get_class()) {
                                         strcpy(PC.error, "@"CLASS_NAME" equals @"BASE_NAME);                                          if(PC.cclass==base_class) {
                                                   strcpy(PC.error, "@"CLASS_NAME" equals @"BASE_NAME);
                                                   YYERROR;
                                           }
                                           PC.cclass->get_class()->set_base(base_class);
                                   } else { // they asked to derive from a class without methods ['env' & co]
                                           strcpy(PC.error, base_name->cstr());
                                           strcat(PC.error, ": you can not derive from this class in @"BASE_NAME);
                                         YYERROR;                                          YYERROR;
                                 }                                  }
                                 PC.cclass->set_base(base_class);  
                         } else {                          } else {
                                 strcpy(PC.error, base_name->cstr());                                  strcpy(PC.error, base_name->cstr());
                                 strcat(PC.error, ": undefined class in @"BASE_NAME);                                  strcat(PC.error, ": undefined class in @"BASE_NAME);
Line 199  maybe_string: empty | STRING; Line 206  maybe_string: empty | STRING;
   
 code_method: '@' STRING bracketed_maybe_strings maybe_bracketed_strings maybe_comment '\n'   code_method: '@' STRING bracketed_maybe_strings maybe_bracketed_strings maybe_comment '\n' 
                         maybe_codes {                          maybe_codes {
         ConstStringPtr name=LA2S(*$2);          StringPtr name=LA2S(*$2);
   
         YYSTYPE params_names_code=$3;          YYSTYPE params_names_code=$3;
         ArrayConstStringPtr params_names;          ArrayStringPtr params_names;
         if(int size=params_names_code->count()) {          if(int size=params_names_code->count()) {
                 params_names=ArrayConstStringPtr(new ArrayConstString);                  params_names=ArrayStringPtr(new ArrayString);
                 for(int i=0; i<size; i+=2)                  for(int i=0; i<size; i+=2)
                         *params_names+=LA2S(*params_names_code, i);                          *params_names+=LA2S(*params_names_code, i);
         }          }
   
         YYSTYPE locals_names_code=$4;          YYSTYPE locals_names_code=$4;
         ArrayConstStringPtr locals_names;          ArrayStringPtr locals_names;
         if(int size=locals_names_code->count()) {          if(int size=locals_names_code->count()) {
                 locals_names=ArrayConstStringPtr(new ArrayConstString);                  locals_names=ArrayStringPtr(new ArrayString);
                 for(int i=0; i<size; i+=2)                  for(int i=0; i<size; i+=2)
                         *locals_names+=LA2S(*locals_names_code, i);                          *locals_names+=LA2S(*locals_names_code, i);
         }          }
Line 259  name_without_curly_rdive: Line 266  name_without_curly_rdive:
 name_without_curly_rdive_read: name_without_curly_rdive_code {  name_without_curly_rdive_read: name_without_curly_rdive_code {
         $$=N();           $$=N(); 
         ArrayOperationPtr diving_code=$1;          ArrayOperationPtr diving_code=$1;
         ConstStringPtr first_name=LA2S(*diving_code);          StringPtr first_name=LA2S(*diving_code);
         // self.xxx... -> xxx...          // self.xxx... -> xxx...
         // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...          // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...
         if(first_name && *first_name==SELF_ELEMENT_NAME) {          if(first_name && *first_name==SELF_ELEMENT_NAME) {
Line 294  name_expr_wdive: Line 301  name_expr_wdive:
 name_expr_wdive_root: name_expr_dive_code {  name_expr_wdive_root: name_expr_dive_code {
         $$=N();          $$=N();
         ArrayOperationPtr diving_code=$1;          ArrayOperationPtr diving_code=$1;
         ConstStringPtr first_name=LA2S(*diving_code);          StringPtr first_name=LA2S(*diving_code);
         // $self.xxx... -> $xxx...          // $self.xxx... -> $xxx...
         // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...          // OP_VALUE+string+OP_GET_ELEMENT+... -> OP_WITH_SELF+...
         if(first_name && *first_name==SELF_ELEMENT_NAME) {          if(first_name && *first_name==SELF_ELEMENT_NAME) {
Line 492  class_prefix: Line 499  class_prefix:
 class_static_prefix: STRING ':' {  class_static_prefix: STRING ':' {
         $$=$1; // stack: class name string          $$=$1; // stack: class name string
         if(*LA2S(*$$) == BASE_NAME) { // pseude BASE class          if(*LA2S(*$$) == BASE_NAME) { // pseude BASE class
                 if(VStateless_classPtr base=PC.cclass->base_class()) {                  if(VStateless_class* base=PC.cclass->base_class()) {
                         change_string_literal_value(*$$, base->name());                          change_string_literal_value(*$$, base->name());
                 } else {                  } else {
                         strcpy(PC.error, "no base class declared");                          strcpy(PC.error, "no base class declared");
Line 1314  static int real_yyerror(parse_control *p Line 1321  static int real_yyerror(parse_control *p
   
 static void yyprint(FILE *file, int type, YYSTYPE value) {  static void yyprint(FILE *file, int type, YYSTYPE value) {
         if(type==STRING)          if(type==STRING)
                 fprintf(file, " \"%s\"", LA2S(*value)->cstr());                  fprintf(file, " \"%s\"", LA2S(*value)->cstr().get());
 }  }

Removed from v.1.204.2.2  
changed lines
  Added in v.1.204.2.6


E-mail: