|
|
1.1 root 1: %{
2: /* config.l 1.14 83/05/18 */
3:
4: #include <ctype.h>
5: #include "y.tab.h"
6: #include "config.h"
7:
8: #define tprintf if (do_trace) printf
9:
10: /*
11: * Key word table
12: */
13:
14: struct kt {
15: char *kt_name;
16: int kt_val;
17: } key_words[] = {
18: { "and", AND },
19: { "args", ARGS },
20: { "at", AT },
21: { "config", CONFIG },
22: { "controller", CONTROLLER },
23: { "cpu", CPU },
24: { "csr", CSR },
25: { "device", DEVICE },
26: { "disk", DISK },
27: { "drive", DRIVE },
28: { "dst", DST },
29: { "dumps", DUMPS },
30: { "flags", FLAGS },
31: { "hz", HZ },
32: { "ident", IDENT },
33: { "machine", MACHINE },
34: { "major", MAJOR },
35: { "master", MASTER },
36: { "maxusers", MAXUSERS },
37: { "mba", MBA },
38: { "minor", MINOR },
39: { "nexus", NEXUS },
40: { "on", ON },
41: { "options", OPTIONS },
42: { "priority", PRIORITY },
43: { "pseudo-device",PSEUDO_DEVICE },
44: { "root", ROOT },
45: { "size", SIZE },
46: { "slave", SLAVE },
47: { "swap", SWAP },
48: { "tape", DEVICE },
49: { "timezone", TIMEZONE },
50: { "trace", TRACE },
51: { "uba", UBA },
52: { "vba", VBA },
53: { "vector", VECTOR },
54: { 0, 0 },
55: };
56: %}
57: WORD [A-Za-z_][-A-Za-z_]*
58: %%
59: {WORD} {
60: int i;
61:
62: if ((i = kw_lookup(yytext)) == -1)
63: {
64: yylval.str = yytext;
65: tprintf("id(%s) ", yytext);
66: return ID;
67: }
68: tprintf("(%s) ", yytext);
69: return i;
70: }
71: \"[^"]+\" {
72: yytext[strlen(yytext)-1] = '\0';
73: yylval.str = yytext + 1;
74: return ID;
75: }
76: 0[0-7]* {
77: yylval.val = octal(yytext);
78: tprintf("#O:%o ", yylval.val);
79: return NUMBER;
80: }
81: 0x[0-9a-fA-F]+ {
82: yylval.val = hex(yytext);
83: tprintf("#X:%x ", yylval.val);
84: return NUMBER;
85: }
86: [1-9][0-9]* {
87: yylval.val = atoi(yytext);
88: tprintf("#D:%d ", yylval.val);
89: return NUMBER;
90: }
91: [0-9]"."[0-9]* {
92: double atof();
93: yylval.val = (int) (60 * atof(yytext) + 0.5);
94: return FPNUMBER;
95: }
96: "-" {
97: return MINUS;
98: }
99: "?" {
100: yylval.val = -1;
101: tprintf("? ");
102: return NUMBER;
103: }
104: \n/[ \t] {
105: yyline++;
106: tprintf("\n... ");
107: }
108: \n {
109: yyline++;
110: tprintf("\n");
111: return SEMICOLON;
112: }
113: #.* { /* Ignored (comment) */; }
114: [ \t]* { /* Ignored (white space) */; }
115: ";" { return SEMICOLON; }
116: "," { return COMMA; }
117: "=" { return EQUALS; }
118: "@" { return AT; }
119: . { return yytext[0]; }
120:
121: %%
122: /*
123: * kw_lookup
124: * Look up a string in the keyword table. Returns a -1 if the
125: * string is not a keyword otherwise it returns the keyword number
126: */
127:
128: kw_lookup(word)
129: register char *word;
130: {
131: register struct kt *kp;
132:
133: for (kp = key_words; kp->kt_name != 0; kp++)
134: if (eq(word, kp->kt_name))
135: return kp->kt_val;
136: return -1;
137: }
138:
139: /*
140: * Number conversion routines
141: */
142:
143: octal(str)
144: char *str;
145: {
146: int num;
147:
148: (void) sscanf(str, "%o", &num);
149: return num;
150: }
151:
152: hex(str)
153: char *str;
154: {
155: int num;
156:
157: (void) sscanf(str+2, "%x", &num);
158: return num;
159: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.