--- parser3/src/main/Attic/core.C 2001/03/08 17:59:29 1.45.4.1 +++ parser3/src/main/Attic/core.C 2001/03/12 13:13:21 1.61 @@ -1,121 +1,79 @@ /* -$Id: core.C,v 1.45.4.1 2001/03/08 17:59:29 paf Exp $ + Parser + Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) + Author: Alexander Petrosyan (http://design.ru/paf) + + $Id: core.C,v 1.61 2001/03/12 13:13:21 paf Exp $ */ +#include "core.h" +#include "_string.h" +#include "_double.h" +#include "_int.h" +#include "_table.h" #include "pa_request.h" -#include "pa_wwrapper.h" -#include "pa_common.h" -#include "pa_vclass.h" -#include -#include "classes/_string.h" +#define GLOBAL_STRING(name, value) name=new(pool) String(pool); name->APPEND_CONST(value) +#define LOCAL_STRING(name, value) String name(pool); name.APPEND_CONST(value) -void core() { - Pool pool; - initialize_string_class(pool); - Request request(pool); - request.core(); -} +String *unnamed_name; +String *empty_string; -Request::Request(Pool& apool) : Pooled(apool), - stack(apool), - root_class(apool), - fclasses(apool), - fclasses_array(apool) -{ - // construct_root_class - void construct_root_class(Request& request); // classes/root - construct_root_class(*this); - - // TODO: construct other classes, - // для встроенных какая-то табличка - // для внешних - конфиг с @CLASSES файлы с классами/ворохами операторов - - // adding root superclass, - // parent of all classes, - // operators holder - String ROOT(pool()); ROOT.APPEND_CONST(ROOT_NAME); - classes().put(ROOT, &root_class); -} +String *auto_method_name; +String *main_method_name; -void Request::core() { - TRY { - char *file="Y:\\parser3\\src\\test.p"; - String RUN(pool()); RUN.APPEND_CONST(RUN_NAME); - use(file, &RUN); - - char *result=execute_MAIN(); - printf("result-----------------\n%sEOF----------------\n", result); - } - CATCH(e) { - printf("\nERROR: "); - const String *problem_source=e.problem_source(); - if(problem_source) { - const Origin& origin=problem_source->origin(); - if(origin.file) - printf("%s(%d): ", - origin.file, 1+origin.line); - printf("'%s' ", - problem_source->cstr()); - } - printf("%s", e.comment()); - const String *type=e.type(); - if(type) { - printf(" type: %s", type->cstr()); - const String *code=e.code(); - if(code) - printf(", code: %s", code->cstr()); - } - printf("\n"); - } - END_CATCH -} +String *main_class_name; +String *root_class_name; +String *env_class_name; +String *table_class_name; -void Request::use(char *file, String *name) { - // TODO: обнаружить|решить cyclic dependences - char *source=file_read(pool(), file); - if(!source) - THROW(0,0, - 0, - "use: can not read '%s' file", file); +Hash *untaint_lang_name2enum; - COMPILE(source, name, file); - // TODO: запустить @STATIC[], если есть -// if(alias) - //classes().put(*alias, &vclass); -} +void core() { + Pool pool; + + // names + GLOBAL_STRING(unnamed_name, "unnamed"); + empty_string=new(pool) String(pool); -char *Request::execute_MAIN() { - // locate class with @main & it's code - String name_main(pool()); - name_main.APPEND_CONST(MAIN_METHOD_NAME); - - // looking for latest known @main - for(int i=classes_array().size(); --i>=0;) { - VClass *vclass=static_cast(classes_array().get(i)); - Value *main=vclass->get_element(name_main); - if(main) { // found some 'main' element - Junction *junction=main->get_junction(); - if(junction) {// it even has junction! - const Method *method=junction->method; - if(method) { // and junction is method-junction! call it - // initialize contexts - root=rcontext=self=vclass; - wcontext=NEW WWrapper(pool(), vclass, false /* not constructing */); - - // execute! - execute(*method->parser_code); - - // return chars - return wcontext->get_string()->cstr(); - } - } - } - } + GLOBAL_STRING(auto_method_name, AUTO_METHOD_NAME); + GLOBAL_STRING(main_method_name, MAIN_METHOD_NAME); - THROW(0,0, - 0, - "'"MAIN_METHOD_NAME"' method not found"); - return 0; + GLOBAL_STRING(main_class_name, MAIN_CLASS_NAME); + GLOBAL_STRING(root_class_name, ROOT_CLASS_NAME); + GLOBAL_STRING(env_class_name, ENV_CLASS_NAME); + GLOBAL_STRING(table_class_name, TABLE_CLASS_NAME); + + // hashes + untaint_lang_name2enum=new(pool) Hash(pool); + LOCAL_STRING(as_is, "as-is"); + untaint_lang_name2enum->put(as_is, + static_cast(String::Untaint_lang::AS_IS)); + LOCAL_STRING(table, "table"); + untaint_lang_name2enum->put(table, + static_cast(String::Untaint_lang::TABLE)); + LOCAL_STRING(sql, "sql"); + untaint_lang_name2enum->put(sql, + static_cast(String::Untaint_lang::SQL)); + LOCAL_STRING(js, "js"); + untaint_lang_name2enum->put(js, + static_cast(String::Untaint_lang::JS)); + LOCAL_STRING(html, "html"); + untaint_lang_name2enum->put(html, + static_cast(String::Untaint_lang::HTML)); + LOCAL_STRING(html_typo, "html-typo"); + untaint_lang_name2enum->put(html_typo, + static_cast(String::Untaint_lang::HTML_TYPO)); + + // read-only classes + initialize_string_class(pool, *(string_class=new(pool) VClass(pool))); string_class->freeze(); + initialize_double_class(pool, *(double_class=new(pool) VClass(pool))); double_class->freeze(); + initialize_int_class(pool, *(int_class=new(pool) VClass(pool))); int_class->freeze(); + initialize_table_class(pool, *(table_class=new(pool) VClass(pool))); table_class->freeze(); + + // request + Request request(pool); + request.core(); } +