|
|
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.