Annotation of parser3/src/main/core.C, revision 1.47
1.18 paf 1: /*
1.47 ! paf 2: $Id: core.C,v 1.46 2001/03/09 04:47:29 paf Exp $
1.18 paf 3: */
4:
1.23 paf 5: #include "pa_request.h"
1.29 paf 6: #include "pa_wwrapper.h"
1.23 paf 7: #include "pa_common.h"
8: #include "pa_vclass.h"
9:
10: #include <stdio.h>
1.46 paf 11: #include "classes/_string.h"
1.47 ! paf 12: #include "classes/_double.h"
! 13: #include "classes/_int.h"
1.23 paf 14:
15: void core() {
1.25 paf 16: Pool pool;
1.46 paf 17: initialize_string_class(pool);
1.47 ! paf 18: initialize_double_class(pool);
! 19: initialize_int_class(pool);
1.24 paf 20: Request request(pool);
21: request.core();
1.23 paf 22: }
23:
1.43 paf 24: Request::Request(Pool& apool) : Pooled(apool),
25: stack(apool),
1.45 paf 26: root_class(apool),
1.43 paf 27: fclasses(apool),
28: fclasses_array(apool)
29: {
1.44 paf 30: // construct_root_class
31: void construct_root_class(Request& request); // classes/root
32: construct_root_class(*this);
33:
34: // TODO: construct other classes,
35: // для встроенных какая-то табличка
36: // для внешних - конфиг с @CLASSES файлы с классами/ворохами операторов
37:
1.43 paf 38: // adding root superclass,
39: // parent of all classes,
40: // operators holder
41: String ROOT(pool()); ROOT.APPEND_CONST(ROOT_NAME);
1.45 paf 42: classes().put(ROOT, &root_class);
1.43 paf 43: }
44:
1.23 paf 45: void Request::core() {
1.24 paf 46: TRY {
1.35 paf 47: char *file="Y:\\parser3\\src\\test.p";
1.43 paf 48: String RUN(pool()); RUN.APPEND_CONST(RUN_NAME);
1.35 paf 49: use(file, &RUN);
50:
51: char *result=execute_MAIN();
1.34 paf 52: printf("result-----------------\n%sEOF----------------\n", result);
1.24 paf 53: }
54: CATCH(e) {
1.31 paf 55: printf("\nERROR: ");
56: const String *problem_source=e.problem_source();
57: if(problem_source) {
58: const Origin& origin=problem_source->origin();
59: if(origin.file)
60: printf("%s(%d): ",
61: origin.file, 1+origin.line);
1.32 paf 62: printf("'%s' ",
1.31 paf 63: problem_source->cstr());
64: }
65: printf("%s", e.comment());
1.23 paf 66: const String *type=e.type();
67: if(type) {
68: printf(" type: %s", type->cstr());
69: const String *code=e.code();
70: if(code)
71: printf(", code: %s", code->cstr());
72: }
1.31 paf 73: printf("\n");
1.23 paf 74: }
1.24 paf 75: END_CATCH
1.23 paf 76: }
77:
1.43 paf 78: void Request::use(char *file, String *name) {
1.42 paf 79: // TODO: обнаружить|решить cyclic dependences
1.23 paf 80: char *source=file_read(pool(), file);
1.37 paf 81: if(!source)
82: THROW(0,0,
83: 0,
84: "use: can not read '%s' file", file);
85:
1.43 paf 86: COMPILE(source, name, file);
87: // TODO: запустить @STATIC[], если есть
88:
89: // if(alias)
90: //classes().put(*alias, &vclass);
1.23 paf 91: }
92:
1.35 paf 93: char *Request::execute_MAIN() {
94: // locate class with @main & it's code
1.23 paf 95: String name_main(pool());
96: name_main.APPEND_CONST(MAIN_METHOD_NAME);
97:
1.35 paf 98: // looking for latest known @main
99: for(int i=classes_array().size(); --i>=0;) {
100: VClass *vclass=static_cast<VClass *>(classes_array().get(i));
101: Value *main=vclass->get_element(name_main);
102: if(main) { // found some 'main' element
103: Junction *junction=main->get_junction();
1.36 paf 104: if(junction) {// it even has junction!
105: const Method *method=junction->method;
106: if(method) { // and junction is method-junction! call it
107: // initialize contexts
1.41 paf 108: root=rcontext=self=vclass;
1.40 paf 109: wcontext=NEW WWrapper(pool(), vclass, false /* not constructing */);
1.36 paf 110:
111: // execute!
1.44 paf 112: execute(*method->parser_code);
1.36 paf 113:
114: // return chars
115: return wcontext->get_string()->cstr();
116: }
1.35 paf 117: }
118: }
119: }
120:
121: THROW(0,0,
122: 0,
123: "'"MAIN_METHOD_NAME"' method not found");
124: return 0;
1.23 paf 125: }
E-mail: