1 %{
2 /* break out words, output cap + word(inverted) */
3 
4 #ifndef lint
5 static char sccsid[] = "@(#)style1.l	4.2	(Berkeley)	82/11/06";
6 #endif not lint
7 
8 #include <stdio.h>
9 #include <ctype.h>
10 #define OUT()	for(i=yyleng-1;i>=0; i--)putchar(yytext[i]); putchar('\n')
11 #define OUT1(nam)	printf("%c:%s\n",nam,yytext)
12 #define OUTN(string)	printf("%s\n",string)
13 #include "names.h"
14 #include "nhash.c"
15 #include "dict.c"
16 #include "ydict.c"
17 #include "abbrev.c"
18 char nt[]  = "D:n't";
19 char qs[]  = "c:'s";
20 char fin[]  = "E:.";
21 int NOCAPS = 0;		/* if set all caps are turned to lower case */
22 int i,j;
23 int dot = 0;
24 int first  = 1;
25 int qflg,nflg;
26 int cap  = 0;
27 %}
28 %p 3000
29 %a 3300
30 %o 4500
31 
32 L	[a-z]
33 N	[0-9]
34 C	[A-Z]
35 A	[a-zA-Z]
36 P	[a-zA-Z0-9]
37 
38 %%
39 ^[.!].+[\n]	{
40 	if(dot){
41 		OUTN(fin);
42 		dot = 0;
43 		first = 1;
44 	}
45 	printf(":%s",yytext);
46 	}
47 May	{
48 		if(first == 0){
49 			OUT1(NOUN);
50 		}
51 		else {
52 			first = 0;
53 			yytext[0] = tolower(yytext[0]);
54 			cap = 1;
55 			goto wd;
56 		}
57 	}
58 "U.S."		{
59 		OUT1(NOUN);
60 		}
61 {C}{L}*'[s]	{
62 		pos(1);
63 		if(first==1)first=0;
64 		}
65 {C}+['][s]	{
66 		if(NOCAPS)
67 			for(i=0;i<yyleng;i++)
68 				if(isupper(yytext[i]))yytext[i] = tolower(yytext[i]);
69 		OUT1(POS);
70 		}
71 {P}+([-]{P}+)+	{
72 		if(NOCAPS)
73 			for(i=0;i<yyleng;i++)
74 				if(isupper(yytext[i]))yytext[i] = tolower(yytext[i]);
75 		OUT1(NOUN_ADJ);
76 		}
77 {C}{C}+	{
78 		if(NOCAPS)
79 			for(i=0;i<yyleng;i++)
80 				yytext[i] = tolower(yytext[i]);
81 		if((i=input()) == 's'){
82 			yytext[yyleng++] = 's';
83 			yytext[yyleng] = '\0';
84 			OUT1(PNOUN);
85 		}
86 		else {
87 			unput(i);
88 			if(!NOCAPS)
89 				for(i=0;i<yyleng;i++)yytext[i] = tolower(yytext[i]);
90 				goto wd;
91 		}
92 		}
93 [LD][']{C}{L}*	{
94 		if(NOCAPS){
95 			yytext[0] = tolower(yytext[0]);
96 			yytext[2] = tolower(yytext[2]);
97 		}
98 		OUT1(NOUN_ADJ);
99 		}
100 {C}{L}*	{
101 		if(first==1)
102 			first=0;
103 		else cap = 1;
104 		if(yyleng==1 && yytext[0] == 'I'){
105 			cap = 0;
106 			goto wd;
107 		}
108 		yytext[0] = tolower(yytext[0]);
109 		goto wd;
110 	}
111 {N}":"{N}{N}	{
112 		OUT1(NOUN_ADJ);
113 		}
114 ({N}*[,])*({N}+".")+[ \t\n]+{C}	{
115 		for(i=yyleng-1;i>0;i--)
116 			if(yytext[i] == '.')break;
117 		unput(yytext[yyleng-1]);
118 		yytext[i] = '\0';
119 		OUT1(NOUN_ADJ);
120 		OUTN(fin);
121 		first = 1;
122 	}
123 ([hH]e"/"[sS]he)|([sS]he"/"[hH]e)		{
124 	if(NOCAPS)
125 		if(isupper(yytext[0]))yytext[0] = tolower(yytext[0]);
126 	OUT1(PRONS);
127 	}
128 ([hH]is"/"[hH]er)|([hH]er"/"[hH]is)	{
129 	if(NOCAPS)
130 		if(isupper(yytext[0]))yytext[0] = tolower(yytext[0]);
131 	OUT1(POS);
132 	}
133 [ \t`]*[a-zA-Z0-9.]*("\/"[a-zA-Z0-9.]+)+[']*	{
134 		if(yytext[yyleng-1] == '.'){
135 			if(ahead() == 0)dot=1;
136 		}
137 		if(NOCAPS)
138 			for(i=0;i<yyleng;i++)
139 				if(isupper(yytext[i]))yytext[i] = tolower(yytext[i]);
140 		OUT1(NOUN_ADJ);
141 		}
142 {N}+([,]{N}+)*("."{N}+)*[']*[s]*	{
143 	OUT1(NOUN_ADJ);
144 	}
145 {N}*([,]{N}+)*("."{N}+)+[']*[s]*	{
146 	OUT1(NOUN_ADJ);
147 	}
148 {N}+([,]{N}+)*("."{N}*)*[']*[s]*	{
149 	if(yytext[yyleng-1] == '.')dot=1;
150 	OUT1(NOUN_ADJ);
151 	}
152 ({A}*{N}+{A}*)+	{
153 	if(input() == '.')
154 		ahead();
155 	if(NOCAPS)
156 		for(i=0;i<yyleng;i++)
157 			if(isupper(yytext[i]))yytext[i]=tolower(yytext[i]);
158 	OUT1(NOUN_ADJ);
159 	}
160 {N}+[%]		{
161 		OUT1(NOUN_ADJ);
162 		}
163 "$"{N}+([,]{N}+)*("."{N}*)*	{
164 		if(yytext[yyleng-1] == '.')dot=1;
165 		OUT1(NOUN);
166 		}
167 [Aa]"."[ ]*[Mm]"."	{
168 		OUT1(ADJ_ADV);
169 		}
170 [Pp]"."[ ]*[Mm]"."	{
171 		OUT1(ADJ_ADV);
172 		}
173 "a."[ ]*"d."	{
174 		OUT1(ADJ_ADV);
175 		}
176 "b."[ ]*"c."	{
177 		OUT1(ADJ_ADV);
178 		}
179 "i."[ ]*"e."	{
180 		OUT1(PREP);
181 		}
182 "e."[ ]*"g."	{
183 		OUT1(PREP);
184 		}
185 "etc."[ \n]*[,)]*	{
186 		i = yytext[4];
187 		yytext[4] = '\0';
188 		OUT1(NOUN);
189 		yytext[4] = i;
190 		yytext[0] = yytext[yyleng-1];
191 		yytext[1] = '\0';
192 		if(yytext[0] == ',' || yytext[0] == ')')
193 			OUT1(',');
194 		else {
195 			OUTN(fin);
196 			first = 1;
197 		}
198 	}
199 "et al."	{
200 		OUT1(NOUN);
201 		}
202 in"."[ \n]*{C}	{
203 		unput(yytext[yyleng-1]);
204 		yytext[2] = '\0';
205 		OUT1(PREP);
206 		OUTN(fin);
207 		first = 1;
208 		}
209 Ph"."[ ]*[Dd]"."	{
210 		OUT1(ADJ);
211 		}
212 [A-Z]"."	{
213 		dot=1;
214 		OUT1(NOUN);
215 		}
216 can't		{
217 		yytext[3]='\0';
218 		yyleng -= 2;
219 		nflg=1;
220 		goto wd;
221 		}
222 won't		{
223 		OUT1('X');
224 		}
225 ain't		{
226 		OUT1('g');
227 		}
228 {L}+n't		{
229 		nflg=1;
230 		yytext[yyleng-3]='\0';
231 		yyleng -= 3;
232 		goto wd;
233 		}
234 [A-Z]{L}+n't	{
235 		yytext[0] = tolower(yytext[0]);
236 		nflg=1;
237 		yytext[yyleng-3]='\0';
238 		yyleng -= 3;
239 		goto wd;
240 		}
241 o'clock		{
242 		OUT1(ADV);
243 	}
244 {L}+'[s]	{
245 		pos(0);
246 		}
247 'll	{
248 		OUT1(lookup("will",1,0));
249 	}
250 've	{
251 		OUT1(lookup("have",1,0));
252 	}
253 're	{
254 		OUT1(lookup("are",1,0));
255 	}
256 'd	{
257 		OUT1(lookup("had",1,0));
258 	}
259 'm	{
260 		OUT1(lookup("am",1,0));
261 	}
262 'ld	{
263 		OUT1(lookup("would",1,0));
264 	}
265 {L}+	{
266 wd:
267 	if((j = lookup(yytext,1,0)) != 0){
268 		first=0;
269 		if(cap){
270 			if(!NOCAPS)
271 				yytext[0] = toupper(yytext[0]);
272 			cap = 0;
273 			if(dot)OUTN(fin);
274 		}
275 		dot=0;
276 		OUT1(j);
277 		if(nflg==1){
278 			nflg=0;
279 			OUTN(nt);
280 		}
281 	}
282 	else{
283 		first = dot=0;
284 		if(yytext[yyleng-1] == 'y' && cap == 0){
285 			switch(yytext[yyleng-2]){
286 			case 'c': look(cy,yyleng-2,NOUN);
287 					break;
288 			case 'f': look(fy,yyleng-2,VERB);
289 					break;
290 			case 'l': look(ly,yyleng-2,ADV);
291 					break;
292 			case 'g': if(yytext[yyleng-3] == 'o'){
293 					OUT1(NOUN);
294 					break;
295 				}
296 				look(gy,yyleng-2,ADJ);
297 				break;
298 			case 'r':	switch(yytext[yyleng-3]){
299 				case 'a': look(ary,yyleng-3,ADJ);
300 						break;
301 				case 'o': look(ory,yyleng-3,ADJ);
302 						break;
303 				case 'e': look(ery,yyleng-3,NOUN);
304 						break;
305 				default: look(ry,yyleng-2,NOUN);
306 				}
307 				break;
308 			case 't': if(yytext[yyleng-3] == 'i')look(ity,yyleng-3,NOUN);
309 				else look(ty,yyleng-2,ADJ);
310 				break;
311 			default: OUT();
312 			}
313 	}
314 		else {
315 			if(cap){
316 				if(!NOCAPS)yytext[0] = toupper(yytext[0]);
317 				cap = 0;
318 				OUT1(NOUN_ADJ);
319 			}
320 			else {
321 				OUT();
322 			}
323 		}
324 	}
325 	}
326 [\n]	;
327 [ ]+	;
328 [\t]+	;
329 ";"	{
330 	OUT1(';');
331 	first=1;
332 	}
333 (\"|`|')+	{
334 	if(dot){
335 		OUTN(fin);
336 		dot=0;
337 	}
338 	if(qflg==1){
339 		qflg=0;
340 		OUT1('"');
341 	}
342 	else {
343 		qflg=1;
344 		first=1;
345 		OUT1('"');
346 	}
347 	}
348 ".\""	{
349 	qflg=0;
350 	first=1;
351 	OUT1(END);
352 	}
353 "..."	{
354 	OUT1(',');
355 	}
356 "/."	{
357 	first = 1;
358 	OUT1(END);
359 	}
360 {A}{A}+"."	{
361 		yytext[yyleng-1] = '\0';
362 		if((j=abbrev(yytext,1,0)) != 0){
363 			if(isupper(yytext[0])){
364 				if(NOCAPS)yytext[0] = tolower(yytext[0]);
365 				if(first == 1)first=0;
366 			}
367 			yytext[yyleng-1] = '.';
368 			OUT1(j);
369 		}
370 		else {
371 			j = ahead();
372 			if(j == 0)
373 				yyleng--;
374 			for(i=0;i<yyleng;i++)
375 				if(isupper(yytext[i])){
376 					yytext[i] = tolower(yytext[i]);
377 					if(i == 0)cap = 1;
378 					else cap = 0;
379 				}
380 			if(j == 0)goto wd;
381 			OUT1(NOUN_ADJ);
382 		}
383 	}
384 "."	{
385 	first=1;
386 	OUT1(END);
387 	}
388 "!\""	{
389 	qflg=0;
390 	first=1;
391 	OUT1(END);
392 	}
393 "!"	{
394 	first=1;
395 	OUT1(END);
396 	}
397 "?\""	{
398 	qflg=0;
399 	first=1;
400 	OUT1(END);
401 	}
402 "?"	{
403 	first=1;
404 	OUT1(END);
405 	}
406 ":"	{
407 	OUT1(',');
408 	first=1;
409 	}
410 [-]+	{
411 	OUT1(',');
412 	first=1;
413 	}
414 ","	{
415 	OUT1(',');
416 	}
417 (\[|\(|\{|\]|\)|\})	{
418 	OUT1(',');
419 	}
420 .	{
421 /*	fprintf(stderr,"nwords funny char: %c\n",yytext[0])*/ ;
422 	}
423 %%
424 look(f,n,cc)
425 char (*f)();
426 int n;
427 char cc;
428 {
429 	int nn;
430 	char  save;
431 	save=yytext[n];
432 	yytext[n] = '\0';
433 	nn=(*f)(yytext,1,0);
434 	yytext[n] = save;
435 	if(nn != 0){
436 		OUT1(nn);
437 	}
438 	else {
439 		OUT1(cc);
440 	}
441 }
442 pos(flg){
443 	int ii,j;
444 	if(flg == 1)yytext[0] = tolower(yytext[0]);
445 	for(ii=yyleng-1;yytext[ii] != '\''; ii--);
446 	yytext[ii] = '\0';
447 	if((j=lookup(yytext,1,0)) != 0){
448 		yyleng = ii;
449 		OUT1(j);
450 		OUTN(qs);
451 	}
452 	else{
453 		if(flg==1 && !NOCAPS)yytext[0] = toupper(yytext[0]);
454 		yytext[ii] = '\'';
455 		OUT1(POS);
456 	}
457 }
458 char	*filename="-";
459 
460 main(argc,argv)
461 int	argc;
462 char	*argv[];
463 {
464 	register int rc=0;
465 	putchar(':'); putchar('\n');
466 	getd();
467 	getab();
468 	ygetd();
469 	if(argc<=1) {
470 		yylex();
471 		OUTN(fin);
472 	}else{
473 		while(argc>1) {
474 			if(freopen(argv[1],"r",stdin)==NULL) {
475 				fprintf(stderr,"%s: cannot open\n", argv[1]);
476 				rc++;
477 			}else{
478 				filename=argv[1];
479 				yylex();
480 				OUTN(fin);
481 			}
482 			argc--; argv++;
483 		}
484 	}
485 	return(rc);
486 }
487 ahead(){
488 	register int c;
489 	if(isalnum((c=input()))){
490 		yytext[yyleng++] = '.';
491 		while(!isspace((c=input() )))
492 			yytext[yyleng++] = c;
493 		yytext[yyleng] = '\0';
494 		unput(c);
495 		return(1);
496 	}
497 	unput(c);
498 	unput('.');
499 	return(0);
500 }
501