#include #include #define MOVE(s) { *IMAGE++ = c; getch(); goto s; } #define REVIEW(s) { getch(); goto s; } #define ACCEPT(T) { *IMAGE = '\0'; return(T); } #define input grptab[c+1] static int c; int linenum, charnum; char tokentext[256]; static char *lexidt[89] = { NULL, NULL, "BLOCK", "FORMAT", "LOGICAL", "REAL", NULL, NULL, "ENDIF", "RETURN", "ASSIGN", "WRITE", NULL, "INTRINSIC", NULL, NULL, "OPEN", NULL, "PROGRAM", "DATA", "CONTINUE", NULL, NULL, "PRECISION", "DIMENSION", NULL, "EQUIVALENCE", "ELSEIF", "ENTRY", "INTEGER", NULL, NULL, "SUBROUTINE", NULL, "DOUBLE", "COMMON", "IMPLICIT", "PAUSE", NULL, "SAVE", "FUNCTION", NULL, NULL, "CALL", NULL, "STOP", "GOTO", "END", NULL, NULL, NULL, NULL, "PARAMETER", NULL, "REWIND", NULL, NULL, "BACKSPACE", NULL, NULL, NULL, NULL, "ELSE", "DO", NULL, NULL, NULL, NULL, NULL, NULL, NULL, "PRINT", NULL, NULL, "EXTERNAL", NULL, NULL, "INQUIRE", "CLOSE", "IF", NULL, NULL, "ENDFILE", NULL, "CHARACTER", "THEN", "READ", NULL, NULL, }; static int kw_values[89] = { 0, 0, BLK, FRM, LOG, RAL, 0, 0, ENF, RTN, ASN, WRI, 0, INR, 0, 0, OPN, 0, PGM, DAT, CTN, 0, 0, PRC, DMN, 0, EQV, ELI, ETR, INT, 0, 0, SBR, 0, DBL, CMN, IMP, PAU, 0, SAV, FUN, 0, 0, CAL, 0, STP, GOT, END, 0, 0, 0, 0, PRM, 0, RWD, 0, 0, BKS, 0, 0, 0, 0, ELS, DOK, 0, 0, 0, 0, 0, 0, 0, PRN, 0, 0, XTL, 0, 0, INQ, CLS, IFS, 0, 0, EDI, 0, CHA, THN, RED, 0, 0, }; static char grptab[129] = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 0, 18, 19, 20, 0, 0, 21, 22, 22, 23, 24, 25, 26, 22, 22, 22, 22, 27, 22, 28, 29, 22, 30, 31, 32, 33, 34, 35, 22, 22, 22, 22, 0, 0, 0, 36, 6, 0, 22, 22, 22, 22, 37, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 0, 38, 0, 0, 0, }; scan() { register char *IMAGE; s00: IMAGE = tokentext; switch(input) { case 1: MOVE(s01); case 2: MOVE(s02); case 3: MOVE(s03); case 4: MOVE(s04); case 5: REVIEW(s05); case 7: REVIEW(s06); case 8: MOVE(s07); case 9: MOVE(s08); case 10: MOVE(s09); case 11: MOVE(s10); case 12: MOVE(s11); case 13: MOVE(s12); case 14: MOVE(s13); case 15: MOVE(s14); case 16: MOVE(s15); case 17: MOVE(s16); case 18: MOVE(s17); case 19: MOVE(s18); case 20: MOVE(s19); case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 37: MOVE(s20); case 36: MOVE(s21); case 38: MOVE(s22); case EOF: return(EOF); default: goto err1; } s01: ACCEPT(WH1); s02: ACCEPT(WH2); s03: if (input == 3) REVIEW(s03); goto s00; s04: ACCEPT(WH3); s05: if (input == 5) REVIEW(s82); MOVE(s05); s06: if (input == 7) REVIEW(s91); MOVE(s06); s07: ACCEPT(LPA); s08: ACCEPT(RPA); s09: if (input == 10) MOVE(s23); ACCEPT(AST); s10: ACCEPT(PLS); s11: ACCEPT(CMA); s12: ACCEPT(DSH); s13: switch(input) { case 16: MOVE(s27); case 21: MOVE(s28); case 24: MOVE(s29); case 25: MOVE(s30); case 26: MOVE(s31); case 27: MOVE(s32); case 28: MOVE(s33); case 29: MOVE(s34); case 33: MOVE(s35); default: ACCEPT(DOT); } s14: if (input == 15) MOVE(s24); ACCEPT(SLN); s15: switch(input) { case 14: MOVE(s25); case 16: MOVE(s15); case 37: MOVE(s26); default: ACCEPT(NMB); } s16: ACCEPT(CLN); s17: if (input == 19) MOVE(s94); ACCEPT(LAG); s18: ACCEPT(EQZ); s19: if (input == 19) MOVE(s55); ACCEPT(RAG); s20: switch(input) { case 6: case 16: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 37: MOVE(s20); default: ACCEPT(kw_lookup()); } s21: if (input == 19) MOVE(s53); goto err1; s22: if (input == 38) MOVE(s54); goto err1; s23: ACCEPT(PWR); s24: ACCEPT(CT2); s25: switch(input) { case 11: case 13: MOVE(s56); case 16: MOVE(s57); default: ACCEPT(REL); } s26: switch(input) { case 11: case 13: MOVE(s69); case 16: MOVE(s70); default: goto err1; } s27: switch(input) { case 11: case 13: MOVE(s50); case 16: MOVE(s27); case 24: MOVE(s51); case 37: MOVE(s52); default: ACCEPT(REL); } s28: if (input == 28) MOVE(s36); goto err1; s29: if (input == 30) MOVE(s95); goto err1; s30: if (input == 21) MOVE(s39); goto err1; s31: switch(input) { case 24: MOVE(s72); case 33: MOVE(s73); default: goto err1; } s32: switch(input) { case 24: MOVE(s65); case 33: MOVE(s66); default: goto err1; } s33: switch(input) { case 24: MOVE(s83); case 29: MOVE(s84); default: goto err1; } s34: if (input == 31) MOVE(s44); goto err1; s35: if (input == 31) MOVE(s46); goto err1; s36: if (input == 23) MOVE(s37); goto err1; s37: if (input == 14) MOVE(s38); goto err1; s38: ACCEPT(ANZ); s39: if (input == 27) MOVE(s40); goto err1; s40: if (input == 32) MOVE(s41); goto err1; s41: if (input == 24) MOVE(s42); goto err1; s42: if (input == 14) MOVE(s43); goto err1; s43: ACCEPT(FLS); s44: if (input == 14) MOVE(s45); goto err1; s45: ACCEPT(ORZ); s46: if (input == 34) MOVE(s47); goto err1; s47: if (input == 24) MOVE(s48); goto err1; s48: if (input == 14) MOVE(s49); goto err1; s49: ACCEPT(TRU); s50: switch(input) { case 24: MOVE(s92); case 37: MOVE(s93); default: goto err1; } s51: switch(input) { case 11: case 13: MOVE(s76); case 16: MOVE(s77); default: goto err1; } s52: switch(input) { case 11: case 13: MOVE(s79); case 16: MOVE(s80); default: goto err1; } s53: ACCEPT(NXZ); s54: ACCEPT(CT1); s55: ACCEPT(GTZ); s56: switch(input) { case 24: MOVE(s58); case 37: MOVE(s59); default: goto err1; } s57: switch(input) { case 16: MOVE(s57); case 24: MOVE(s60); case 37: MOVE(s61); default: ACCEPT(REL); } s58: ACCEPT(REL); s59: ACCEPT(REL); s60: switch(input) { case 11: case 13: MOVE(s96); case 16: MOVE(s97); default: ACCEPT(REL); } s61: switch(input) { case 11: case 13: MOVE(s62); case 16: MOVE(s63); default: ACCEPT(REL); } s62: if (input == 16) MOVE(s64); goto err1; s63: if (input == 16) MOVE(s63); ACCEPT(REL); s64: if (input == 16) MOVE(s64); ACCEPT(REL); s65: if (input == 14) MOVE(s67); goto err1; s66: if (input == 14) MOVE(s68); goto err1; s67: ACCEPT(LEQ); s68: ACCEPT(LTQ); s69: if (input == 16) MOVE(s71); goto err1; s70: if (input == 16) MOVE(s70); ACCEPT(REL); s71: if (input == 16) MOVE(s71); ACCEPT(REL); s72: if (input == 14) MOVE(s74); goto err1; s73: if (input == 14) MOVE(s75); goto err1; s74: ACCEPT(GEQ); s75: ACCEPT(GTQ); s76: if (input == 16) MOVE(s78); goto err1; s77: if (input == 16) MOVE(s77); ACCEPT(REL); s78: if (input == 16) MOVE(s78); ACCEPT(REL); s79: if (input == 16) MOVE(s81); goto err1; s80: if (input == 16) MOVE(s80); ACCEPT(REL); s81: if (input == 16) MOVE(s81); ACCEPT(REL); s82: if (input == 5) MOVE(s05); ACCEPT(TX2); s83: switch(input) { case 14: MOVE(s87); case 30: MOVE(s88); default: goto err1; } s84: if (input == 33) MOVE(s85); goto err1; s85: if (input == 14) MOVE(s86); goto err1; s86: ACCEPT(NOT); s87: ACCEPT(NEQ); s88: if (input == 35) MOVE(s89); goto err1; s89: if (input == 14) MOVE(s90); goto err1; s90: ACCEPT(NQV); s91: if (input == 7) MOVE(s06); ACCEPT(TX1); s92: ACCEPT(REL); s93: ACCEPT(REL); s94: ACCEPT(LEZ); s95: switch(input) { case 14: MOVE(s99); case 35: MOVE(s100); default: goto err1; } s96: if (input == 16) MOVE(s98); goto err1; s97: if (input == 16) MOVE(s97); ACCEPT(REL); s98: if (input == 16) MOVE(s98); ACCEPT(REL); s99: ACCEPT(EQQ); s100: if (input == 14) MOVE(s101); goto err1; s101: ACCEPT(EQV); err1: (void) printf("line %d: unexpected character (%03o octal)\n", linenum, c); REVIEW(s00); } void initscan() { linenum = 1; charnum = 0; getch(); } static getch() { if (c == '\n') { linenum++; charnum = 0; } charnum++; c = getchar(); } static kw_lookup() { register long hash = 0; register char *s; for (s = tokentext; *s != '\0'; s++) { if (islower(*s)) *s = toupper(*s); hash = hash * 5 + *s; } hash = ((hash < 0) ? -hash : hash) % 89; while (lexidt[hash] != NULL && strcmp(tokentext,lexidt[hash]) != 0) hash = (hash == 88) ? 0 : hash+1; return(lexidt[hash]==NULL ? IDT : kw_values[hash]); }