|
|
| 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()); |
| } | } |