1: #include "awk.h" 2: #define NULL 0 3: struct xx 4: { int token; 5: char *name; 6: char *pname; 7: } proc[] { 8: { PROGRAM, "program", NULL}, 9: { BOR, "boolop", " || "}, 10: { AND, "boolop", " && "}, 11: { NOT, "boolop", " !"}, 12: { NE, "relop", " != "}, 13: { EQ, "relop", " == "}, 14: { LE, "relop", " <= "}, 15: { LT, "relop", " < "}, 16: { GE, "relop", " >= "}, 17: { GT, "relop", " > "}, 18: { ARRAY, "array", NULL}, 19: { INDIRECT, "indirect", "$("}, 20: { SUBSTR, "substr", "substr"}, 21: { INDEX, "sindex", "sindex"}, 22: { SPRINTF, "asprintf", "sprintf "}, 23: { ADD, "arith", " + "}, 24: { MINUS, "arith", " - "}, 25: { MULT, "arith", " * "}, 26: { DIVIDE, "arith", " / "}, 27: { MOD, "arith", " % "}, 28: { UMINUS, "arith", " -"}, 29: { PREINCR, "incrdecr", "++"}, 30: { POSTINCR, "incrdecr", "++"}, 31: { PREDECR, "incrdecr", "--"}, 32: { POSTDECR, "incrdecr", "--"}, 33: { CAT, "cat", " "}, 34: { PASTAT, "pastat", NULL}, 35: { PASTAT2, "dopa2", NULL}, 36: { MATCH, "matchop", " ~ "}, 37: { NOTMATCH, "matchop", " !~ "}, 38: { PRINTF, "aprintf", "printf"}, 39: { PRINT, "print", "print"}, 40: { SPLIT, "split", "split"}, 41: { ASSIGN, "assign", " = "}, 42: { ADDEQ, "assign", " += "}, 43: { SUBEQ, "assign", " -= "}, 44: { MULTEQ, "assign", " *= "}, 45: { DIVEQ, "assign", " /= "}, 46: { MODEQ, "assign", " %= "}, 47: { IF, "ifstat", "if("}, 48: { WHILE, "whilestat", "while("}, 49: { FOR, "forstat", "for("}, 50: { IN, "instat", "instat"}, 51: { NEXT, "jump", "next"}, 52: { EXIT, "jump", "exit"}, 53: { BREAK, "jump", "break"}, 54: { CONTINUE, "jump", "continue"}, 55: { FNCN, "fncn", "fncn"}, 56: { 0, ""}, 57: }; 58: #define SIZE LASTTOKEN - FIRSTTOKEN 59: char *table[SIZE]; 60: char *names[SIZE]; 61: main() 62: { struct xx *p; 63: int i; 64: printf("#include \"awk.def\"\n"); 65: printf("obj nullproc();\n"); 66: for(p=proc;p->token!=0;p++) 67: if(p==proc || strcmp(p->name, (p-1)->name)) 68: printf("extern obj %s();\n",p->name); 69: for(p=proc;p->token!=0;p++) 70: table[p->token-FIRSTTOKEN]=p->name; 71: printf("obj (*proctab[%d])() {\n", SIZE); 72: for(i=0;i<SIZE;i++) 73: if(table[i]==0) printf("/*%s*/\tnullproc,\n",tokname(i+FIRSTTOKEN)); 74: else printf("/*%s*/\t%s,\n",tokname(i+FIRSTTOKEN),table[i]); 75: printf("};\n"); 76: printf("char *printname[%d] {\n", SIZE); 77: for(p=proc; p->token!=0; p++) 78: names[p->token-FIRSTTOKEN] = p->pname; 79: for(i=0; i<SIZE; i++) 80: printf("/*%s*/\t\"%s\",\n",tokname(i+FIRSTTOKEN),names[i]); 81: printf("};\n"); 82: }