|
|
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.