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