|
|
1.1 ! root 1: #include <ctype.h> ! 2: #include "common.h" ! 3: #include "code.h" ! 4: #include "sym.h" ! 5: #include "y.tab.h" ! 6: ! 7: int yyline = 1; ! 8: char token_buffer[MAXIDSIZE+1]; ! 9: extern YYSTYPE yylval; ! 10: static void ScanCodeBlock(); ! 11: static void ScanComment(); ! 12: static Code *curCdBlock; ! 13: static char get(); ! 14: ! 15: yylex() ! 16: { ! 17: register c; ! 18: register char *cp; ! 19: int in_ident = 0; ! 20: yylval.y_nodep = (struct node *) NULL; ! 21: cp = token_buffer; ! 22: while((c=getchar())!=EOF) { ! 23: switch(c) { ! 24: case ' ': case '\t': case '\f': ! 25: continue; ! 26: case '@': case '[': case ']': case ';': case ':': ! 27: case '(': case ')': case ',': case '=': ! 28: case '*': ! 29: if(debug_flag&DB_LEX) { ! 30: putc(c,stderr); ! 31: putc('\n', stderr); ! 32: } ! 33: *cp++ = c; ! 34: *cp = '\0'; ! 35: return(c); ! 36: ! 37: case '{': ! 38: ScanCodeBlock(); ! 39: yylval.y_code = curCdBlock; ! 40: curCdBlock = NULL; ! 41: *cp++ = '{'; *cp++ = '}'; ! 42: return(CBLOCK); ! 43: ! 44: case '\n': ! 45: yyline++; ! 46: continue; ! 47: case '/': ! 48: if ((c=getchar())=='*') { ! 49: ScanComment(get); ! 50: continue; ! 51: } else { ! 52: ungetc(c, stdin); ! 53: c = '/'; ! 54: } ! 55: /* FALL THRU */ ! 56: ! 57: default: ! 58: if (isdigit(c)) { ! 59: int errs = 0; ! 60: do { ! 61: if(cp > &token_buffer[MAXIDSIZE]) { ! 62: token_buffer[MAXIDSIZE] = '\0'; ! 63: yyerror("number too long"); ! 64: errs++; ! 65: } else *cp++ = c; ! 66: c = getchar(); ! 67: } while (isdigit(c)); ! 68: if(isalpha(c)) ! 69: yyerror2("illegal digit '%c'", c); ! 70: ungetc(c, stdin); ! 71: if(errs) ! 72: return(ERROR); ! 73: yylval.y_int = atoi(token_buffer); ! 74: return(NUMBER); ! 75: } ! 76: if (isalpha(c)) { ! 77: SymbolEntry *sp; ! 78: int errs = 0; ! 79: do { ! 80: if(cp > &token_buffer[MAXIDSIZE]) { ! 81: token_buffer[MAXIDSIZE] = '\0'; ! 82: yyerror("ID too long"); ! 83: errs++; ! 84: } else *cp++ = c; ! 85: c = getchar(); ! 86: } while (isalpha(c)||isdigit(c)||c=='_'); ! 87: ungetc(c, stdin); ! 88: if(errs) ! 89: return(ERROR); ! 90: *cp = '\0'; ! 91: ! 92: sp = SymbolLookup (token_buffer); ! 93: if (sp==NULL) { ! 94: /* undefined */ ! 95: yylval.y_symp = SymbolAllocate(token_buffer); ! 96: } else { ! 97: /* already defined */ ! 98: if (sp->attr == A_KEYWORD) ! 99: return (sp->sd.keyword); ! 100: yylval.y_symp = sp; ! 101: } ! 102: if(debug_flag&DB_LEX) ! 103: fprintf(stderr, "ID\n"); ! 104: return(ID); ! 105: } ! 106: yyerror2("illegal character (\\%03o)", c); ! 107: } ! 108: } ! 109: strcpy(token_buffer, "EOF"); ! 110: return(0); ! 111: } ! 112: ! 113: void ! 114: LexInit() ! 115: { ! 116: } ! 117: ! 118: lexCleanup() ! 119: { ! 120: } ! 121: ! 122: /* ! 123: * Beware: ungets of the characters from these routines may screw up the ! 124: * line count ! 125: */ ! 126: static char ! 127: getput() ! 128: { ! 129: /* keutzer ! 130: char c; ! 131: */ ! 132: int c; ! 133: c = getchar(); ! 134: if(c=='\n') yyline++; ! 135: if(c!=EOF) ! 136: curCdBlock = CodeStoreChar(curCdBlock, c); ! 137: return(c); ! 138: } ! 139: ! 140: static char ! 141: get() ! 142: { ! 143: /* keutzer ! 144: char c; ! 145: */ ! 146: int c; ! 147: c = getchar(); ! 148: if(c=='\n') yyline++; ! 149: return(c); ! 150: } ! 151: ! 152: extern int nerrors; ! 153: ! 154: static void ! 155: ScanComment(rdfunc) ! 156: char (*rdfunc)(); ! 157: { ! 158: int startline = yyline; ! 159: /* keutzer ! 160: char c; ! 161: */ ! 162: int c; ! 163: int saw_star = 0; ! 164: while ((c=rdfunc())!=EOF) { ! 165: if (c=='*') ! 166: saw_star++; ! 167: else if(c=='/' && saw_star) { ! 168: return; ! 169: } else saw_star = 0; ! 170: } ! 171: yyerror2("unexpected EOF in comment beginning on line %d", startline); ! 172: nerrors++; ! 173: cleanup(1); ! 174: } ! 175: ! 176: static ! 177: ScanString(rdfunc) ! 178: char (*rdfunc)(); ! 179: { ! 180: int startline = yyline; ! 181: /* keutzer ! 182: char c; ! 183: */ ! 184: int c; ! 185: int saw_backsl = 0; ! 186: ! 187: while((c=rdfunc())!=EOF) { ! 188: if (c=='"' && !saw_backsl) ! 189: return; ! 190: if (c=='\\' && !saw_backsl) { ! 191: saw_backsl = 1; ! 192: continue; ! 193: } ! 194: saw_backsl = 0; ! 195: } ! 196: /* fall thru due to EOF */ ! 197: yyerror2("unexpected EOF in string beginning on line %d", startline); ! 198: nerrors++; ! 199: cleanup(1); ! 200: } ! 201: ! 202: static ! 203: ScanChar() ! 204: { ! 205: int startline = yyline; ! 206: /* keutzer ! 207: char c; ! 208: */ ! 209: int c; ! 210: int saw_backsl = 0; ! 211: ! 212: while((c=getput(stdin))!=EOF) { ! 213: if (c=='\'' && !saw_backsl) ! 214: return; ! 215: if (c=='\\' && !saw_backsl) { ! 216: saw_backsl = 1; ! 217: continue; ! 218: } ! 219: saw_backsl = 0; ! 220: } ! 221: /* fall thru due to EOF */ ! 222: yyerror2("unexpected EOF in character constant beginning on line %d", ! 223: startline); ! 224: nerrors++; ! 225: cleanup(1); ! 226: } ! 227: ! 228: static void ! 229: ScanTreeReference() ! 230: { ! 231: ! 232: /* keutzer ! 233: char c; ! 234: */ ! 235: int c; ! 236: c = getchar(); ! 237: if(c=='%') { ! 238: curCdBlock = CodeStoreString (curCdBlock, "_ll[("); ! 239: while ((c=getchar())!=EOF && c!='$') { ! 240: if(!isdigit(c)) { ! 241: yyerror("unclosed $ reference"); ! 242: ungetc(c,stdin); ! 243: break; ! 244: } ! 245: curCdBlock = CodeStoreChar(curCdBlock, c); ! 246: } ! 247: curCdBlock = CodeStoreString (curCdBlock, ")-1]"); ! 248: return; ! 249: } ! 250: else if(c=='$') { ! 251: curCdBlock = CodeStoreString(curCdBlock, "root"); ! 252: return; ! 253: } else curCdBlock = CodeStoreString(curCdBlock, "_mtG(root,"); ! 254: do { ! 255: if(!isdigit(c) && c!='.') { ! 256: yyerror("unclosed $ reference"); ! 257: ungetc(c,stdin); ! 258: break; ! 259: } ! 260: curCdBlock = CodeStoreChar(curCdBlock, c=='.' ? ',' : c); ! 261: } while((c=getchar())!=EOF && c!='$'); ! 262: curCdBlock = CodeStoreString(curCdBlock, ", -1)"); ! 263: } ! 264: ! 265: static void ! 266: ScanCodeBlock() ! 267: { ! 268: int startline = yyline; ! 269: /* keutzer ! 270: char c; ! 271: */ ! 272: int c; ! 273: if(curCdBlock==NULL) { ! 274: curCdBlock = CodeGetBlock(); ! 275: curCdBlock = CodeMarkLine(curCdBlock,yyline); ! 276: } ! 277: while((c=getc(stdin))!=EOF) { ! 278: if (c=='}') ! 279: return; ! 280: else if (c=='$') ScanTreeReference(); ! 281: else curCdBlock = CodeStoreChar(curCdBlock, c); ! 282: if (c=='\n') yyline++; ! 283: if (c=='"') ScanString(getput); ! 284: else if (c=='\'') ScanChar(); ! 285: else if (c=='/') { ! 286: if ((c=getc(stdin))=='*') { ! 287: curCdBlock = CodeStoreChar(curCdBlock, '*'); ! 288: ScanComment(getput); ! 289: } ! 290: else ungetc(c, stdin); ! 291: } ! 292: else if (c=='{') { ! 293: ScanCodeBlock(); ! 294: curCdBlock = CodeStoreChar (curCdBlock, '}'); ! 295: } ! 296: } ! 297: yyerror2("{ on line %d has no closing }", startline); ! 298: nerrors++; ! 299: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.