Research V7 development
[unix-history] / usr / src / cmd / struct / lextab.l
CommitLineData
2a70a0a1
BB
1%{
2#include "y.tab.h"
3#include "b.h"
4#undef input
5#define input() ninput()
6#undef unput
7#define unput(c) nunput(c)
8extern int yylval;
9#define xxbpmax 1700
10char xxbuf[xxbpmax + 2];
11int xxbp = -1;
12#define xxunmax 200
13char xxunbuf[xxunmax + 2];
14int xxunbp = -1;
15
16
17int blflag;
18%}
19
20D [0-9]
21A [0-9a-z]
22L [a-z]
23SP [^0-9a-z]
24
25%%
26
27%{
28char *xxtbuff;
29int xxj, xxn, xxk;
30char *xxp;
31%}
32[=/,(]{D}+[h] {
33 blflag = 1;
34 sscanf(&yytext[1],"%d",&xxn);
35 xxtbuff = malloc(2*xxn+3);
36 for (xxj = xxk = 1; xxj <= xxn; ++xxj)
37 {
38 xxtbuff[xxk] = ninput();
39 if (xxtbuff[xxk] == '"')
40 xxtbuff[++xxk] = '"';
41 ++xxk;
42 }
43 xxtbuff[0] = xxtbuff[xxk++] = '"';
44 xxtbuff[xxk] = '\0';
45 putback(xxtbuff);
46 free(xxtbuff);
47
48 backup(yytext[0]);
49 blflag = 0;
50 xxbp = -1;
51 }
52IF {fixval(); xxbp = -1; return(xxif);}
53ELSE {fixval(); xxbp = -1; return(xxelse);}
54REPEAT {fixval(); xxbp = -1; return(xxrept); }
55WHILE {fixval(); xxbp = -1; return(xxwhile); }
56UNTIL { fixval(); xxbp = -1; return(xxuntil); }
57DO {fixval(); xxbp = -1; return(xxdo); }
58SWITCH {fixval(); xxbp = -1; return(xxswitch); }
59CASE {fixval(); xxbp = -1; return(xxcase); }
60DEFAULT {fixval(); xxbp = -1; return(xxdefault); }
61END {fixval(); xxbp = -1; return(xxend); }
62
63".true." |
64".false." |
65
66{L}{A}* {fixval(); xxbp = -1; return(xxident); }
67~{D}+ {xxbuf[0] = ' '; fixval(); xxbp = -1; return(xxnum); }
68{D}+/"."(ge|gt|le|lt|eq|ne|not|or|and)"." |
69{D}+\.? |
70{D}+\.?[de][+-]?{D}+ |
71{D}*\.{D}+[de][+-]?{D}+ |
72{D}*\.{D}+ {fixval(); xxbp = -1; return(xxnum); }
73
74".gt." { putback(">"); xxbp = -1; }
75".ge." { putback(">=");xxbp = -1; }
76".lt." { putback("<"); xxbp = -1; }
77".le." { putback("<="); xxbp = -1; }
78".eq." { putback("=="); xxbp = -1; }
79".ne." { putback("!="); xxbp = -1; }
80".not." { putback("!"); xxbp = -1; }
81".or." { putback("||"); xxbp = -1; }
82".and." { putback("&&"); xxbp = -1; }
83">=" {fixval(); xxbp = -1; return(xxge); }
84"<=" {fixval(); xxbp = -1; return(xxle); }
85== {fixval(); xxbp = -1; return(xxeq); }
86!= {fixval(); xxbp = -1; return(xxne); }
87"||" {fixval(); xxbp = -1; return('|'); }
88"&&" {fixval(); xxbp = -1; return('&'); }
89"**" {fixval(); xxbp = -1; return('^'); }
90
91#.* {fixval(); xxbp = -1; return(xxcom); }
92\"([^"]|\"\")*\" {fixval(); xxbp = -1; return(xxstring); }
93'([^']|'')*' {
94 fixval();
95 xxp = yylval;
96 xxn = slength(xxp);
97 xxtbuff = malloc(2*xxn+1);
98 xxtbuff[0] = '"';
99 for (xxj = xxk = 1; xxj < xxn-1; ++xxj)
100 {
101 if (xxp[xxj] == '\'' && xxp[++xxj] == '\'')
102 xxtbuff[xxk++] = '\'';
103 else if (xxp[xxj] == '"')
104 {
105 xxtbuff[xxk++] = '"';
106 xxtbuff[xxk++] = '"';
107 }
108 else
109 xxtbuff[xxk++] = xxp[xxj];
110 }
111 xxtbuff[xxk++] = '"';
112 xxtbuff[xxk] = '\0';
113 free(xxp);
114 yylval = xxtbuff;
115 xxbp = -1;
116 return(xxstring);
117 }
118
119^\n xxbp = -1;
120\n {xxbp = -1; if (newflag) {fixval(); return('\n'); } }
121{SP} {fixval(); xxbp = -1; return(yytext[0]); }
122
123%%
124
125rdchar()
126 {
127 int c;
128 if (xxunbp >= 0)
129 return(xxunbuf[xxunbp--]);
130 c = getchar();
131 if (c == EOF) return('\0');
132 else return((char)c);
133 }
134
135backup(c)
136char c;
137 {
138 if (++xxunbp > xxunmax)
139 {
140 xxunbuf[xxunmax + 1] = '\0';
141 error("RATFOR beautifying; input backed up too far during lex:\n",
142 xxunbuf,"\n");
143 }
144 xxunbuf[xxunbp] = c;
145 }
146
147nunput(c)
148char c;
149 {
150 backup(c);
151 if (xxbp < 0) return;
152 if (c != xxbuf[xxbp])
153 {
154 xxbuf[xxbp + 1] = '\0';
155 error("RATFOR beautifying; lex call of nunput with wrong char:\n",
156 xxbuf,"\n");
157 }
158 for ( --xxbp; xxbp >= 0 && (xxbuf[xxbp] == ' ' || xxbuf[xxbp] == '\t'); --xxbp)
159 backup(xxbuf[xxbp]);
160 xxbuf[xxbp+1] = '\0';
161 }
162
163ninput()
164 {
165 char c,d;
166 if (blflag) c = rdchar();
167 else
168 while ( (c = rdchar()) == ' ' || c == '\t')
169 addbuf(c);
170 if (c != '\n')
171 return(addbuf(c));
172 while ( (d = rdchar()) == ' ' || d == '\t');
173 if (d == '&')
174 return(ninput());
175 backup(d);
176 return(addbuf('\n'));
177 }
178
179addbuf(c)
180char c;
181 {
182 if (++xxbp > xxbpmax)
183 {
184 xxbuf[xxbpmax +1] = '\0';
185 error("RATFOR beautifying; buffer xxbuf too small for token beginning:\n",
186 xxbuf,"\n");
187 }
188 xxbuf[xxbp] = c;
189 xxbuf[xxbp + 1] = '\0';
190 return(c);
191 }
192
193
194fixval()
195 {
196 int i, j, k;
197 for (j = 0; xxbuf[j] == ' ' || xxbuf[j] == '\t'; ++j);
198 for (k = j; xxbuf[k] != '\0'; ++k);
199 for (--k; k > j && xxbuf[k] == ' ' || xxbuf[k] == '\t'; --k);
200 xxbuf[k+1] = '\0';
201 i = slength(&xxbuf[j]) + 1;
202 yylval = malloc(i);
203 str_copy(&xxbuf[j],yylval,i);
204 }
205
206
207
208putback(str)
209char *str;
210 {
211 int i;
212 for (i = 0; str[i] != '\0'; ++i);
213 for (--i; i >= 0; --i)
214 backup(str[i]);
215 }
216