|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "awk.h" ! 3: #include "y.tab.h" ! 4: ! 5: struct xx ! 6: { int token; ! 7: char *name; ! 8: char *pname; ! 9: } proc[] = { ! 10: { PROGRAM, "program", NULL }, ! 11: { BOR, "boolop", " || " }, ! 12: { AND, "boolop", " && " }, ! 13: { NOT, "boolop", " !" }, ! 14: { NE, "relop", " != " }, ! 15: { EQ, "relop", " == " }, ! 16: { LE, "relop", " <= " }, ! 17: { LT, "relop", " < " }, ! 18: { GE, "relop", " >= " }, ! 19: { GT, "relop", " > " }, ! 20: { ARRAY, "array", NULL }, ! 21: { INDIRECT, "indirect", "$(" }, ! 22: { SUBSTR, "substr", "substr" }, ! 23: { SUB, "sub", "sub" }, ! 24: { GSUB, "gsub", "gsub" }, ! 25: { INDEX, "sindex", "sindex" }, ! 26: { SPRINTF, "asprintf", "sprintf " }, ! 27: { ADD, "arith", " + " }, ! 28: { MINUS, "arith", " - " }, ! 29: { MULT, "arith", " * " }, ! 30: { DIVIDE, "arith", " / " }, ! 31: { MOD, "arith", " % " }, ! 32: { UMINUS, "arith", " -" }, ! 33: { POWER, "arith", " **" }, ! 34: { PREINCR, "incrdecr", "++" }, ! 35: { POSTINCR, "incrdecr", "++" }, ! 36: { PREDECR, "incrdecr", "--" }, ! 37: { POSTDECR, "incrdecr", "--" }, ! 38: { CAT, "cat", " " }, ! 39: { PASTAT, "pastat", NULL }, ! 40: { PASTAT2, "dopa2", NULL }, ! 41: { MATCH, "matchop", " ~ " }, ! 42: { NOTMATCH, "matchop", " !~ " }, ! 43: { MATCHFCN, "matchop", "matchop" }, ! 44: { INTEST, "intest", "intest" }, ! 45: { PRINTF, "aprintf", "printf" }, ! 46: { PRINT, "print", "print" }, ! 47: { CLOSE, "closefile", "closefile" }, ! 48: { DELETE, "delete", "delete" }, ! 49: { SPLIT, "split", "split" }, ! 50: { ASSIGN, "assign", " = " }, ! 51: { ADDEQ, "assign", " += " }, ! 52: { SUBEQ, "assign", " -= " }, ! 53: { MULTEQ, "assign", " *= " }, ! 54: { DIVEQ, "assign", " /= " }, ! 55: { MODEQ, "assign", " %= " }, ! 56: { POWEQ, "assign", " ^= " }, ! 57: { CONDEXPR, "condexpr", " ?: " }, ! 58: { IF, "ifstat", "if(" }, ! 59: { WHILE, "whilestat", "while(" }, ! 60: { FOR, "forstat", "for(" }, ! 61: { DO, "dostat", "do" }, ! 62: { IN, "instat", "instat" }, ! 63: { NEXT, "jump", "next" }, ! 64: { EXIT, "jump", "exit" }, ! 65: { BREAK, "jump", "break" }, ! 66: { CONTINUE, "jump", "continue" }, ! 67: { RETURN, "jump", "ret" }, ! 68: { BLTIN, "bltin", "bltin" }, ! 69: { CALL, "call", "call" }, ! 70: { ARG, "arg", "arg" }, ! 71: { VARNF, "getnf", "NF" }, ! 72: { GETLINE, "getline", "getline" }, ! 73: { 0, "", "" }, ! 74: }; ! 75: ! 76: #define SIZE LASTTOKEN - FIRSTTOKEN + 1 ! 77: char *table[SIZE]; ! 78: char *names[SIZE]; ! 79: ! 80: main() ! 81: { ! 82: struct xx *p; ! 83: int i, tok; ! 84: char c; ! 85: FILE *fp; ! 86: char buf[100], name[100], def[100]; ! 87: ! 88: printf("#include \"awk.h\"\n"); ! 89: printf("#include \"y.tab.h\"\n\n"); ! 90: printf("Cell *nullproc();\n"); ! 91: for (i = SIZE; --i >= 0; ) ! 92: names[i] = ""; ! 93: for (p=proc; p->token!=0; p++) ! 94: if (p == proc || strcmp(p->name, (p-1)->name)) ! 95: printf("extern Cell *%s();\n", p->name); ! 96: ! 97: if ((fp = fopen("y.tab.h", "r")) == NULL) { ! 98: fprintf(stderr, "maketab can't open y.tab.h!\n"); ! 99: exit(1); ! 100: } ! 101: printf("static uchar *printname[%d] = {\n", SIZE); ! 102: i = 0; ! 103: while (fgets(buf, sizeof buf, fp) != NULL) { ! 104: sscanf(buf, "%1c %s %s %d", &c, def, name, &tok); ! 105: if (c != '#') /* not #define */ ! 106: continue; ! 107: if (tok < FIRSTTOKEN || tok > LASTTOKEN) { ! 108: fprintf(stderr, "maketab funny token %d %s\n", tok, buf); ! 109: exit(1); ! 110: } ! 111: names[tok-FIRSTTOKEN] = (char *) malloc(strlen(name)+1); ! 112: strcpy(names[tok-FIRSTTOKEN], name); ! 113: printf("\t(uchar *) \"%s\",\t/* %d */\n", name, tok); ! 114: i++; ! 115: } ! 116: printf("};\n\n"); ! 117: ! 118: for (p=proc; p->token!=0; p++) ! 119: table[p->token-FIRSTTOKEN] = p->name; ! 120: printf("\nCell *(*proctab[%d])() = {\n", SIZE); ! 121: for (i=0; i<SIZE; i++) ! 122: if (table[i]==0) ! 123: printf("\tnullproc,\t/* %s */\n", names[i]); ! 124: else ! 125: printf("\t%s,\t/* %s */\n", table[i], names[i]); ! 126: printf("};\n\n"); ! 127: ! 128: printf("uchar *tokname(n)\n"); /* print a tokname() function */ ! 129: printf("{\n"); ! 130: printf(" static uchar buf[100];\n\n"); ! 131: printf(" if (n < FIRSTTOKEN || n > LASTTOKEN) {\n"); ! 132: printf(" sprintf(buf, \"token %%d\", n);\n"); ! 133: printf(" return buf;\n"); ! 134: printf(" }\n"); ! 135: printf(" return printname[n-257];\n"); ! 136: printf("}\n"); ! 137: exit(0); ! 138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.