Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
%Start A str def sc br thru sh
2
%e 1700
3
%k 120
4
%a 1800
5
%o 1500
6
%p 5000
7
%n 700
8
 
9
%{
10
#undef	input
11
#undef	unput
12
/* #include <stdio.h> lex puts one out for us */
13
#include <ctype.h>
14
#include <stdlib.h>
15
#include "pic.h"
16
#include "y.tab.h"
17
 
18
extern	char	*filename;
19
extern	struct	symtab	symtab[];
20
 
21
void	pbstr(char *);
22
void	dodef(struct symtab *stp);
23
void	undefine(char *s);
24
void	shell_init(void), shell_exec(void), shell_text(char *);
25
void	endfor(void);
26
 
27
int	yyback(int *, int);
28
int	yylook(void);
29
int	yywrap(void);
30
 
31
#define	CADD	cbuf[clen++]=yytext[0]; \
32
		if (clen>=CBUFLEN-1) { ERROR "string too long", cbuf WARNING; BEGIN A; }
33
#define	CBUFLEN	500
34
char	cbuf[CBUFLEN];
35
int	c, clen, cflag, delim;
36
int	ifsw	= 0;	/* 1 if if statement in progress */
37
%}
38
 
39
A	[a-zA-Z_]
40
B	[a-zA-Z0-9_]
41
D	[0-9]
42
WS	[ \t]
43
 
44
%%
45
	switch (yybgin-yysvec-1) {	/* witchcraft */
46
	case 0:
47
		BEGIN A;
48
		break;
49
	case sc:
50
		BEGIN A;
51
		return('}');
52
	case br:
53
		BEGIN A;
54
		return(']');
55
	}
56
 
