Annotation of parser3/src/main/compile_tools.C, revision 1.19
1.1 paf 1: /*
1.19 ! paf 2: $Id: compile_tools.C,v 1.18 2001/03/08 09:31:47 paf Exp $
1.1 paf 3: */
4:
5: #include "compile_tools.h"
6: #include "pa_string.h"
7: #include "pa_array.h"
8: #include "pa_exception.h"
1.9 paf 9: #include "pa_vstring.h"
1.15 paf 10: #include "pa_vdouble.h"
1.1 paf 11:
1.17 paf 12: void PV(Array/*<op>*/ *result, Value *value) {
1.16 paf 13: // append OP_VALUE
14: Operation op; op.code=OP_VALUE;
1.6 paf 15: *result+=op.cast;
1.1 paf 16:
1.17 paf 17: // append 'value'
18: *result+=value;
1.12 paf 19: }
1.13 paf 20:
21: void PCA(Array/*<op>*/ *result, Array/*<op>*/ *code_array) {
22: // append OP_CODE
1.18 paf 23: Operation op; op.code=OP_CODE__STORE_PARAM;
1.13 paf 24: *result+=op.cast;
25:
26: // append 'vstring'
27: *result+=code_array;
28: }
29:
1.12 paf 30:
1.17 paf 31: Array *VL(Value *value) {
1.12 paf 32: // empty ops array
1.17 paf 33: Array *result=N(value->pool());
1.12 paf 34:
1.17 paf 35: // append 'value' to 'result'
36: PV(result, value);
1.14 paf 37:
38: return result;
39: }
1.1 paf 40:
1.14 paf 41: String *SLA2S(Array *literal_string_array, int offset) {
1.11 paf 42: Operation op;
43: op.cast=literal_string_array->get(offset+0);
1.16 paf 44: if(op.code!=OP_VALUE)
1.11 paf 45: return 0;
46:
1.10 paf 47: return static_cast<VString *>(literal_string_array->get(offset+1))->get_string();
1.15 paf 48: }
49:
50: void change_string_literal_to_double_literal(Array *literal_string_array) {
51: VString *vstring=static_cast<VString *>(literal_string_array->get(1));
52: Pool& pool=vstring->pool();
53: VDouble *vdouble=new(pool) VDouble(pool, vstring->get_double());
54: literal_string_array->put(1, vdouble);
1.1 paf 55: }
56:
57:
1.5 paf 58: void push_LS(struct parse_control *pc, lexical_state new_state) {
1.1 paf 59: if(pc->sp<MAX_LEXICAL_STATES) {
1.5 paf 60: pc->stack[pc->sp++]=pc->ls; pc->ls=new_state;
1.1 paf 61: } else
1.7 paf 62: pc->pool->THROW(0, 0, 0, "push_LS: stack overflow");
1.1 paf 63: }
64: void pop_LS(struct parse_control *pc) {
65: if(--pc->sp>=0)
66: pc->ls=pc->stack[pc->sp];
67: else
1.7 paf 68: pc->pool->THROW(0, 0, 0, "push_LS: stack underflow");
1.1 paf 69: }
E-mail: