|
|
1.1 root 1: static char lex_c_Sccsid[] = "lex.c @(#)lex.c 1.3 10/5/82 Berkeley ";
2: #define lv yylval
3: #define v yyval
4:
5: int xxpeek[2] = {0,0};
6:
7: yylex()
8: {
9: register c, rval;
10: register struct tab *tp;
11:
12: if(nlexsym != -1) { /* first token is lexical context */
13: c = nlexsym;
14: nlexsym = -1;
15: return(c);
16: }
17: while(litflag > 0) { /* comment */
18: c = *iline++;
19: if(c == '\n') {
20: nlexsym = 0;
21: return(eol);
22: }
23: }
24: if(xxpeek[0] != 0){
25: lv.charval = xxpeek[0]; /* may want charptr here */
26: xxpeek[0] = 0;
27: return(xxpeek[1]);
28: }
29: do
30: c = *iline++;
31: while(c == ' ');
32: if(c == '\n') {
33: nlexsym = 0;
34: return(eol);
35: }
36: if(alpha(c))
37: return(getnam(c));
38: if(digit(c) || c == '`' || /* '`' was '"' */
39: (c=='.' && digit(*iline)))
40: return(getnum(c));
41: c &= 0377;
42: rval = unk;
43: for(tp = tab; tp->input; tp++)
44: if(tp->input == c) {
45: lv.charval = tp->lexval;
46: rval = tp->retval;
47: break;
48: }
49: if(lv.charval == QUAD)
50: return(getquad());
51: if(lv.charval == ISP){
52: lv.charval = ISP2;
53: xxpeek[0] = ISP1;
54: xxpeek[1] = m;
55: return(d);
56: }
57: if(lv.charval == PSI){
58: lv.charval = PSI2;
59: xxpeek[0] = PSI1;
60: xxpeek[1] = m;
61: return(d);
62: }
63: return(rval);
64: }
65:
66: getquad()
67: {
68: register char c, *p1;
69: register struct qtab *p2;
70: char qbuf[10];
71:
72: p1 = qbuf;
73: while(alpha(*iline))
74: if (p1 < qbuf + sizeof qbuf)
75: *p1++ = *iline++;
76: else
77: iline++;
78: *p1++ = 0;
79: if(*qbuf == 0)
80: return(Quad); /* ordinary quad */
81: for(p2 = qtab; p2->qname; p2++){
82: if(equal(p2->qname, qbuf)){
83: lv.charval = p2->qtype;
84: return(p2->rtype);
85: }
86: }
87: return(unk);
88: }
89:
90: getnam(ic)
91: {
92: char name[NAMS];
93: register c;
94: register char *cp;
95: register struct nlist *np;
96:
97: c = ic;
98: cp = name;
99: do {
100: if(cp >= &name[NAMS])
101: error("var name D");
102: *cp++ = c;
103: c = *iline++;
104: } while(alpha(c) || digit(c));
105: *cp++ = 0;
106: iline--;
107: if(litflag == -1) { /* commands */
108: litflag = -2;
109: for(c=0; comtab[c].ct_name; c++)
110: if(equal(name, comtab[c].ct_name))
111: break;
112: immedcmd = lv.charval = comtab[c].ct_ylval;
113: return(comtab[c].ct_ytype);
114: }
115: for(np=nlist; np->namep; np++)
116: if(equal(np->namep, name)) {
117: lv.charptr = (char *)np;
118: switch(np->use) {
119:
120: case NF:
121: if (context == lex2) sichk(np);
122: return(nfun);
123:
124: case MF:
125: if (context == lex2) sichk(np);
126: return(mfun);
127:
128: case DF:
129: if (context == lex2) sichk(np);
130: return(dfun);
131: }
132: return(nam);
133: }
134: np->namep = alloc(cp-name);
135: copy(CH, name, np->namep, cp-name);
136: np->type = LV;
137: lv.charptr = (char *)np;
138: return(nam);
139: }
140:
141: getnum(ic)
142: {
143: double d1, d2;
144: register c, n, n1;
145: int s, s1;
146:
147: s = 0;
148: n = 0;
149: d1 = 0.;
150: c = ic;
151: if(c == '`') { /* '`' was '"' */
152: s++;
153: c = *iline++;
154: }
155: while(digit(c)) {
156: d1 = d1*10. + c - '0';
157: c = *iline++;
158: }
159: if(c == '.') {
160: c = *iline++;
161: while(digit(c)) {
162: d1 = d1*10. + c - '0';
163: c = *iline++;
164: n--;
165: }
166: }
167: if(c == 'e') {
168: s1 = 0;
169: n1 = 0;
170: c = *iline++;
171: if(c == '`') { /* '`' was '"' */
172: s1++;
173: c = *iline++;
174: }
175: while(digit(c)) {
176: n1 = n1*10 + c - '0';
177: c = *iline++;
178: }
179: if(s1)
180: n -= n1; else
181: n += n1;
182: }
183: n1 = n;
184: if(n1 < 0)
185: n1 = -n1;
186: d2 = 1.;
187: while(n1--)
188: d2 *= 10.;
189: if(n < 0)
190: d1 /= d2; else
191: d1 *= d2;
192: if(s)
193: d1 = -d1;
194: iline--;
195: datum = d1;
196: return(numb);
197: }
198:
199: alpha(s)
200: {
201: register c;
202:
203: c = s & 0377;
204: return(
205: (c >= 'a' && c <= 'z')
206: || (c == 'F')
207: || (c >= 0243)
208: || (litflag == -2 && (
209: c == '/'
210: || c == '.'
211: ))
212: );
213: }
214:
215: digit(s)
216: {
217: register c;
218:
219: c = s;
220: if(c >='0' && c <= '9')
221: return(1);
222: return(0);
223: }
224:
225: /*
226: * s is statement
227: * f is execution flag:
228: * 0 compile immediate
229: * 1 compile L
230: * 2 function definition
231: * 3 function prolog
232: * 4 function epilog
233: * 5 function body
234: */
235: int ilex[] =
236: {
237: lex0, lex1, lex2, lex3, lex4, lex5, lex6
238: };
239:
240: char *
241: compile(s, f)
242: char *s;
243: {
244: register char *p, *q;
245: char oline[OBJS];
246:
247: iline = s;
248: ccharp = oline;
249: litflag = 0;
250: nlexsym = ilex[f];
251: context = nlexsym;
252: if(yyparse()) {
253: pline(s, iline-s);
254: if(iline-s > 1)
255: printf("syntax error\n");
256: return(0);
257: }
258: *ccharp++ = EOF;
259: p = alloc(ccharp-oline);
260: iline = p;
261: for(q=oline; q<ccharp;)
262: *p++ = *q++;
263: return(iline);
264: }
265:
266: yyerror()
267: {
268: }
269:
270: char *
271: name(np, c)
272: {
273: register char *p, *npp;
274:
275: p = ccharp;
276: npp = (char *)&np;
277: *ccharp++ = c;
278: *ccharp++ = *npp++;
279: #ifdef vax
280: *ccharp++ = *npp++;
281: *ccharp++ = *npp++;
282: #endif
283: *ccharp++ = *npp;
284: return(p);
285: }
286:
287: equal(a, b)
288: char *a, *b;
289: {
290: register char *c1, *c2;
291:
292: c1 = a;
293: c2 = b;
294: while(*c1++ == *c2)
295: if(*c2++ == 0)
296: return(1);
297: return(0);
298: }
299:
300: invert(a, b)
301: {
302:
303: flop(a, b);
304: flop(b, ccharp);
305: flop(a, ccharp);
306: }
307:
308: flop(a, b)
309: char *a, *b;
310: {
311: register char *a1, *a2;
312: register c;
313:
314: a1 = a;
315: a2 = b;
316: while(a1 < a2) {
317: c = *a1;
318: *a1++ = *--a2;
319: *a2 = c;
320: }
321: }
322:
323: /*
324: * genlab -- generates label code onto label stacks.
325: *
326: * prologue: AUTO-lab, CONST-linenum, NAME-lab LABEL
327: *
328: * epilog: REST-lab
329: */
330: genlab(np)
331: struct nlist *np;
332: {
333:
334: /* label prologue */
335:
336: *labcpp++ = AUTO;
337: labcpp += copy(IN, &np, labcpp, 1);
338: *labcpp++ = CONST;
339: *labcpp++ = 1;
340: labcpp += copy(DA, &lnumb, labcpp, 1);
341: *labcpp++ = NAME;
342: labcpp += copy(IN, &np, labcpp, 1);
343: *labcpp++ = LABEL;
344: *labcpp = EOF;
345:
346: /* label epilog */
347:
348: *labcpe++ = REST;
349: labcpe += copy(IN, &np, labcpe, 1);
350: *labcpe = EOF;
351: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.