57
<A>{WS}		;
58
<A>"\\"\n	;
59
<A>\n		{ return(ST); }
60
<A>";"		{ return(ST); }
61
<A>"}"		{ BEGIN sc; return(ST); }
62
<A>"]"		{ BEGIN br; return(ST); }
63
<A>"{"{WS}*(#.*)?\n+	{ return(yylval.i = yytext[0]); }
64
 
65
<A>^".PS".*	{ if (curfile == infile) ERROR ".PS found inside .PS/.PE" WARNING; }
66
<A>^".PE".*	{ if (curfile == infile) {
67
			yylval.p = PEstring = tostring(yytext);
68
			return(EOF);
69
		  }
70
		}
71
<A>^".".*	{ yylval.p = tostring(yytext); return(TROFF); }
72
 
73
<A>print	return(yylval.i = PRINT);
74
<A>box		return(yylval.i = BOX);
75
<A>circle	return(yylval.i = CIRCLE);
76
<A>arc		return(yylval.i = ARC);
77
<A>ellipse	return(yylval.i = ELLIPSE);
78
<A>arrow	return(yylval.i = ARROW);
79
<A>spline	return(yylval.i = SPLINE);
80
<A>line		return(yylval.i = LINE);
81
<A>move		return(yylval.i = MOVE);
82
<A>"[]"		return(yylval.i = BLOCK);
83
<A>reset	return(RESET);
84
<A>sprintf	return(SPRINTF);
85
 
86
<A>same		return(SAME);
87
<A>between	return(BETWEEN);
88
<A>and		return(AND);
89
 
90
<A>of		;
91
<A>the		;
92
<A>way		;
93
 
94
<A>"."(e|east)		{ yylval.i = EAST; return(CORNER); }
95
<A>"."(r|right)		{ yylval.i = EAST; return(CORNER); }
96
<A>"."(w|west)		{ yylval.i = WEST; return(CORNER); }
97
<A>"."(l|left)		{ yylval.i = WEST; return(CORNER); }
98
<A>"."(n|north)		{ yylval.i = NORTH; return(CORNER); }
99
<A>"."(t|top)		{ yylval.i = NORTH; return(CORNER); }
100
<A>"."(s|south)		{ yylval.i = SOUTH; return(CORNER); }
101
<A>"."(b|bot|bottom)	{ yylval.i = SOUTH; return(CORNER); }
102
<A>"."(c|center)	{ yylval.i = CENTER; return(CORNER); }
103
<A>".start"		{ yylval.i = START; return(CORNER); }
104
<A>".end"		{ yylval.i = END; return(CORNER); }
105
<A>".ne"		{ yylval.i = NE; return(CORNER); }
106
<A>".se"		{ yylval.i = SE; return(CORNER); }
107
<A>".nw"		{ yylval.i = NW; return(CORNER); }
108
<A>".sw"		{ yylval.i = SW; return(CORNER); }
109
 
110
<A>top" "+of		{ yylval.i = NORTH; return(CORNER); }
111
<A>north" "+of		{ yylval.i = NORTH; return(CORNER); }
112
<A>bottom" "+of		{ yylval.i = SOUTH; return(CORNER); }
113
<A>south" "+of		{ yylval.i = SOUTH; return(CORNER); }
114
<A>left" "+of		{ yylval.i = WEST; return(CORNER); }
115
<A>west" "+of		{ yylval.i = WEST; return(CORNER); }
116
<A>right" "+of		{ yylval.i = EAST; return(CORNER); }
117
<A>east" "+of		{ yylval.i = EAST; return(CORNER); }
118
<A>center" "+of		{ yylval.i = CENTER; return(CORNER); }
119
<A>start" "+of		{ yylval.i = START; return(CORNER); }
120
<A>end" "+of		{ yylval.i = END; return(CORNER); }
121
 
122
<A>height|ht	{ yylval.i = HEIGHT; return(ATTR); }
123
<A>width|wid	{ yylval.i = WIDTH; return(ATTR); }
124
<A>radius|rad	{ yylval.i = RADIUS; return(ATTR); }
125
<A>diameter|diam { yylval.i = DIAMETER; return(ATTR); }
126
<A>size		{ yylval.i = SIZE; return(ATTR); }
127
<A>left		{ yylval.i = LEFT; return(DIR); }
128
<A>right	{ yylval.i = RIGHT; return(DIR); }
129
<A>up		{ yylval.i = UP; return(DIR); }
130
<A>down		{ yylval.i = DOWN; return(DIR); }
131
<A>cw		{ yylval.i = CW; return(ATTR); }
132
<A>clockwise	{ yylval.i = CW; return(ATTR); }
133
<A>ccw		{ yylval.i = CCW; return(ATTR); }
134
<A>invis(ible)?	{ yylval.i = INVIS; return(ATTR); }
135
<A>noedge	{ yylval.i = INVIS; return ATTR; }
136
<A>fill		return(yylval.i = FILL);
137
<A>solid	;
138
<A>dot(ted)?	return(yylval.i = DOT);
139
<A>dash(ed)?	return(yylval.i = DASH);
140
<A>chop		return(yylval.i = CHOP);
141
 
142
<A>spread	{ yylval.i = SPREAD; return TEXTATTR; }
143
<A>ljust	{ yylval.i = LJUST; return TEXTATTR; }
144
<A>rjust	{ yylval.i = RJUST; return TEXTATTR; }
145
<A>above	{ yylval.i = ABOVE; return TEXTATTR; }
146
<A>below	{ yylval.i = BELOW; return TEXTATTR; }
147
<A>center	{ yylval.i = CENTER; return TEXTATTR; }
148
 
149
<A>"<-"		{ yylval.i = HEAD1; return(HEAD); }
150
<A>"->"		{ yylval.i = HEAD2; return(HEAD); }
151
<A>"<->"	{ yylval.i = HEAD12; return(HEAD); }
152
 
153
<A>".x"			return(yylval.i = DOTX);
154
<A>".y"			return(yylval.i = DOTY);
155
<A>"."(ht|height)	return(yylval.i = DOTHT);
156
<A>"."(wid|width)	return(yylval.i = DOTWID);
157
<A>"."(rad|radius)	return(yylval.i = DOTRAD);
158
 
159
<A>from		return(yylval.i = FROM);
160
<A>to		return(yylval.i = TO);
161
<A>at		return(yylval.i = AT);
162
<A>by		return(yylval.i = BY);
163
<A>with		return(yylval.i = WITH);
164
<A>last		return(yylval.i = LAST);
165
 
166
<A>log		return(LOG);
167
<A>exp		return(EXP);
168
<A>sin		return(SIN);
169
<A>cos		return(COS);
170
<A>atan2	return(ATAN2);
171
<A>sqrt		return(SQRT);
172
<A>rand		return(RAND);
173
<A>max		return(MAX);
174
<A>min		return(MIN);
175
<A>int		return(INT);
176
 
177
<A>"=="		return(EQ);
178
<A>">="		return(GE);
179
<A>"<="		return(LE);
180
<A>"!="		return(NEQ);
181
<A>">"		return(GT);
182
<A>"<"		return(LT);
183
<A>"&&"		return(ANDAND);
184
<A>"||"		return(OROR);
185
<A>"!"		return(NOT);	
186
 
187
<A>Here		return(yylval.i = HERE);
188
 
189
<A>for		return(FOR);
190
<A>^Endfor\n	{ endfor(); }
191
<A>do		{ yylval.p = delimstr("loop body"); return(DOSTR); }
192
 
193
<A>copy|include		return(COPY);
194
<A>(thru|through){WS}+	{ BEGIN thru; return(THRU); }
195
<thru>{A}{B}*|.		{ yylval.st = copythru(yytext); BEGIN A; return(DEFNAME); }
196
<A>until		return(UNTIL);
197
 
198
<A>if		{ ifsw = 1; return(IF); }
199
<A>then		{ if (!ifsw) { yylval.i = THEN; return(ATTR); }
200
		  yylval.p = delimstr("then part"); ifsw = 0;
201
		  return(THENSTR); }
202
<A>else		{ yylval.p = delimstr("else part"); return(ELSESTR); }
203
 
204
<A>sh{WS}+	{ BEGIN sh;
205
		  if ((delim = input()) == '{') delim = '}';	/* no nested {} */
206
		  shell_init(); }
207
<sh>{A}{B}*	{ struct symtab *p;
208
		  if (yytext[0] == delim) {
209
			shell_exec();
210
			BEGIN A;
211
		  } else {
212
			p = lookup(yytext);
213
			if (p != NULL && p->s_type == DEFNAME) {
214
				c = input();
215
				unput(c);
216
				if (c == '(')
217
					dodef(p);
218
				else
219
					pbstr(p->s_val.p);
220
			} else
221
				shell_text(yytext);
222
		  }
223
		}
224
<sh>.|\n	{ if (yytext[0] == delim) {
225
			shell_exec();
226
			BEGIN A;
227
		  } else
228
			shell_text(yytext);
229
		}
230
 
231
<A>define{WS}+		{ BEGIN def; }
232
<def>{A}{B}*		{ definition(yytext); BEGIN A; }
233
<A>undef(ine)?{WS}+{A}{B}*	{ undefine(yytext); }
234
 
235
<A>first		{ yylval.i = 1; return(NTH); }
236
<A>{D}+(th|nd|rd|st)	{ yylval.i = atoi(yytext); return(NTH); }
237
<A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?i? {
238
		  	yylval.f = atof(yytext); return(NUMBER); }
239
 
240
<A>{A}{B}* {	struct symtab *p;
241
		p = lookup(yytext);
242
		if (p != NULL && p->s_type == DEFNAME) {
243
			c = input();
244
			unput(c);
245
			if (c == '(')	/* it's name(...) */
246
				dodef(p);
247
			else {	/* no argument list */
248
				pbstr(p->s_val.p);
249
				dprintf("pushing back `%s'\n", p->s_val.p);
250
			}
251
		} else if (islower(yytext[0])) {
252
			yylval.p = tostring(yytext);
253
			return(VARNAME);
254
		} else {
255
			yylval.p = tostring(yytext);
256
			return(PLACENAME);
257
		}
258
	}
259
 
260
<A>\"		{ BEGIN str; clen=0; }
261
<str>\"		{ cbuf[clen]=0; yylval.p = tostring(cbuf); BEGIN A; return(TEXT); }
262
<str>\n		{ cbuf[clen]=0; ERROR "missing quote in string \"%s\"", cbuf WARNING;
263
				BEGIN A; return(ST); }
264
<str>"\\\""	{ cbuf[clen++]='"'; }
265
<str>"\\"t	{ cbuf[clen++]='\t'; }
266
<str>"\\\\"	{ cbuf[clen++]='\\'; }
267
<str>.		{ CADD; }
268
 
269
<A>#.*		;
270
 
271
<A>.		return(yylval.i = yytext[0]);
272
 
273
%%