Annotation of parser3/src/main/compile.C, revision 1.39
1.32 paf 1: /** @file
1.33 paf 2: Parser: compiler part of request class.
3:
1.24 paf 4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.33 paf 5:
1.25 paf 6: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.24 paf 7:
1.39 ! parser 8: $Id: compile.C,v 1.38 2001/05/28 06:10:06 parser Exp $
1.1 paf 9: */
1.39 ! parser 10: static char *RCSId="$Id$";
1.1 paf 11:
1.36 paf 12: #include "pa_opcode.h"
1.10 paf 13: #include "pa_request.h"
1.3 paf 14: #include "pa_string.h"
1.1 paf 15: #include "pa_array.h"
16: #include "compile_tools.h"
1.4 paf 17: #include "pa_exception.h"
1.1 paf 18:
19: #include <stdio.h>
20:
21: extern int yydebug;
22: extern int yyparse (void *);
23:
1.29 paf 24: VStateless_class& Request::real_compile(COMPILE_PARAMS) {
1.7 paf 25: // prepare to parse
1.1 paf 26: struct parse_control pc;
1.10 paf 27:
1.7 paf 28: // input
1.10 paf 29: pc.pool=&pool();
1.18 paf 30: pc.request=this;
1.29 paf 31: VStateless_class *cclass;
1.27 paf 32: if(aclass) // we were told the class to compile to?
1.28 paf 33: cclass=aclass; // yes, remember it [used in ^process]
1.27 paf 34: else if(name) { // we were told the name of compiled class?
1.20 paf 35: // yes. create it
1.27 paf 36: cclass=NEW VClass(pool());
1.20 paf 37: // defaulting base. may change with @BASE
1.37 parser 38: // dont use ?: for there would be getting & of temp object
1.34 paf 39: if(base_class)
40: cclass->set_base(*base_class);
1.27 paf 41: classes().put(*name, cclass);
42: cclass->set_name(*name);
1.20 paf 43: } else
1.35 paf 44: cclass=&OP; // until changed with @CLASS would consider operators loading
1.27 paf 45: pc.cclass=cclass;
1.9 paf 46:
1.1 paf 47: pc.source=source;
48: #ifndef NO_STRING_ORIGIN
49: pc.file=file;
1.7 paf 50: pc.line=pc.col=0;
1.1 paf 51: #endif
1.7 paf 52: // initialise state
1.1 paf 53: pc.pending_state=0;
1.13 paf 54: pc.string=NEW String(pool());
1.1 paf 55: pc.ls=LS_USER;
56: pc.sp=0;
1.7 paf 57:
1.12 paf 58: // parse=compile!
1.26 paf 59: // yydebug=1;
1.10 paf 60: if(yyparse(&pc)) { // error?
1.15 paf 61: if(pc.col==0) { // expecting something after EOL means they've expected it BEFORE
62: // step back. -1 col means EOL
1.8 paf 63: pc.line--;
1.16 paf 64: pc.col=-1;
65: }
1.13 paf 66: THROW(0,0,
1.6 paf 67: 0,
1.17 paf 68: "%s(%d:%d): %s", file, 1+pc.line, pc.col, pc.error);
1.8 paf 69: }
1.7 paf 70:
71: // result
1.27 paf 72: return *pc.cclass;
1.1 paf 73: }
E-mail: