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