|
|
1.1 root 1: %Start DOTSON
2: %{
3: #include <ctype.h>
4: #include "defs"
5: #include "tokdefs"
6:
7: typedef union { int ival; ptr pval; } YYSTYPE;
8: extern YYSTYPE yylval;
9: YYSTYPE prevl;
10: int prevv;
11: char *copys();
12: static ptr p;
13: static ptr q;
14: static FILE *fd;
15: static int quoted, k;
16: static int rket = 0;
17: FILE *opincl();
18: ptr mkdef(), mkcomm(), mkname(), mkimcon();
19:
20: #define RET(x) { RETI(x,x); }
21:
22: #define RETL(yv,yl) {yylval=prevl=yl;igeol=comneed=0;return(prevv=yv); }
23: #define RETP(yv,yl) {yylval.pval=prevl.pval=yl;igeol=comneed=0;return(prevv=yv); }
24: #define RETI(yv,yl) {yylval.ival=prevl.ival=yl;igeol=comneed=0;return(prevv=yv); }
25: #define REL(n) { RETI(RELOP, OPREL+n);}
26: #define AS(n) { RETI(ASGNOP, OPASGN+n); }
27: #define RETC(x) { RETP(CONST, mkconst(x,yytext) ); }
28: #define RETZ(x) { yytext[yyleng-1] = '\0'; RETP(CONST, mkimcon(x,yytext) ); }
29:
30: %}
31:
32: D [0-9]
33: d [dD][+-]?[0-9]+
34: e [eE][+-]?[0-9]+
35: i [iI]
36:
37: %%
38:
39: [a-zA-Z][a-zA-Z0-9_]* {
40: lower(yytext);
41: if(lettneed && yyleng==1)
42: { RETI(LETTER, yytext[0]); }
43: else if(defneed)
44: {
45: register char *q1, *q2;
46: for(q2=q1=yytext+yyleng+1 ; (*q1 = efgetc)!='\n' ; ++q1)
47: ;
48: *q1 = '\0';
49: p = mkdef(yytext, q2);
50: defneed = 0;
51: ++yylineno;
52: unput('\n');
53: }
54: else if(optneed)
55: { RETP(OPTNAME, copys(yytext)); }
56: else if(comneed && ( (q=name(yytext,1))==NULL || q->tag!=TDEFINE) )
57: { RETP(COMNAME, mkcomm(yytext) ); }
58: else if(q = name(yytext,1)) switch(q->tag)
59: {
60: case TDEFINE:
61: filelines[filedepth] = yylineno;
62: filemacs[filedepth] = efmacp;
63: pushchars[filedepth] = (yysptr>yysbuf?
64: *--yysptr : -1);
65: if(++filedepth >= MAXINCLUDEDEPTH)
66: fatal("macro or include too deep");
67: filelines[filedepth] = yylineno = 1;
68: efmacp = q->varp->valp;
69: filenames[filedepth] = NULL;
70: break; /*now process new input */
71:
72: case TSTRUCT:
73: RETP(STRUCTNAME, q);
74:
75: case TNAME:
76: RETP(NAME, q);
77:
78: case TKEYWORD:
79: if(q->subtype == END)
80: {
81: register int c;
82: eofneed = YES;
83: while((c=input())!=';'&&c!='\n'&&c!=EOF)
84: ;
85: NLSTATE;
86: }
87: RET(q->subtype);
88:
89: default:
90: fatal1("lex: impossible type code %d", q->tag);
91: }
92: else RETP(NAME, mkname(yytext) );
93: }
94:
95: "," RET(COMMA);
96: ";" RET(EOS);
97:
98: "(" RET(LPAR);
99: ")" RET(RPAR);
100:
101:
102: "[" |
103: "{" RET(LBRACK);
104:
105: "]" |
106: "}" { if(iobrlevel>0) RET(RBRACK); rket = 1; RET(EOS); }
107:
108: "," RET(COMMA);
109: ":" RET(COLON);
110:
111: "$" RET(REPOP);
112:
113: <DOTSON>"."[oO][rR]"." |
114: "|" RETI(OR,OPOR);
115: <DOTSON>"."[cC][oO][rR]"." |
116: "||" RETI(OR,OP2OR);
117: <DOTSON>"."[aA][nN][dD]"." |
118: "&" RETI(AND,OPAND);
119: <DOTSON>"."[cC][aA][nN][dD]"." |
120: "&&" RETI(AND,OP2AND);
121: <DOTSON>"."[nN][oO][tT]"." |
122: "~" RETI(NOT,OPNOT);
123: "!" RETI(NOT,OPNOT);
124:
125: <DOTSON>"."[lL][tT]"." |
126: "<" REL(OPLT);
127: <DOTSON>"."[lL][eE]"." |
128: "<=" REL(OPLE);
129: <DOTSON>"."[gG][tT]"." |
130: ">" REL(OPGT);
131: <DOTSON>"."[gG][eE]"." |
132: ">=" REL(OPGE);
133: <DOTSON>"."[eE][qQ]"." |
134: "==" REL(OPEQ);
135: <DOTSON>"."[nN][eE]"." |
136: "~=" |
137: "!=" REL(OPNE);
138:
139: "->" RET(ARROW);
140: "." RET(QUALOP);
141:
142: "+" RETI(ADDOP, OPPLUS);
143: "-" RETI(ADDOP, OPMINUS);
144: "*" RETI(MULTOP, OPSTAR);
145: "/" RETI(MULTOP, OPSLASH);
146:
147: "**" |
148: "^" RETI(POWER, OPPOWER);
149:
150: "++" RETI(DOUBLEADDOP, OPPLUS);
151: "--" RETI(DOUBLEADDOP, OPMINUS);
152:
153: "=" AS(OPASGN);
154: "+=" AS(OPPLUS);
155: "-=" AS(OPMINUS);
156: "*=" AS(OPSTAR);
157: "/=" AS(OPSLASH);
158: "**=" |
159: "^=" AS(OPPOWER);
160:
161: "&=" AS(OPAND);
162: "&&=" AS(OP2AND);
163: "|=" AS(OPOR);
164: "||=" AS(OP2OR);
165:
166: \'[^\n']*\' |
167: \"[^\n"]*\" { yytext[yyleng-1] = '\0'; p = mkconst(TYCHAR,yytext+1);
168: RETP(CONST,p); }
169:
170: {D}+[hH] { /* nh construct */
171: int i, n; char c;
172: yytext[yyleng-1] = '\0'; n = convci(yytext);
173: for(i = 0; i<n ; ++i)
174: if( (c=yytext[i]=input()) == '\n' || c=='\0') break;
175: yytext[i] = '\0';
176: p = mkconst(TYCHAR,yytext);
177: p->vtypep = mkint(i);
178: RETP(CONST, p);
179: }
180:
181: {D}+ RETC(TYINT);
182:
183: {D}+"."{D}* |
184: {D}*"."{D}+ RETC(TYREAL);
185:
186: {D}+"."?{D}*{e} |
187: {D}*"."{D}+{e} RETC(TYREAL);
188:
189: {D}+"."?{D}*{d} |
190: {D}*"."{D}+{d} RETC(TYLREAL);
191:
192: {D}+{i} { yytext[yyleng-1] = '.';
193: RETP(CONST,mkimcon(TYCOMPLEX,yytext)); }
194:
195: {D}+"."{D}*{i} |
196: {D}*"."{D}+{i} RETZ(TYCOMPLEX);
197:
198: {D}+"."?{D}*{e}{i} |
199: {D}*"."{D}+{e}{i} RETZ(TYCOMPLEX);
200:
201: {D}+"."?{D}*{d}{i} |
202: {D}*"."{D}+{d}{i} RETZ(TYLCOMPLEX);
203:
204: "#".* { if(! nocommentflag) goto litline; }
205:
206: ^"%".* { if(thisexec) thisexec->nftnst += 2;
207: if(inproc)
208: {
209: unput('\n');
210: RETP(ESCAPE, copys(yytext));
211: }
212:
213: litline: p = mkchain( copys(yytext), CHNULL);
214: if(inproc==0 && yytext[0]=='%')
215: prevcomments = hookup(prevcomments, p);
216: else
217: comments = hookup(comments,p);
218: }
219:
220: " " ;
221: \t ;
222: \f ;
223:
224: "_"[ \t]*\n ;
225:
226: \n { if(igeol) { igeol=0; prevv = NEWLINE; }
227: else if(prevv>=NAME || prevv==RPAR || prevv==RBRACK
228: || prevv== -1 || prevv==QUALOP)
229: RET(EOS); }
230:
231: . { char * linerr();
232: fprintf(diagfile, "Bad input character %c %s\n", yytext[0], linerr());
233: ++nerrs;
234: }
235:
236: ^[ \t]*[iI][nN][cC][lL][uU][dD][eE].*\n { /* Include statement */
237: char *q1;
238: register char *q2;
239: for(q1=yytext ; *q1==' ' || *q1=='\t' ; ++q1) ;
240: quoted = NO;
241: for(q1 += 7 ; *q1==' ' || *q1=='\t' ||
242: *q1=='\'' || *q1=='"' || *q1=='(' ; ++q1 )
243: if(*q1=='"' || *q1=='\'')
244: quoted = YES;
245: for(q2=q1 ; *q2!='\0' && *q2!=' ' && *q2!='\n' &&
246: *q2!='\'' && *q2!='"' && *q2!=')' ; ++q2 )
247: ;
248: *q2 = '\0';
249: if( ! quoted)
250: for(k=0; (q = name(q1,1)) && q->tag==TDEFINE ; ++k)
251: {
252: if(k > MAXINCLUDEDEPTH)
253: fatal1("Macros too deep for %s", yytext);
254: q1 = q->varp->valp;
255: }
256: if( (fd = opincl(&q1)) == NULL)
257: {
258: fprintf(diagfile, "Cannot open file %s. Stop.\n", q1);
259: exit(2);
260: }
261: filelines[filedepth] = yylineno;
262: pushchars[filedepth] = '\n';
263: if(++filedepth >= MAXINCLUDEDEPTH)
264: fatal("macro or include too deep");
265: fileptrs[filedepth] = yyin = fd;
266: filenames[filedepth] = copys(q1);
267: filelines[filedepth] = yylineno = 1;
268: filemacs[filedepth] = NULL;
269: }
270:
271: %%
272:
273: yywrap()
274: {
275: if(filedepth == 0)
276: {
277: ateof = 1;
278: return(1);
279: }
280:
281: if(efmacp == 0)
282: {
283: fclose(yyin);
284: cfree(filenames[filedepth]);
285: }
286:
287: --filedepth;
288: if( filemacs[filedepth] )
289: efmacp = filemacs[filedepth];
290: else {
291: yyin = fileptrs[filedepth];
292: efmacp = 0;
293: }
294: yylineno = filelines[filedepth];
295: if(pushchars[filedepth] != -1)
296: unput( pushchars[filedepth] );
297: return(0);
298: }
299:
300:
301:
302: lower(s) /* replace upper with lower case letters */
303: register char *s;
304: {
305: register char *t;
306: for(t=s ; *t ; ++t)
307: if( isupper(*t) )
308: *s++ = tolower(*t);
309: else if(*t != '_')
310: *s++ = *t;
311: }
312:
313:
314:
315:
316: setdot(k)
317: int k;
318: {
319: if(k)
320: BEGIN DOTSON;
321: else BEGIN 0;
322: }
323:
324:
325:
326:
327: FILE *opincl(namep)
328: char **namep;
329: {
330: #ifndef unix
331: return( fopen(*namep, "r") );
332: #else
333:
334: /* On Unix, follow the C include conventions */
335:
336: register char *s, *lastslash;
337: char *dir, *name, temp[100];
338: int i;
339: FILE *fp;
340:
341: name = *namep;
342: if(name[0] == '/')
343: return( fopen(name, "r") );
344:
345: dir = basefile;
346: for(i = filedepth ; i>=0 ; --i)
347: if( filemacs[i] == NULL)
348: {
349: dir = filenames[i];
350: break;
351: }
352:
353: lastslash = NULL;
354: for(s = dir ; *s ; ++s)
355: if(*s == '/')
356: lastslash = s;
357: if(lastslash)
358: {
359: *lastslash = '\0';
360: sprintf(temp, "%s/%s", dir, name);
361: *lastslash = '/';
362: if( fp = fopen(temp, "r") )
363: *namep = temp;
364: }
365: else
366: fp = fopen(name, "r");
367:
368: if(fp == NULL)
369: {
370: sprintf(temp, "/usr/include/%s", name);
371: fp = fopen(temp, "r");
372: *namep = temp;
373: }
374: return(fp);
375:
376: #endif
377: }
378:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.