|
|
1.1 root 1: %Start A str comment def sc br
2: %e 1300
3: %k 100
4: %a 1400
5: %o 1200
6: %p 3500
7: %n 600
8:
9: %{
10: #undef input
11: #undef unput
12: #include <stdio.h>
13: #include <ctype.h>
14: #include "pic.h"
15: #include "y.tab.h"
16:
17: extern double atof();
18: extern int dbg;
19: #define dprintf if(dbg)printf
20: extern int yylval;
21: extern struct symtab symtab[];
22: extern char *filename;
23: extern int synerr;
24: extern float lastfloat;
25:
26: #define CADD cbuf[clen++]=yytext[0]; if(clen>=CBUFLEN-1) {yyerror("string too long", cbuf); BEGIN A;}
27: #define CBUFLEN 150
28: char cbuf[CBUFLEN];
29: int clen, cflag;
30: %}
31:
32: A [a-zA-Z_]
33: B [a-zA-Z0-9_]
34: D [0-9]
35: WS [ \t]
36:
37: %%
38: switch (yybgin-yysvec-1) { /* witchcraft */
39: case 0:
40: BEGIN A;
41: break;
42: case sc:
43: BEGIN A;
44: return('}');
45: case br:
46: BEGIN A;
47: return(']');
48: }
49:
50: <A>{WS} ;
51: <A>"\\"\n ;
52: <A>\n { return(ST); }
53: <A>";" { return(ST); }
54: <A>"}" { BEGIN sc; return(ST); }
55: <A>"]" { BEGIN br; return(ST); }
56:
57: <A>^".".* { if (yytext[1] == 'P' && (yytext[2] == 'E' || yytext[2] == 'F')) {
58: yylval = yytext[2];
59: return(EOF);
60: } else {
61: yylval = tostring(yytext);
62: return(TROFF);
63: }
64: }
65:
66: <A>print return(yylval = PRINT);
67: <A>box return(yylval = BOX);
68: <A>circle return(yylval = CIRCLE);
69: <A>arc return(yylval = ARC);
70: <A>ellipse return(yylval = ELLIPSE);
71: <A>arrow return(yylval = ARROW);
72: <A>spline return(yylval = SPLINE);
73: <A>line return(yylval = LINE);
74: <A>move return(yylval = MOVE);
75: <A>"[]" return(yylval = BLOCK);
76:
77: <A>same return(SAME);
78: <A>between return(BETWEEN);
79: <A>and return(AND);
80:
81: <A>of ;
82: <A>the ;
83: <A>way ;
84:
85: <A>".e" { yylval = EAST; return(CORNER); }
86: <A>".east" { yylval = EAST; return(CORNER); }
87: <A>".r" { yylval = EAST; return(CORNER); }
88: <A>".right" { yylval = EAST; return(CORNER); }
89: <A>".w" { yylval = WEST; return(CORNER); }
90: <A>".west" { yylval = WEST; return(CORNER); }
91: <A>".l" { yylval = WEST; return(CORNER); }
92: <A>".left" { yylval = WEST; return(CORNER); }
93: <A>".n" { yylval = NORTH; return(CORNER); }
94: <A>".north" { yylval = NORTH; return(CORNER); }
95: <A>".t" { yylval = NORTH; return(CORNER); }
96: <A>".top" { yylval = NORTH; return(CORNER); }
97: <A>".s" { yylval = SOUTH; return(CORNER); }
98: <A>".south" { yylval = SOUTH; return(CORNER); }
99: <A>".b" { yylval = SOUTH; return(CORNER); }
100: <A>".bot" { yylval = SOUTH; return(CORNER); }
101: <A>".bottom" { yylval = SOUTH; return(CORNER); }
102: <A>".c" { yylval = CENTER; return(CORNER); }
103: <A>".center" { yylval = CENTER; return(CORNER); }
104: <A>".start" { yylval = START; return(CORNER); }
105: <A>".end" { yylval = END; return(CORNER); }
106: <A>".ne" { yylval = NE; return(CORNER); }
107: <A>"."upper" "*right { yylval = NE; return(CORNER); }
108: <A>".se" { yylval = SE; return(CORNER); }
109: <A>"."lower" "*right { yylval = SE; return(CORNER); }
110: <A>".nw" { yylval = NW; return(CORNER); }
111: <A>"."upper" "*left { yylval = NW; return(CORNER); }
112: <A>".sw" { yylval = SW; return(CORNER); }
113: <A>"."lower" "*left { yylval = SW; return(CORNER); }
114:
115: <A>top" "+of { yylval = NORTH; return(CORNER); }
116: <A>north" "+of { yylval = NORTH; return(CORNER); }
117: <A>bottom" "+of { yylval = SOUTH; return(CORNER); }
118: <A>south" "+of { yylval = SOUTH; return(CORNER); }
119: <A>left" "+of { yylval = WEST; return(CORNER); }
120: <A>west" "+of { yylval = WEST; return(CORNER); }
121: <A>right" "+of { yylval = EAST; return(CORNER); }
122: <A>east" "+of { yylval = EAST; return(CORNER); }
123: <A>center" "+of { yylval = CENTER; return(CORNER); }
124: <A>start" "+of { yylval = START; return(CORNER); }
125: <A>end" "+of { yylval = END; return(CORNER); }
126: <A>upper" "+right" "+of { yylval = NE; return(CORNER); }
127: <A>upper" "+left" "+of { yylval = NW; return(CORNER); }
128: <A>lower" "+right" "+of { yylval = SE; return(CORNER); }
129: <A>lower" "+left" "+of { yylval = SW; return(CORNER); }
130:
131: <A>height { yylval = HEIGHT; return(ATTR); }
132: <A>ht { yylval = HEIGHT; return(ATTR); }
133: <A>wid { yylval = WIDTH; return(ATTR); }
134: <A>width { yylval = WIDTH; return(ATTR); }
135: <A>rad { yylval = RADIUS; return(ATTR); }
136: <A>radius { yylval = RADIUS; return(ATTR); }
137: <A>diam { yylval = DIAMETER; return(ATTR); }
138: <A>diameter { yylval = DIAMETER; return(ATTR); }
139: <A>size { yylval = SIZE; return(ATTR); }
140: <A>left { yylval = LEFT; return(DIR); }
141: <A>right { yylval = RIGHT; return(DIR); }
142: <A>up { yylval = UP; return(DIR); }
143: <A>down { yylval = DOWN; return(DIR); }
144: <A>cw { yylval = CW; return(ATTR); }
145: <A>ccw { yylval = CCW; return(ATTR); }
146: <A>then { yylval = THEN; return(ATTR); }
147: <A>invis { yylval = INVIS; return(ATTR); }
148: <A>invisible { yylval = INVIS; return(ATTR); }
149: <A>dot return(yylval = DOT);
150: <A>dotted return(yylval = DOT);
151: <A>dash return(yylval = DASH);
152: <A>dashed return(yylval = DASH);
153: <A>chop return(yylval = CHOP);
154:
155: <A>spread return(yylval = SPREAD);
156: <A>fill return(yylval = FILL);
157: <A>ljust return(yylval = LJUST);
158: <A>rjust return(yylval = RJUST);
159: <A>above return(yylval = ABOVE);
160: <A>below return(yylval = BELOW);
161:
162: <A>"<-" { yylval = HEAD1; return(HEAD); }
163: <A>"->" { yylval = HEAD2; return(HEAD); }
164: <A>"<->" { yylval = HEAD12; return(HEAD); }
165:
166: <A>".x" return(yylval = DOTX);
167: <A>".y" return(yylval = DOTY);
168: <A>".ht" return(yylval = DOTHT);
169: <A>".height" return(yylval = DOTHT);
170: <A>".wid" return(yylval = DOTWID);
171: <A>".width" return(yylval = DOTWID);
172: <A>".rad" return(yylval = DOTRAD);
173: <A>".radius" return(yylval = DOTRAD);
174:
175: <A>from return(yylval = FROM);
176: <A>to return(yylval = TO);
177: <A>at return(yylval = AT);
178: <A>by return(yylval = BY);
179: <A>with return(yylval = WITH);
180: <A>last return(yylval = LAST);
181:
182: <A>Here return(yylval = HERE);
183: <A>define{WS}+ { BEGIN def; }
184: <def>{A}{B}* { yylval = definition(yytext); BEGIN A; return(TROFF); }
185:
186: <A>first { yylval = 1; return(NTH); }
187: <A>{D}+(th|nd|rd|st) { yylval = atoi(yytext); return(NTH); }
188: <A>({D}+("."?){D}*|"."{D}+)i? {
189: int i, inch;
190: inch = 0;
191: for (i = 0; i < yyleng; i++)
192: if (yytext[i] == '.' || yytext[i] == 'i') {
193: inch++;
194: break;
195: }
196: if (inch)
197: yylval = atof(yytext) * getvar("scale") + 0.5;
198: else
199: yylval = atoi(yytext);
200: lastfloat = atof(yytext);
201: return(NUMBER); }
202:
203: <A>{A}{B}* {
204: int c;
205: char buf[100];
206: struct symtab *p;
207: p = lookup(yytext);
208: if (p != NULL && p->s_type == DEFNAME) {
209: yylval = defuse(yytext, p);
210: return(TROFF);
211: } else if (islower(yytext[0])) {
212: yylval = (int) tostring(yytext);
213: return(VARNAME);
214: } else {
215: yylval = (int) tostring(yytext);
216: return(PLACENAME);
217: }
218: }
219:
220: <A>\" { BEGIN str; clen=0; }
221:
222: <A># { BEGIN comment; }
223: <comment>\n { BEGIN A; return(ST); }
224: <comment>. ;
225:
226: <A>. { yylval = yytext[0]; return(yytext[0]); }
227:
228: <str>\" { BEGIN A; cbuf[clen]=0; yylval = tostring(cbuf); return(TEXT); }
229: <str>\n { yyerror("newline in string"); BEGIN A; return(ST); }
230: <str>"\\\"" { cbuf[clen++]='"'; }
231: <str>"\\"t { cbuf[clen++]='\t'; }
232: <str>"\\\\" { cbuf[clen++]='\\'; }
233: <str>. { CADD; }
234:
235: %%
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.