Blame


1 e37302c4 2004-04-21 devnull %token CHAR CCL NCCL STR DELIM SCON ITER NEWE NULLS
2 e37302c4 2004-04-21 devnull %left SCON '/' NEWE
3 e37302c4 2004-04-21 devnull %left '|'
4 e37302c4 2004-04-21 devnull %left '$' '^'
5 e37302c4 2004-04-21 devnull %left CHAR CCL NCCL '(' '.' STR NULLS
6 e37302c4 2004-04-21 devnull %left ITER
7 e37302c4 2004-04-21 devnull %left CAT
8 e37302c4 2004-04-21 devnull %left '*' '+' '?'
9 e37302c4 2004-04-21 devnull
10 e37302c4 2004-04-21 devnull %{
11 e37302c4 2004-04-21 devnull # include "ldefs.h"
12 e37302c4 2004-04-21 devnull #define YYSTYPE union _yystype_
13 e37302c4 2004-04-21 devnull union _yystype_
14 e37302c4 2004-04-21 devnull {
15 e37302c4 2004-04-21 devnull int i;
16 e37302c4 2004-04-21 devnull uchar *cp;
17 e37302c4 2004-04-21 devnull };
18 e37302c4 2004-04-21 devnull %}
19 e37302c4 2004-04-21 devnull %%
20 e37302c4 2004-04-21 devnull %{
21 e37302c4 2004-04-21 devnull int i;
22 e37302c4 2004-04-21 devnull int j,k;
23 e37302c4 2004-04-21 devnull int g;
24 e37302c4 2004-04-21 devnull uchar *p;
25 e37302c4 2004-04-21 devnull %}
26 e37302c4 2004-04-21 devnull acc : lexinput
27 e37302c4 2004-04-21 devnull ={
28 e37302c4 2004-04-21 devnull # ifdef DEBUG
29 e37302c4 2004-04-21 devnull if(debug) sect2dump();
30 e37302c4 2004-04-21 devnull # endif
31 e37302c4 2004-04-21 devnull }
32 e37302c4 2004-04-21 devnull ;
33 e37302c4 2004-04-21 devnull lexinput: defns delim prods end
34 e37302c4 2004-04-21 devnull | defns delim end
35 e37302c4 2004-04-21 devnull ={
36 e37302c4 2004-04-21 devnull if(!funcflag)phead2();
37 e37302c4 2004-04-21 devnull funcflag = TRUE;
38 e37302c4 2004-04-21 devnull }
39 e37302c4 2004-04-21 devnull | error
40 e37302c4 2004-04-21 devnull ={
41 e37302c4 2004-04-21 devnull # ifdef DEBUG
42 e37302c4 2004-04-21 devnull if(debug) {
43 e37302c4 2004-04-21 devnull sect1dump();
44 e37302c4 2004-04-21 devnull sect2dump();
45 e37302c4 2004-04-21 devnull }
46 e37302c4 2004-04-21 devnull # endif
47 e37302c4 2004-04-21 devnull }
48 e37302c4 2004-04-21 devnull ;
49 e37302c4 2004-04-21 devnull end: delim | ;
50 e37302c4 2004-04-21 devnull defns: defns STR STR
51 e37302c4 2004-04-21 devnull ={ strcpy((char*)dp,(char*)$2.cp);
52 e37302c4 2004-04-21 devnull def[dptr] = dp;
53 e37302c4 2004-04-21 devnull dp += strlen((char*)$2.cp) + 1;
54 e37302c4 2004-04-21 devnull strcpy((char*)dp,(char*)$3.cp);
55 e37302c4 2004-04-21 devnull subs[dptr++] = dp;
56 e37302c4 2004-04-21 devnull if(dptr >= DEFSIZE)
57 e37302c4 2004-04-21 devnull error("Too many definitions");
58 e37302c4 2004-04-21 devnull dp += strlen((char*)$3.cp) + 1;
59 e37302c4 2004-04-21 devnull if(dp >= dchar+DEFCHAR)
60 e37302c4 2004-04-21 devnull error("Definitions too long");
61 e37302c4 2004-04-21 devnull subs[dptr]=def[dptr]=0; /* for lookup - require ending null */
62 e37302c4 2004-04-21 devnull }
63 e37302c4 2004-04-21 devnull |
64 e37302c4 2004-04-21 devnull ;
65 e37302c4 2004-04-21 devnull delim: DELIM
66 e37302c4 2004-04-21 devnull ={
67 e37302c4 2004-04-21 devnull # ifdef DEBUG
68 e37302c4 2004-04-21 devnull if(sect == DEFSECTION && debug) sect1dump();
69 e37302c4 2004-04-21 devnull # endif
70 e37302c4 2004-04-21 devnull sect++;
71 e37302c4 2004-04-21 devnull }
72 e37302c4 2004-04-21 devnull ;
73 e37302c4 2004-04-21 devnull prods: prods pr
74 e37302c4 2004-04-21 devnull ={ $$.i = mn2(RNEWE,$1.i,$2.i);
75 e37302c4 2004-04-21 devnull }
76 e37302c4 2004-04-21 devnull | pr
77 e37302c4 2004-04-21 devnull ={ $$.i = $1.i;}
78 e37302c4 2004-04-21 devnull ;
79 e37302c4 2004-04-21 devnull pr: r NEWE
80 e37302c4 2004-04-21 devnull ={
81 e37302c4 2004-04-21 devnull if(divflg == TRUE)
82 e37302c4 2004-04-21 devnull i = mn1(S1FINAL,casecount);
83 e37302c4 2004-04-21 devnull else i = mn1(FINAL,casecount);
84 e37302c4 2004-04-21 devnull $$.i = mn2(RCAT,$1.i,i);
85 e37302c4 2004-04-21 devnull divflg = FALSE;
86 e37302c4 2004-04-21 devnull casecount++;
87 e37302c4 2004-04-21 devnull }
88 e37302c4 2004-04-21 devnull | error NEWE
89 e37302c4 2004-04-21 devnull ={
90 e37302c4 2004-04-21 devnull # ifdef DEBUG
91 e37302c4 2004-04-21 devnull if(debug) sect2dump();
92 e37302c4 2004-04-21 devnull # endif
93 e37302c4 2004-04-21 devnull }
94 e37302c4 2004-04-21 devnull r: CHAR
95 e37302c4 2004-04-21 devnull ={ $$.i = mn0($1.i); }
96 e37302c4 2004-04-21 devnull | STR
97 e37302c4 2004-04-21 devnull ={
98 e37302c4 2004-04-21 devnull p = $1.cp;
99 e37302c4 2004-04-21 devnull i = mn0(*p++);
100 e37302c4 2004-04-21 devnull while(*p)
101 e37302c4 2004-04-21 devnull i = mn2(RSTR,i,*p++);
102 e37302c4 2004-04-21 devnull $$.i = i;
103 e37302c4 2004-04-21 devnull }
104 e37302c4 2004-04-21 devnull | '.'
105 e37302c4 2004-04-21 devnull ={ symbol['\n'] = 0;
106 e37302c4 2004-04-21 devnull if(psave == FALSE){
107 e37302c4 2004-04-21 devnull p = ccptr;
108 e37302c4 2004-04-21 devnull psave = ccptr;
109 e37302c4 2004-04-21 devnull for(i=1;i<'\n';i++){
110 e37302c4 2004-04-21 devnull symbol[i] = 1;
111 e37302c4 2004-04-21 devnull *ccptr++ = i;
112 e37302c4 2004-04-21 devnull }
113 e37302c4 2004-04-21 devnull for(i='\n'+1;i<NCH;i++){
114 e37302c4 2004-04-21 devnull symbol[i] = 1;
115 e37302c4 2004-04-21 devnull *ccptr++ = i;
116 e37302c4 2004-04-21 devnull }
117 e37302c4 2004-04-21 devnull *ccptr++ = 0;
118 e37302c4 2004-04-21 devnull if(ccptr > ccl+CCLSIZE)
119 e37302c4 2004-04-21 devnull error("Too many large character classes");
120 e37302c4 2004-04-21 devnull }
121 e37302c4 2004-04-21 devnull else
122 e37302c4 2004-04-21 devnull p = psave;
123 0afb7989 2006-04-20 devnull $$.i = mnp(RCCL,p);
124 e37302c4 2004-04-21 devnull cclinter(1);
125 e37302c4 2004-04-21 devnull }
126 e37302c4 2004-04-21 devnull | CCL
127 0afb7989 2006-04-20 devnull ={ $$.i = mnp(RCCL,$1.cp); }
128 e37302c4 2004-04-21 devnull | NCCL
129 0afb7989 2006-04-20 devnull ={ $$.i = mnp(RNCCL,$1.cp); }
130 e37302c4 2004-04-21 devnull | r '*'
131 e37302c4 2004-04-21 devnull ={ $$.i = mn1(STAR,$1.i); }
132 e37302c4 2004-04-21 devnull | r '+'
133 e37302c4 2004-04-21 devnull ={ $$.i = mn1(PLUS,$1.i); }
134 e37302c4 2004-04-21 devnull | r '?'
135 e37302c4 2004-04-21 devnull ={ $$.i = mn1(QUEST,$1.i); }
136 e37302c4 2004-04-21 devnull | r '|' r
137 e37302c4 2004-04-21 devnull ={ $$.i = mn2(BAR,$1.i,$3.i); }
138 e37302c4 2004-04-21 devnull | r r %prec CAT
139 e37302c4 2004-04-21 devnull ={ $$.i = mn2(RCAT,$1.i,$2.i); }
140 e37302c4 2004-04-21 devnull | r '/' r
141 e37302c4 2004-04-21 devnull ={ if(!divflg){
142 e37302c4 2004-04-21 devnull j = mn1(S2FINAL,-casecount);
143 e37302c4 2004-04-21 devnull i = mn2(RCAT,$1.i,j);
144 e37302c4 2004-04-21 devnull $$.i = mn2(DIV,i,$3.i);
145 e37302c4 2004-04-21 devnull }
146 e37302c4 2004-04-21 devnull else {
147 e37302c4 2004-04-21 devnull $$.i = mn2(RCAT,$1.i,$3.i);
148 e37302c4 2004-04-21 devnull warning("Extra slash removed");
149 e37302c4 2004-04-21 devnull }
150 e37302c4 2004-04-21 devnull divflg = TRUE;
151 e37302c4 2004-04-21 devnull }
152 e37302c4 2004-04-21 devnull | r ITER ',' ITER '}'
153 e37302c4 2004-04-21 devnull ={ if($2.i > $4.i){
154 e37302c4 2004-04-21 devnull i = $2.i;
155 e37302c4 2004-04-21 devnull $2.i = $4.i;
156 e37302c4 2004-04-21 devnull $4.i = i;
157 e37302c4 2004-04-21 devnull }
158 e37302c4 2004-04-21 devnull if($4.i <= 0)
159 e37302c4 2004-04-21 devnull warning("Iteration range must be positive");
160 e37302c4 2004-04-21 devnull else {
161 e37302c4 2004-04-21 devnull j = $1.i;
162 e37302c4 2004-04-21 devnull for(k = 2; k<=$2.i;k++)
163 e37302c4 2004-04-21 devnull j = mn2(RCAT,j,dupl($1.i));
164 e37302c4 2004-04-21 devnull for(i = $2.i+1; i<=$4.i; i++){
165 e37302c4 2004-04-21 devnull g = dupl($1.i);
166 e37302c4 2004-04-21 devnull for(k=2;k<=i;k++)
167 e37302c4 2004-04-21 devnull g = mn2(RCAT,g,dupl($1.i));
168 e37302c4 2004-04-21 devnull j = mn2(BAR,j,g);
169 e37302c4 2004-04-21 devnull }
170 e37302c4 2004-04-21 devnull $$.i = j;
171 e37302c4 2004-04-21 devnull }
172 e37302c4 2004-04-21 devnull }
173 e37302c4 2004-04-21 devnull | r ITER '}'
174 e37302c4 2004-04-21 devnull ={
175 e37302c4 2004-04-21 devnull if($2.i < 0)warning("Can't have negative iteration");
176 e37302c4 2004-04-21 devnull else if($2.i == 0) $$.i = mn0(RNULLS);
177 e37302c4 2004-04-21 devnull else {
178 e37302c4 2004-04-21 devnull j = $1.i;
179 e37302c4 2004-04-21 devnull for(k=2;k<=$2.i;k++)
180 e37302c4 2004-04-21 devnull j = mn2(RCAT,j,dupl($1.i));
181 e37302c4 2004-04-21 devnull $$.i = j;
182 e37302c4 2004-04-21 devnull }
183 e37302c4 2004-04-21 devnull }
184 e37302c4 2004-04-21 devnull | r ITER ',' '}'
185 e37302c4 2004-04-21 devnull ={
186 e37302c4 2004-04-21 devnull /* from n to infinity */
187 e37302c4 2004-04-21 devnull if($2.i < 0)warning("Can't have negative iteration");
188 e37302c4 2004-04-21 devnull else if($2.i == 0) $$.i = mn1(STAR,$1.i);
189 e37302c4 2004-04-21 devnull else if($2.i == 1)$$.i = mn1(PLUS,$1.i);
190 e37302c4 2004-04-21 devnull else { /* >= 2 iterations minimum */
191 e37302c4 2004-04-21 devnull j = $1.i;
192 e37302c4 2004-04-21 devnull for(k=2;k<$2.i;k++)
193 e37302c4 2004-04-21 devnull j = mn2(RCAT,j,dupl($1.i));
194 e37302c4 2004-04-21 devnull k = mn1(PLUS,dupl($1.i));
195 e37302c4 2004-04-21 devnull $$.i = mn2(RCAT,j,k);
196 e37302c4 2004-04-21 devnull }
197 e37302c4 2004-04-21 devnull }
198 e37302c4 2004-04-21 devnull | SCON r
199 de1755b5 2011-08-02 rsc ={ $$.i = mn2(RSCON,$2.i,(uintptr)$1.cp); }
200 e37302c4 2004-04-21 devnull | '^' r
201 e37302c4 2004-04-21 devnull ={ $$.i = mn1(CARAT,$2.i); }
202 e37302c4 2004-04-21 devnull | r '$'
203 e37302c4 2004-04-21 devnull ={ i = mn0('\n');
204 e37302c4 2004-04-21 devnull if(!divflg){
205 e37302c4 2004-04-21 devnull j = mn1(S2FINAL,-casecount);
206 e37302c4 2004-04-21 devnull k = mn2(RCAT,$1.i,j);
207 e37302c4 2004-04-21 devnull $$.i = mn2(DIV,k,i);
208 e37302c4 2004-04-21 devnull }
209 e37302c4 2004-04-21 devnull else $$.i = mn2(RCAT,$1.i,i);
210 e37302c4 2004-04-21 devnull divflg = TRUE;
211 e37302c4 2004-04-21 devnull }
212 e37302c4 2004-04-21 devnull | '(' r ')'
213 e37302c4 2004-04-21 devnull ={ $$.i = $2.i; }
214 e37302c4 2004-04-21 devnull | NULLS
215 e37302c4 2004-04-21 devnull ={ $$.i = mn0(RNULLS); }
216 e37302c4 2004-04-21 devnull ;
217 e37302c4 2004-04-21 devnull %%
218 e37302c4 2004-04-21 devnull int
219 e37302c4 2004-04-21 devnull yylex(void)
220 e37302c4 2004-04-21 devnull {
221 e37302c4 2004-04-21 devnull uchar *p;
222 e37302c4 2004-04-21 devnull int c, i;
223 e37302c4 2004-04-21 devnull uchar *t, *xp;
224 e37302c4 2004-04-21 devnull int n, j, k, x;
225 e37302c4 2004-04-21 devnull static int sectbegin;
226 e37302c4 2004-04-21 devnull static uchar token[TOKENSIZE];
227 e37302c4 2004-04-21 devnull static int iter;
228 e37302c4 2004-04-21 devnull
229 e37302c4 2004-04-21 devnull # ifdef DEBUG
230 e37302c4 2004-04-21 devnull yylval.i = 0;
231 e37302c4 2004-04-21 devnull # endif
232 e37302c4 2004-04-21 devnull
233 e37302c4 2004-04-21 devnull if(sect == DEFSECTION) { /* definitions section */
234 e37302c4 2004-04-21 devnull while(!eof) {
235 e37302c4 2004-04-21 devnull if(prev == '\n'){ /* next char is at beginning of line */
236 e37302c4 2004-04-21 devnull getl(p=buf);
237 e37302c4 2004-04-21 devnull switch(*p){
238 e37302c4 2004-04-21 devnull case '%':
239 e37302c4 2004-04-21 devnull switch(*(p+1)){
240 e37302c4 2004-04-21 devnull case '%':
241 e37302c4 2004-04-21 devnull lgate();
242 e37302c4 2004-04-21 devnull Bprint(&fout,"#define YYNEWLINE %d\n",'\n');
243 eb43e9ba 2004-05-16 devnull Bprint(&fout,"int\nyylex(void){\nint nstr; extern int yyprevious;\nif(yyprevious){}\n");
244 e37302c4 2004-04-21 devnull sectbegin = TRUE;
245 e37302c4 2004-04-21 devnull i = treesize*(sizeof(*name)+sizeof(*left)+
246 e37302c4 2004-04-21 devnull sizeof(*right)+sizeof(*nullstr)+sizeof(*parent))+ALITTLEEXTRA;
247 e37302c4 2004-04-21 devnull p = myalloc(i,1);
248 e37302c4 2004-04-21 devnull if(p == 0)
249 e37302c4 2004-04-21 devnull error("Too little core for parse tree");
250 e37302c4 2004-04-21 devnull free(p);
251 e37302c4 2004-04-21 devnull name = myalloc(treesize,sizeof(*name));
252 e37302c4 2004-04-21 devnull left = myalloc(treesize,sizeof(*left));
253 e37302c4 2004-04-21 devnull right = myalloc(treesize,sizeof(*right));
254 e37302c4 2004-04-21 devnull nullstr = myalloc(treesize,sizeof(*nullstr));
255 e37302c4 2004-04-21 devnull parent = myalloc(treesize,sizeof(*parent));
256 0afb7989 2006-04-20 devnull ptr = myalloc(treesize,sizeof(*ptr));
257 0afb7989 2006-04-20 devnull if(name == 0 || left == 0 || right == 0 || parent == 0 || nullstr == 0 || ptr == 0)
258 e37302c4 2004-04-21 devnull error("Too little core for parse tree");
259 e37302c4 2004-04-21 devnull return(freturn(DELIM));
260 e37302c4 2004-04-21 devnull case 'p': case 'P': /* has overridden number of positions */
261 e37302c4 2004-04-21 devnull while(*p && !isdigit(*p))p++;
262 e37302c4 2004-04-21 devnull maxpos = atol((char*)p);
263 e37302c4 2004-04-21 devnull # ifdef DEBUG
264 e37302c4 2004-04-21 devnull if (debug) print("positions (%%p) now %d\n",maxpos);
265 e37302c4 2004-04-21 devnull # endif
266 e37302c4 2004-04-21 devnull if(report == 2)report = 1;
267 e37302c4 2004-04-21 devnull continue;
268 e37302c4 2004-04-21 devnull case 'n': case 'N': /* has overridden number of states */
269 e37302c4 2004-04-21 devnull while(*p && !isdigit(*p))p++;
270 e37302c4 2004-04-21 devnull nstates = atol((char*)p);
271 e37302c4 2004-04-21 devnull # ifdef DEBUG
272 e37302c4 2004-04-21 devnull if(debug)print( " no. states (%%n) now %d\n",nstates);
273 e37302c4 2004-04-21 devnull # endif
274 e37302c4 2004-04-21 devnull if(report == 2)report = 1;
275 e37302c4 2004-04-21 devnull continue;
276 e37302c4 2004-04-21 devnull case 'e': case 'E': /* has overridden number of tree nodes */
277 e37302c4 2004-04-21 devnull while(*p && !isdigit(*p))p++;
278 e37302c4 2004-04-21 devnull treesize = atol((char*)p);
279 e37302c4 2004-04-21 devnull # ifdef DEBUG
280 e37302c4 2004-04-21 devnull if (debug) print("treesize (%%e) now %d\n",treesize);
281 e37302c4 2004-04-21 devnull # endif
282 e37302c4 2004-04-21 devnull if(report == 2)report = 1;
283 e37302c4 2004-04-21 devnull continue;
284 e37302c4 2004-04-21 devnull case 'o': case 'O':
285 e37302c4 2004-04-21 devnull while (*p && !isdigit(*p))p++;
286 e37302c4 2004-04-21 devnull outsize = atol((char*)p);
287 e37302c4 2004-04-21 devnull if (report ==2) report=1;
288 e37302c4 2004-04-21 devnull continue;
289 e37302c4 2004-04-21 devnull case 'a': case 'A': /* has overridden number of transitions */
290 e37302c4 2004-04-21 devnull while(*p && !isdigit(*p))p++;
291 e37302c4 2004-04-21 devnull if(report == 2)report = 1;
292 e37302c4 2004-04-21 devnull ntrans = atol((char*)p);
293 e37302c4 2004-04-21 devnull # ifdef DEBUG
294 e37302c4 2004-04-21 devnull if (debug)print("N. trans (%%a) now %d\n",ntrans);
295 e37302c4 2004-04-21 devnull # endif
296 e37302c4 2004-04-21 devnull continue;
297 e37302c4 2004-04-21 devnull case 'k': case 'K': /* overriden packed char classes */
298 e37302c4 2004-04-21 devnull while (*p && !isdigit(*p))p++;
299 e37302c4 2004-04-21 devnull if (report==2) report=1;
300 e37302c4 2004-04-21 devnull free(pchar);
301 e37302c4 2004-04-21 devnull pchlen = atol((char*)p);
302 e37302c4 2004-04-21 devnull # ifdef DEBUG
303 e37302c4 2004-04-21 devnull if (debug) print( "Size classes (%%k) now %d\n",pchlen);
304 e37302c4 2004-04-21 devnull # endif
305 e37302c4 2004-04-21 devnull pchar=pcptr=myalloc(pchlen, sizeof(*pchar));
306 e37302c4 2004-04-21 devnull continue;
307 e37302c4 2004-04-21 devnull case '{':
308 e37302c4 2004-04-21 devnull lgate();
309 e37302c4 2004-04-21 devnull while(getl(p) && strcmp((char*)p,"%}") != 0)
310 e37302c4 2004-04-21 devnull Bprint(&fout, "%s\n",(char*)p);
311 e37302c4 2004-04-21 devnull if(p[0] == '%') continue;
312 e37302c4 2004-04-21 devnull error("Premature eof");
313 e37302c4 2004-04-21 devnull case 's': case 'S': /* start conditions */
314 e37302c4 2004-04-21 devnull lgate();
315 e37302c4 2004-04-21 devnull while(*p && strchr(" \t,", *p) == 0) p++;
316 e37302c4 2004-04-21 devnull n = TRUE;
317 e37302c4 2004-04-21 devnull while(n){
318 e37302c4 2004-04-21 devnull while(*p && strchr(" \t,", *p)) p++;
319 e37302c4 2004-04-21 devnull t = p;
320 e37302c4 2004-04-21 devnull while(*p && strchr(" \t,", *p) == 0)p++;
321 e37302c4 2004-04-21 devnull if(!*p) n = FALSE;
322 e37302c4 2004-04-21 devnull *p++ = 0;
323 e37302c4 2004-04-21 devnull if (*t == 0) continue;
324 e37302c4 2004-04-21 devnull i = sptr*2;
325 e37302c4 2004-04-21 devnull Bprint(&fout,"#define %s %d\n",(char*)t,i);
326 e37302c4 2004-04-21 devnull strcpy((char*)sp, (char*)t);
327 e37302c4 2004-04-21 devnull sname[sptr++] = sp;
328 e37302c4 2004-04-21 devnull sname[sptr] = 0; /* required by lookup */
329 e37302c4 2004-04-21 devnull if(sptr >= STARTSIZE)
330 e37302c4 2004-04-21 devnull error("Too many start conditions");
331 e37302c4 2004-04-21 devnull sp += strlen((char*)sp) + 1;
332 e37302c4 2004-04-21 devnull if(sp >= stchar+STARTCHAR)
333 e37302c4 2004-04-21 devnull error("Start conditions too long");
334 e37302c4 2004-04-21 devnull }
335 e37302c4 2004-04-21 devnull continue;
336 e37302c4 2004-04-21 devnull default:
337 e37302c4 2004-04-21 devnull warning("Invalid request %s",p);
338 e37302c4 2004-04-21 devnull continue;
339 e37302c4 2004-04-21 devnull } /* end of switch after seeing '%' */
340 e37302c4 2004-04-21 devnull case ' ': case '\t': /* must be code */
341 e37302c4 2004-04-21 devnull lgate();
342 e37302c4 2004-04-21 devnull Bprint(&fout, "%s\n",(char*)p);
343 e37302c4 2004-04-21 devnull continue;
344 e37302c4 2004-04-21 devnull default: /* definition */
345 e37302c4 2004-04-21 devnull while(*p && !isspace(*p)) p++;
346 e37302c4 2004-04-21 devnull if(*p == 0)
347 e37302c4 2004-04-21 devnull continue;
348 e37302c4 2004-04-21 devnull prev = *p;
349 e37302c4 2004-04-21 devnull *p = 0;
350 e37302c4 2004-04-21 devnull bptr = p+1;
351 e37302c4 2004-04-21 devnull yylval.cp = buf;
352 e37302c4 2004-04-21 devnull if(isdigit(buf[0]))
353 e37302c4 2004-04-21 devnull warning("Substitution strings may not begin with digits");
354 e37302c4 2004-04-21 devnull return(freturn(STR));
355 e37302c4 2004-04-21 devnull }
356 e37302c4 2004-04-21 devnull }
357 e37302c4 2004-04-21 devnull /* still sect 1, but prev != '\n' */
358 e37302c4 2004-04-21 devnull else {
359 e37302c4 2004-04-21 devnull p = bptr;
360 e37302c4 2004-04-21 devnull while(*p && isspace(*p)) p++;
361 e37302c4 2004-04-21 devnull if(*p == 0)
362 e37302c4 2004-04-21 devnull warning("No translation given - null string assumed");
363 e37302c4 2004-04-21 devnull strcpy((char*)token, (char*)p);
364 e37302c4 2004-04-21 devnull yylval.cp = token;
365 e37302c4 2004-04-21 devnull prev = '\n';
366 e37302c4 2004-04-21 devnull return(freturn(STR));
367 e37302c4 2004-04-21 devnull }
368 e37302c4 2004-04-21 devnull }
369 e37302c4 2004-04-21 devnull /* end of section one processing */
370 e37302c4 2004-04-21 devnull } else if(sect == RULESECTION){ /* rules and actions */
371 e37302c4 2004-04-21 devnull while(!eof){
372 e37302c4 2004-04-21 devnull switch(c=gch()){
373 e37302c4 2004-04-21 devnull case '\0':
374 e37302c4 2004-04-21 devnull return(freturn(0));
375 e37302c4 2004-04-21 devnull case '\n':
376 e37302c4 2004-04-21 devnull if(prev == '\n') continue;
377 e37302c4 2004-04-21 devnull x = NEWE;
378 e37302c4 2004-04-21 devnull break;
379 e37302c4 2004-04-21 devnull case ' ':
380 e37302c4 2004-04-21 devnull case '\t':
381 e37302c4 2004-04-21 devnull if(sectbegin == TRUE){
382 e37302c4 2004-04-21 devnull cpyact();
383 e37302c4 2004-04-21 devnull while((c=gch()) && c != '\n');
384 e37302c4 2004-04-21 devnull continue;
385 e37302c4 2004-04-21 devnull }
386 e37302c4 2004-04-21 devnull if(!funcflag)phead2();
387 e37302c4 2004-04-21 devnull funcflag = TRUE;
388 e37302c4 2004-04-21 devnull Bprint(&fout,"case %d:\n",casecount);
389 e37302c4 2004-04-21 devnull if(cpyact())
390 e37302c4 2004-04-21 devnull Bprint(&fout,"break;\n");
391 e37302c4 2004-04-21 devnull while((c=gch()) && c != '\n');
392 e37302c4 2004-04-21 devnull if(peek == ' ' || peek == '\t' || sectbegin == TRUE){
393 e37302c4 2004-04-21 devnull warning("Executable statements should occur right after %%");
394 e37302c4 2004-04-21 devnull continue;
395 e37302c4 2004-04-21 devnull }
396 e37302c4 2004-04-21 devnull x = NEWE;
397 e37302c4 2004-04-21 devnull break;
398 e37302c4 2004-04-21 devnull case '%':
399 e37302c4 2004-04-21 devnull if(prev != '\n') goto character;
400 e37302c4 2004-04-21 devnull if(peek == '{'){ /* included code */
401 e37302c4 2004-04-21 devnull getl(buf);
402 e37302c4 2004-04-21 devnull while(!eof && getl(buf) && strcmp("%}",(char*)buf) != 0)
403 e37302c4 2004-04-21 devnull Bprint(&fout,"%s\n",(char*)buf);
404 e37302c4 2004-04-21 devnull continue;
405 e37302c4 2004-04-21 devnull }
406 e37302c4 2004-04-21 devnull if(peek == '%'){
407 e37302c4 2004-04-21 devnull gch();
408 e37302c4 2004-04-21 devnull gch();
409 e37302c4 2004-04-21 devnull x = DELIM;
410 e37302c4 2004-04-21 devnull break;
411 e37302c4 2004-04-21 devnull }
412 e37302c4 2004-04-21 devnull goto character;
413 e37302c4 2004-04-21 devnull case '|':
414 e37302c4 2004-04-21 devnull if(peek == ' ' || peek == '\t' || peek == '\n'){
415 e37302c4 2004-04-21 devnull Bprint(&fout,"%d\n",30000+casecount++);
416 e37302c4 2004-04-21 devnull continue;
417 e37302c4 2004-04-21 devnull }
418 e37302c4 2004-04-21 devnull x = '|';
419 e37302c4 2004-04-21 devnull break;
420 e37302c4 2004-04-21 devnull case '$':
421 e37302c4 2004-04-21 devnull if(peek == '\n' || peek == ' ' || peek == '\t' || peek == '|' || peek == '/'){
422 e37302c4 2004-04-21 devnull x = c;
423 e37302c4 2004-04-21 devnull break;
424 e37302c4 2004-04-21 devnull }
425 e37302c4 2004-04-21 devnull goto character;
426 e37302c4 2004-04-21 devnull case '^':
427 e37302c4 2004-04-21 devnull if(prev != '\n' && scon != TRUE) goto character; /* valid only at line begin */
428 e37302c4 2004-04-21 devnull x = c;
429 e37302c4 2004-04-21 devnull break;
430 e37302c4 2004-04-21 devnull case '?':
431 e37302c4 2004-04-21 devnull case '+':
432 e37302c4 2004-04-21 devnull case '.':
433 e37302c4 2004-04-21 devnull case '*':
434 e37302c4 2004-04-21 devnull case '(':
435 e37302c4 2004-04-21 devnull case ')':
436 e37302c4 2004-04-21 devnull case ',':
437 e37302c4 2004-04-21 devnull case '/':
438 e37302c4 2004-04-21 devnull x = c;
439 e37302c4 2004-04-21 devnull break;
440 e37302c4 2004-04-21 devnull case '}':
441 e37302c4 2004-04-21 devnull iter = FALSE;
442 e37302c4 2004-04-21 devnull x = c;
443 e37302c4 2004-04-21 devnull break;
444 e37302c4 2004-04-21 devnull case '{': /* either iteration or definition */
445 e37302c4 2004-04-21 devnull if(isdigit(c=gch())){ /* iteration */
446 e37302c4 2004-04-21 devnull iter = TRUE;
447 e37302c4 2004-04-21 devnull ieval:
448 e37302c4 2004-04-21 devnull i = 0;
449 e37302c4 2004-04-21 devnull while(isdigit(c)){
450 e37302c4 2004-04-21 devnull token[i++] = c;
451 e37302c4 2004-04-21 devnull c = gch();
452 e37302c4 2004-04-21 devnull }
453 e37302c4 2004-04-21 devnull token[i] = 0;
454 e37302c4 2004-04-21 devnull yylval.i = atol((char*)token);
455 e37302c4 2004-04-21 devnull munputc(c);
456 e37302c4 2004-04-21 devnull x = ITER;
457 e37302c4 2004-04-21 devnull break;
458 e37302c4 2004-04-21 devnull } else { /* definition */
459 e37302c4 2004-04-21 devnull i = 0;
460 e37302c4 2004-04-21 devnull while(c && c!='}'){
461 e37302c4 2004-04-21 devnull token[i++] = c;
462 e37302c4 2004-04-21 devnull c = gch();
463 e37302c4 2004-04-21 devnull }
464 e37302c4 2004-04-21 devnull token[i] = 0;
465 e37302c4 2004-04-21 devnull i = lookup(token,def);
466 e37302c4 2004-04-21 devnull if(i < 0)
467 e37302c4 2004-04-21 devnull warning("Definition %s not found",token);
468 e37302c4 2004-04-21 devnull else
469 e37302c4 2004-04-21 devnull munputs(subs[i]);
470 e37302c4 2004-04-21 devnull continue;
471 e37302c4 2004-04-21 devnull }
472 e37302c4 2004-04-21 devnull case '<': /* start condition ? */
473 e37302c4 2004-04-21 devnull if(prev != '\n') /* not at line begin, not start */
474 e37302c4 2004-04-21 devnull goto character;
475 e37302c4 2004-04-21 devnull t = slptr;
476 e37302c4 2004-04-21 devnull do {
477 e37302c4 2004-04-21 devnull i = 0;
478 e37302c4 2004-04-21 devnull c = gch();
479 e37302c4 2004-04-21 devnull while(c != ',' && c && c != '>'){
480 e37302c4 2004-04-21 devnull token[i++] = c;
481 e37302c4 2004-04-21 devnull c = gch();
482 e37302c4 2004-04-21 devnull }
483 e37302c4 2004-04-21 devnull token[i] = 0;
484 e37302c4 2004-04-21 devnull if(i == 0)
485 e37302c4 2004-04-21 devnull goto character;
486 e37302c4 2004-04-21 devnull i = lookup(token,sname);
487 e37302c4 2004-04-21 devnull if(i < 0) {
488 e37302c4 2004-04-21 devnull warning("Undefined start condition %s",token);
489 e37302c4 2004-04-21 devnull continue;
490 e37302c4 2004-04-21 devnull }
491 e37302c4 2004-04-21 devnull *slptr++ = i+1;
492 e37302c4 2004-04-21 devnull } while(c && c != '>');
493 e37302c4 2004-04-21 devnull *slptr++ = 0;
494 e37302c4 2004-04-21 devnull /* check if previous value re-usable */
495 e37302c4 2004-04-21 devnull for (xp=slist; xp<t; ){
496 e37302c4 2004-04-21 devnull if (strcmp((char*)xp, (char*)t)==0)
497 e37302c4 2004-04-21 devnull break;
498 e37302c4 2004-04-21 devnull while (*xp++);
499 e37302c4 2004-04-21 devnull }
500 e37302c4 2004-04-21 devnull if (xp<t){
501 e37302c4 2004-04-21 devnull /* re-use previous pointer to string */
502 e37302c4 2004-04-21 devnull slptr=t;
503 e37302c4 2004-04-21 devnull t=xp;
504 e37302c4 2004-04-21 devnull }
505 e37302c4 2004-04-21 devnull if(slptr > slist+STARTSIZE) /* note not packed ! */
506 e37302c4 2004-04-21 devnull error("Too many start conditions used");
507 e37302c4 2004-04-21 devnull yylval.cp = t;
508 e37302c4 2004-04-21 devnull x = SCON;
509 e37302c4 2004-04-21 devnull break;
510 e37302c4 2004-04-21 devnull case '"':
511 e37302c4 2004-04-21 devnull i = 0;
512 e37302c4 2004-04-21 devnull while((c=gch()) && c != '"' && c != '\n'){
513 e37302c4 2004-04-21 devnull if(c == '\\') c = usescape(gch());
514 e37302c4 2004-04-21 devnull token[i++] = c;
515 e37302c4 2004-04-21 devnull if(i > TOKENSIZE){
516 e37302c4 2004-04-21 devnull warning("String too long");
517 e37302c4 2004-04-21 devnull i = TOKENSIZE-1;
518 e37302c4 2004-04-21 devnull break;
519 e37302c4 2004-04-21 devnull }
520 e37302c4 2004-04-21 devnull }
521 e37302c4 2004-04-21 devnull if(c == '\n') {
522 e37302c4 2004-04-21 devnull yyline--;
523 e37302c4 2004-04-21 devnull warning("Non-terminated string");
524 e37302c4 2004-04-21 devnull yyline++;
525 e37302c4 2004-04-21 devnull }
526 e37302c4 2004-04-21 devnull token[i] = 0;
527 e37302c4 2004-04-21 devnull if(i == 0)x = NULLS;
528 e37302c4 2004-04-21 devnull else if(i == 1){
529 e37302c4 2004-04-21 devnull yylval.i = token[0];
530 e37302c4 2004-04-21 devnull x = CHAR;
531 e37302c4 2004-04-21 devnull } else {
532 e37302c4 2004-04-21 devnull yylval.cp = token;
533 e37302c4 2004-04-21 devnull x = STR;
534 e37302c4 2004-04-21 devnull }
535 e37302c4 2004-04-21 devnull break;
536 e37302c4 2004-04-21 devnull case '[':
537 e37302c4 2004-04-21 devnull for(i=1;i<NCH;i++) symbol[i] = 0;
538 e37302c4 2004-04-21 devnull x = CCL;
539 e37302c4 2004-04-21 devnull if((c = gch()) == '^'){
540 e37302c4 2004-04-21 devnull x = NCCL;
541 e37302c4 2004-04-21 devnull c = gch();
542 e37302c4 2004-04-21 devnull }
543 e37302c4 2004-04-21 devnull while(c != ']' && c){
544 e37302c4 2004-04-21 devnull if(c == '\\') c = usescape(gch());
545 e37302c4 2004-04-21 devnull symbol[c] = 1;
546 e37302c4 2004-04-21 devnull j = c;
547 e37302c4 2004-04-21 devnull if((c=gch()) == '-' && peek != ']'){ /* range specified */
548 e37302c4 2004-04-21 devnull c = gch();
549 e37302c4 2004-04-21 devnull if(c == '\\') c = usescape(gch());
550 e37302c4 2004-04-21 devnull k = c;
551 e37302c4 2004-04-21 devnull if(j > k) {
552 e37302c4 2004-04-21 devnull n = j;
553 e37302c4 2004-04-21 devnull j = k;
554 e37302c4 2004-04-21 devnull k = n;
555 e37302c4 2004-04-21 devnull }
556 e37302c4 2004-04-21 devnull if(!(('A' <= j && k <= 'Z') ||
557 e37302c4 2004-04-21 devnull ('a' <= j && k <= 'z') ||
558 e37302c4 2004-04-21 devnull ('0' <= j && k <= '9')))
559 e37302c4 2004-04-21 devnull warning("Non-portable Character Class");
560 e37302c4 2004-04-21 devnull for(n=j+1;n<=k;n++)
561 e37302c4 2004-04-21 devnull symbol[n] = 1; /* implementation dependent */
562 e37302c4 2004-04-21 devnull c = gch();
563 e37302c4 2004-04-21 devnull }
564 e37302c4 2004-04-21 devnull }
565 e37302c4 2004-04-21 devnull /* try to pack ccl's */
566 e37302c4 2004-04-21 devnull i = 0;
567 e37302c4 2004-04-21 devnull for(j=0;j<NCH;j++)
568 e37302c4 2004-04-21 devnull if(symbol[j])token[i++] = j;
569 e37302c4 2004-04-21 devnull token[i] = 0;
570 e37302c4 2004-04-21 devnull p = ccl;
571 e37302c4 2004-04-21 devnull while(p <ccptr && strcmp((char*)token,(char*)p) != 0)p++;
572 e37302c4 2004-04-21 devnull if(p < ccptr) /* found it */
573 e37302c4 2004-04-21 devnull yylval.cp = p;
574 e37302c4 2004-04-21 devnull else {
575 e37302c4 2004-04-21 devnull yylval.cp = ccptr;
576 e37302c4 2004-04-21 devnull strcpy((char*)ccptr,(char*)token);
577 e37302c4 2004-04-21 devnull ccptr += strlen((char*)token) + 1;
578 e37302c4 2004-04-21 devnull if(ccptr >= ccl+CCLSIZE)
579 e37302c4 2004-04-21 devnull error("Too many large character classes");
580 e37302c4 2004-04-21 devnull }
581 e37302c4 2004-04-21 devnull cclinter(x==CCL);
582 e37302c4 2004-04-21 devnull break;
583 e37302c4 2004-04-21 devnull case '\\':
584 e37302c4 2004-04-21 devnull c = usescape(gch());
585 e37302c4 2004-04-21 devnull default:
586 e37302c4 2004-04-21 devnull character:
587 e37302c4 2004-04-21 devnull if(iter){ /* second part of an iteration */
588 e37302c4 2004-04-21 devnull iter = FALSE;
589 e37302c4 2004-04-21 devnull if('0' <= c && c <= '9')
590 e37302c4 2004-04-21 devnull goto ieval;
591 e37302c4 2004-04-21 devnull }
592 e37302c4 2004-04-21 devnull if(isalpha(peek)){
593 e37302c4 2004-04-21 devnull i = 0;
594 e37302c4 2004-04-21 devnull yylval.cp = token;
595 e37302c4 2004-04-21 devnull token[i++] = c;
596 e37302c4 2004-04-21 devnull while(isalpha(peek))
597 e37302c4 2004-04-21 devnull token[i++] = gch();
598 e37302c4 2004-04-21 devnull if(peek == '?' || peek == '*' || peek == '+')
599 e37302c4 2004-04-21 devnull munputc(token[--i]);
600 e37302c4 2004-04-21 devnull token[i] = 0;
601 e37302c4 2004-04-21 devnull if(i == 1){
602 e37302c4 2004-04-21 devnull yylval.i = token[0];
603 e37302c4 2004-04-21 devnull x = CHAR;
604 e37302c4 2004-04-21 devnull }
605 e37302c4 2004-04-21 devnull else x = STR;
606 e37302c4 2004-04-21 devnull } else {
607 e37302c4 2004-04-21 devnull yylval.i = c;
608 e37302c4 2004-04-21 devnull x = CHAR;
609 e37302c4 2004-04-21 devnull }
610 e37302c4 2004-04-21 devnull }
611 e37302c4 2004-04-21 devnull scon = FALSE;
612 e37302c4 2004-04-21 devnull if(x == SCON)scon = TRUE;
613 e37302c4 2004-04-21 devnull sectbegin = FALSE;
614 e37302c4 2004-04-21 devnull return(freturn(x));
615 e37302c4 2004-04-21 devnull }
616 e37302c4 2004-04-21 devnull }
617 e37302c4 2004-04-21 devnull /* section three */
618 e37302c4 2004-04-21 devnull ptail();
619 e37302c4 2004-04-21 devnull # ifdef DEBUG
620 e37302c4 2004-04-21 devnull if(debug)
621 e37302c4 2004-04-21 devnull Bprint(&fout,"\n/*this comes from section three - debug */\n");
622 e37302c4 2004-04-21 devnull # endif
623 e37302c4 2004-04-21 devnull while(getl(buf) && !eof)
624 e37302c4 2004-04-21 devnull Bprint(&fout,"%s\n",(char*)buf);
625 e37302c4 2004-04-21 devnull return(freturn(0));
626 e37302c4 2004-04-21 devnull }
627 e37302c4 2004-04-21 devnull /* end of yylex */
628 e37302c4 2004-04-21 devnull # ifdef DEBUG
629 e37302c4 2004-04-21 devnull int
630 e37302c4 2004-04-21 devnull freturn(int i)
631 e37302c4 2004-04-21 devnull {
632 e37302c4 2004-04-21 devnull if(yydebug) {
633 e37302c4 2004-04-21 devnull print("now return ");
634 e37302c4 2004-04-21 devnull if(i < NCH) allprint(i);
635 e37302c4 2004-04-21 devnull else print("%d",i);
636 e37302c4 2004-04-21 devnull printf(" yylval = ");
637 e37302c4 2004-04-21 devnull switch(i){
638 e37302c4 2004-04-21 devnull case STR: case CCL: case NCCL:
639 e37302c4 2004-04-21 devnull strpt(yylval.cp);
640 e37302c4 2004-04-21 devnull break;
641 e37302c4 2004-04-21 devnull case CHAR:
642 e37302c4 2004-04-21 devnull allprint(yylval.i);
643 e37302c4 2004-04-21 devnull break;
644 e37302c4 2004-04-21 devnull default:
645 e37302c4 2004-04-21 devnull print("%d",yylval.i);
646 e37302c4 2004-04-21 devnull break;
647 e37302c4 2004-04-21 devnull }
648 e37302c4 2004-04-21 devnull print("\n");
649 e37302c4 2004-04-21 devnull }
650 e37302c4 2004-04-21 devnull return(i);
651 e37302c4 2004-04-21 devnull }
652 e37302c4 2004-04-21 devnull # endif