--- parser3/src/main/compile.y 2001/03/08 11:27:49 1.73 +++ parser3/src/main/compile.y 2001/03/08 17:14:53 1.79 @@ -1,5 +1,5 @@ /* - $Id: compile.y,v 1.73 2001/03/08 11:27:49 paf Exp $ + $Id: compile.y,v 1.79 2001/03/08 17:14:53 paf Exp $ */ %{ @@ -86,14 +86,16 @@ int yylex(YYSTYPE *lvalp, void *pc); %% -all: +all: /* TODO: у ^execute непременно задать какой-то name, см. 'RUN' */ one_big_piece { - String& name_main=*NEW String(POOL); - name_main.APPEND_CONST(MAIN_METHOD_NAME); - Array& param_names=*NEW Array(POOL); - Array& local_names=*NEW Array(POOL); - Method& method=*NEW Method(POOL, name_main, param_names, local_names, *$1); - PC->vclass->add_method(name_main, method); + String& MAIN=*NEW String(POOL); + MAIN.APPEND_CONST(MAIN_METHOD_NAME); + Method& method=*NEW Method(POOL, + MAIN, + 0, /*numbered_params_count*/ + 0/*param_names*/, 0/*local_names*/, + $1/*parser_code*/, 0/*native_code*/); + PC->vclass->add_method(MAIN, method); } | methods; @@ -104,16 +106,16 @@ method: control_method | code_method; control_method: '@' STRING '\n' control_strings { - String& name=*SLA2S($2); + String& command=*SLA2S($2); YYSTYPE strings_code=$4; if(strings_code->size()<1*2) { strcpy(PC->error, "@"); - strcat(PC->error, name.cstr()); + strcat(PC->error, command.cstr()); strcat(PC->error, " is empty"); YYERROR; } - if(name==CLASS_NAME) { - if(PC->vclass!=&PC->request->ROOT_CLASS) { // already changed from default? + if(command==CLASS_NAME) { + if(PC->vclass!=&PC->request->root_class) { // already changed from default? strcpy(PC->error, "class already have a name '"); strncat(PC->error, PC->vclass->name().cstr(), 100); strcat(PC->error, "'"); @@ -126,7 +128,7 @@ control_method: '@' STRING '\n' PC->vclass=NEW VClass(POOL); PC->vclass->set_name(*name); // defaulting base. may change with @BASE - PC->vclass->set_base(PC->request->ROOT_CLASS); + PC->vclass->set_base(PC->request->root_class); // append to request's classes PC->request->classes_array()+=PC->vclass; PC->request->classes().put(*name, PC->vclass); @@ -135,14 +137,14 @@ control_method: '@' STRING '\n' YYERROR; } } else { - if(name==USE_NAME) { + if(command==USE_NAME) { for(int i=0; isize(); i+=2) { String *file=SLA2S(strings_code, i); file->APPEND_CONST(".p"); PC->request->use(file->cstr(), 0); } - } else if(name==BASE_NAME) { - if(PC->vclass->base()!=&PC->request->ROOT_CLASS) { // already changed from default? + } else if(command==BASE_NAME) { + if(PC->vclass->base()!=&PC->request->root_class) { // already changed from default? strcpy(PC->error, "there must be only one @"BASE_NAME); YYERROR; } @@ -162,7 +164,7 @@ control_method: '@' STRING '\n' YYERROR; } } else { - strcpy(PC->error, name.cstr()); + strcpy(PC->error, command.cstr()); strcat(PC->error, ": invalid special name. valid names are " CLASS_NAME", "USE_NAME" and "BASE_NAME); YYERROR; @@ -178,16 +180,26 @@ code_method: '@' STRING bracketed_maybe_ const String *name=SLA2S($2); YYSTYPE params_names_code=$3; - Array& params_names=*NEW Array(POOL); - for(int i=0; isize(); i+=2) - params_names+=SLA2S(params_names_code, i); + Array *params_names=0; + if(int size=params_names_code->size()) { + params_names=NEW Array(POOL); + for(int i=0; isize(); i+=2) - locals_names+=SLA2S(locals_names_code, i); + Array *locals_names=0; + if(int size=locals_names_code->size()) { + locals_names=NEW Array(POOL); + for(int i=0; ivclass->add_method(*name, method); }; @@ -332,13 +344,14 @@ store_expr_param_parts: | store_expr_param_parts ';' store_expr_param_part { $$=$1; P($$, $3) } ; store_code_param_part: - empty /* optimized () case */ -| STRING { /* optimized (STRING) case */ + empty /* optimized [] case */ +| STRING { /* optimized [STRING] case */ $$=$1; O($$, OP_STORE_PARAM); } -| constructor_code_value { /* (something complex) */ +| constructor_code_value { /* [something complex] */ $$=$1; + O($$, OP_STORE_PARAM); } ; store_expr_param_part: write_expr_value { @@ -482,7 +495,7 @@ write_str_literal: STRING { O($$, OP_WRITE); }; -empty_double_value: /* empty */ { $$=VL(NEW VDouble(POOL)) }; +empty_double_value: /* empty */ { $$=VL(NEW VDouble(POOL, 0)) }; empty_string_value: /* empty */ { $$=VL(NEW VString(POOL)) }; empty: /* empty */ { $$=N(POOL) };