|
|
1.1 root 1: /* utilities used by the grammar. We never change them, so why
2: compile them constantly ? */
3:
4: #include "cfront.h"
5:
6: /* macros filtched from gram.skeleton */
7:
8: #define yylex lalex
9: extern TOK la_look();
10: extern void la_backup( TOK, YYSTYPE );
11: extern int la_cast();
12: extern int la_decl();
13: extern TOK lalex();
14: extern int yychar, must_be_id, DECL_TYPE, declTag;
15: FILE * yydebugfile;
16:
17: char * gram_print_node (int tok, YYSTYPE* val)
18: {
19: static char buffer[1000];
20:
21: switch(tok) {
22: case ID:
23: case TNAME:
24: Pname n = val->pn;
25: return n->string;
26: case STRING:
27: return val->s;
28: default:
29: sprintf(buffer, "0x%x", val->p);
30: return buffer;
31: }
32: }
33:
34: #define NEXTTOK() ( (yychar==-1) ? (yychar=yylex(),yychar) : yychar )
35: #define EXPECT_ID() must_be_id = 1
36: #define NOT_EXPECT_ID() must_be_id = 0
37:
38: Pptr doptr(TOK p, TOK t)
39: {
40: Pptr r = new ptr(p,0);
41: switch (t) {
42: case CONST:
43: r->rdo = 1;
44: // if (p == RPTR) error('w',"redundant `const' after &");
45: break;
46: case VOLATILE:
47: error('w',"\"volatile\" not implemented (ignored)");
48: break;
49: default:
50: error("syntax error: *%k",t);
51: }
52: return r;
53: }
54:
55: Pbcl dobase(TOK pr, Pname n, TOK v = 0)
56: {
57: Pbcl b = new basecl(0,0);
58:
59: if (pr == PROTECTED) {
60: pr = PUBLIC;
61: error("protectedBC");
62: }
63: b->ppp = pr; // save protection indicator
64:
65: if (n) {
66: if (n->base != TNAME) {
67: error("BN%n not aTN",n);
68: return 0;
69: }
70:
71: Pbase bt = Pbase(n->tp);
72: while (bt->base == TYPE) bt = Pbase(bt->b_name->tp);
73:
74: if (bt->base != COBJ) {
75: error("BN%n not aCN",n);
76: return 0;
77: }
78:
79: if (v) {
80: if (v != VIRTUAL) error("syntax error:%k inBCD",v);
81: b->base = VIRTUAL;
82: }
83: else
84: b->base = NAME;
85:
86: b->bclass = Pclass(bt->b_name->tp);
87: }
88:
89: return b;
90: }
91:
92: extern int yyparse ();
93: extern YYSTYPE yylval, yyval;
94:
95: Pname syn()
96: {
97: ll:
98: switch (yyparse()) {
99: case 0: return 0; // EOF
100: case 1: goto ll; // no action needed
101: default: return yyval.pn;
102: }
103: }
104:
105: void
106: check_cast()
107: /*
108: Lookahead to direct parsing of cast
109: la_cast() returns 1 if lookahead sees an ambiguous old-style C cast.
110: */
111: {
112: switch( NEXTTOK() ) {
113: case TYPE: case TNAME:
114: if ( la_look() == LP && la_cast() ) {
115: must_be_id = 0;
116: yychar = DECL_MARKER;
117: }
118: }
119: }
120:
121: void
122: check_decl()
123: /*
124: Lookahead to direct parsing of local/arg type declarations
125: la_decl() returns 1 if lookahead sees a declaration.
126: */
127: {
128:
129: switch( NEXTTOK() ) {
130: case TYPE: case TNAME:
131: if ( la_look() == LP && la_decl() ) {
132: must_be_id = 0;
133: DECL_TYPE=yychar;
134: yychar = DECL_MARKER;
135: }
136: }
137: }
138:
139: void
140: check_tag()
141: /*
142: Allow the case of inline/virtual/overload as
143: modifiers of return type of form struct/class/union x foo()
144: SM, COLON, LC ==> real class declaration, not return type
145: */
146: {
147: switch ( NEXTTOK() ) {
148: case SM: case COLON: case LC:
149: declTag = 1;
150: break;
151: default:
152: declTag = 0;
153: break;
154: }
155: }
156:
157: Pname find_fct_dcl (Pname fname)
158: {
159: Pname function_name;
160:
161: if(!(fname && fname->base == NAME && fname->tp && fname->tp->base == FCT))
162: return 0;
163: /* In an ideal world, we would defer this to something in semantics.
164: oh well, here we go. */
165:
166: if (fname->n_qualifier) {
167: Pname cn = fname->n_qualifier;
168:
169: switch (cn->base) {
170: case TNAME:
171: break;
172: case NAME:
173: cn = gtbl->look(cn->string,0);
174: if (cn && cn->base==TNAME) break;
175: default:
176: error("badQr%n for%n",fname->n_qualifier,fname);
177: return 0;
178: }
179:
180: if (cn->tp->base != COBJ) {
181: return 0;
182: }
183:
184: cn = Pbase(cn->tp)->b_name;
185:
186: Pclass cl = Pclass(cn->tp);
187:
188: if ((cl->defined&(DEFINED|SIMPLIFIED)) == 0) {
189: error("C%nU",cn);
190: return 0;
191: }
192:
193: Ptable etbl = cl->memtbl;
194: Pname x = etbl->look(fname->string,0);
195: if (x==0 || x->n_table!=etbl) {
196: error("%n is not aM of%n",fname,cn);
197: return 0;
198: }
199:
200: if(x->base != NAME || x->tp == 0) {
201: return 0;
202: }
203:
204: function_name = x;
205: } else {
206: function_name = gtbl->look (fname->string, 0);
207: if(!function_name) {
208: err::print ("No function %s.", err::name_string (fname));
209: return 0;
210: }
211: }
212:
213: switch(function_name->tp->base) {
214: case FCT:
215: break;
216: case OVERLOAD:
217: function_name = Pgen(function_name->tp)->find(Pfct(fname->tp),0);
218: if(!function_name) {
219: err::print ("Pragma specifies undefined function.");
220: return 0;
221: }
222: }
223:
224: return function_name;
225: }
226:
227:
228: void mark_abnormal_query_function (Pname fname)
229: {
230: Pname function_name = find_fct_dcl(fname);
231: if(!function_name) {
232: err::print("#pragma ObjectStore query_abnormal_operator must be followed by a function declaration.");
233: }
234: else Pfct(function_name->tp)->f_query_abnormal = 1;
235: }
236:
237: void declare_query_zvec_compare_function (Pname fn)
238: {
239: Pname function_name = find_fct_dcl(fn);
240: int found = 0;
241: if(!function_name)
242: err::print("#pragma ObjectStore query_zvec_compare_function must be followed by a function declaration.");
243: else Pfct(function_name->tp)->f_query_compare = 1;
244: }
245:
246: void declare_query_zvec_copy_function (Pname fn)
247: {
248: Pname function_name = find_fct_dcl(fn);
249: int found = 0;
250: if(!function_name)
251: err::print("#pragma ObjectStore query_zvec_copy_function must be followed by a function declaration.");
252: else Pfct(function_name->tp)->f_query_copy = 1;
253: }
254:
255: void register_zvec_type (Ptype t);
256:
257: void declare_query_zvec_type (Pname tn)
258: {
259: register_zvec_type (tn->tp);
260: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.