--- parser3/src/main/compile.y 2001/03/10 15:17:46 1.84 +++ parser3/src/main/compile.y 2001/03/11 07:52:42 1.88 @@ -1,5 +1,20 @@ /* - $Id: compile.y,v 1.84 2001/03/10 15:17:46 paf Exp $ + Parser + Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexander Petrosyan + + $Id: compile.y,v 1.88 2001/03/11 07:52:42 paf Exp $ +*/ + +/* + TODO.parser4: + cache compiled code from request to request. to do that... + 1: make method definitions, @CLASS, @BASE, @USE instructions, + which would be executed afterwards, and actions + now performed at compile time would be delayed to run time. + 2: make cache expiration on time and on disk-change of class source + 3: in apache use subpools for compiled class storage + 4: in iis make up specialized Pool object for that */ %{ @@ -20,9 +35,10 @@ #include "pa_request.h" #include "pa_vobject.h" #include "pa_vdouble.h" +#include "core.h" -#define SELF_NAME "self" -#define USE_NAME "USE" +#define SELF_ELEMENT_NAME "self" +#define USE_CONTROL_METHOD_NAME "USE" int real_yyerror(parse_control *pc, char *s); static void yyprint(FILE *file, int type, YYSTYPE value); @@ -85,17 +101,14 @@ int yylex(YYSTYPE *lvalp, void *pc); %left NEG /* negation: unary - */ %% - -all: /* TODO: у ^execute непременно задать какой-то name, см. 'RUN' */ +all: one_big_piece { - String& MAIN=*NEW String(POOL); - MAIN.APPEND_CONST(MAIN_METHOD_NAME); Method& method=*NEW Method(POOL, - MAIN, + *main_method_name, 0, 0, /*min, max numbered_params_count*/ 0/*param_names*/, 0/*local_names*/, $1/*parser_code*/, 0/*native_code*/); - PC->vclass->add_method(MAIN, method); + PC->vclass->add_method(*main_method_name, method); } | methods; @@ -137,15 +150,17 @@ control_method: '@' STRING '\n' YYERROR; } } else { - if(command==USE_NAME) { + if(command==USE_CONTROL_METHOD_NAME) { for(int i=0; isize(); i+=2) { String file(*SLA2S(strings_code, i)); file.APPEND_CONST(".p"); - PC->request->use(file.cstr(), 0); + PC->request->use(file.cstr()); } } 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); + strcpy(PC->error, "class already have a base '"); + strncat(PC->error, PC->vclass->base()->name().cstr(), 100); + strcat(PC->error, "'"); YYERROR; } if(strings_code->size()==1*2) { @@ -166,7 +181,7 @@ control_method: '@' STRING '\n' } else { strcpy(PC->error, command.cstr()); strcat(PC->error, ": invalid special name. valid names are " - CLASS_NAME", "USE_NAME" and "BASE_NAME); + CLASS_NAME", "USE_CONTROL_METHOD_NAME" and "BASE_NAME); YYERROR; } } @@ -238,7 +253,7 @@ name_without_curly_rdive_read: name_with $$=N(POOL); Array *diving_code=$1; const String *first_name=SLA2S(diving_code); - if(first_name && *first_name==SELF_NAME) { + if(first_name && *first_name==SELF_ELEMENT_NAME) { O($$, OP_WITH_SELF); /* stack: starting context */ P($$, diving_code, /* skip over... */ @@ -271,7 +286,7 @@ name_expr_wdive_write: name_expr_dive_co $$=N(POOL); Array *diving_code=$1; const String *first_name=SLA2S(diving_code); - if(first_name && *first_name==SELF_NAME) { + if(first_name && *first_name==SELF_ELEMENT_NAME) { O($$, OP_WITH_SELF); /* stack: starting context */ P($$, diving_code, /* skip over... */