Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
%Start A str def thru sh
2
 
3
%{
4
#undef	input
5
#undef	unput
6
#include <stdio.h>
7
#include <stdlib.h>
8
#include <ctype.h>
9
#include "grap.h"
10
#include "y.tab.h"
11
 
12
extern	struct	symtab	symtab[];
13
 
14
int	yyback(int *, int);
15
int	yylook(void);
16
int	yywrap(void);
17
void	shell_init(void), shell_exec(void), shell_text(char *);
18
 
19
#define	CADD	cbuf[clen++] = yytext[0]; \
20
		if (clen >= CBUFLEN-1) { \
21
			ERROR "string too long", cbuf WARNING; BEGIN A; }
22
#define	CBUFLEN	1500
23
char	cbuf[CBUFLEN];
24
int	clen, cflag;
25
int	c, delim, shcnt;
26
%}
27
 
28
A	[a-zA-Z_]
29
B	[a-zA-Z0-9_]
30
D	[0-9]
31
WS	[ \t]
32
 
33
%%
34
	if (yybgin-yysvec-1 == 0) {	/* witchcraft */
35
		BEGIN A;
36
	}
37
 
38
<A>{WS}		;
39
<A>"\\"\n	;
40
<A>\n		return(ST);
41
<A>";"		return(ST);
42
 
43
<A>line		return(yylval.i = LINE);
44
<A>arrow	{ yylval.i = ARROW; return(LINE); }
45
<A>circle	return(yylval.i = CIRCLE);
46
<A>frame	return(FRAME);
47
<A>tick(s)?	return(TICKS);
48
<A>grid(line)?(s)?	return(GRID);
49
<A>coord(s)?	return(COORD);
50
<A>log		return(LOG);
51
<A>exp		return(EXP);
52
<A>sin		return(SIN);
53
<A>cos		return(COS);
54
<A>atan2	return(ATAN2);
55
<A>sqrt		return(SQRT);
56
<A>rand		return(RAND);
57
<A>max		return(MAX);
58
<A>min		return(MIN);
59
<A>int		return(INT);
60
<A>print	return(PRINT);
61
<A>sprintf	return(SPRINTF);
62
<A>pic{WS}.*	{ yylval.p = tostring(yytext+3); return(PIC); }
63
<A>graph{WS}.*	{ yylval.p = tostring(yytext+5); return(GRAPH); }
64
 
65
<A>for		return(FOR);
66
<A>^Endfor\n	{ endfor(); }
67
<A>do		{ yylval.p = delimstr("loop body"); BEGIN A; return(DOSTR); }
68
 
69
<A>copy|include	{ return(COPY); }
70
<A>thru|through	{ BEGIN thru; return(THRU); }
71
<thru>{WS}+	;
72
<thru>{A}{B}*|.	{ yylval.op = copythru(yytext); BEGIN A; return(DEFNAME); }
73
<A>until	return(UNTIL);
74
 
75
<A>if		return(IF);
76
<A>then		{ yylval.p = delimstr("then part"); BEGIN A; return(THEN); }
77
<A>else		{ yylval.p = delimstr("else part"); BEGIN A; return(ELSE); }
78
 
79
<A>next		return(NEXT);
80
<A>draw		return(yylval.i = DRAW);
81
<A>new		return(yylval.i = NEW);
82
<A>plot		return(yylval.i = PLOT);
83
<A>label(s)?	return(LABEL);
84
<A>x		return(X);
85
<A>y		return(Y);
86
 
87
<A>top		{ yylval.i = TOP; return SIDE; }
88
<A>bot(tom)?	{ yylval.i = BOT; return SIDE; }
89
<A>left		{ yylval.i = LEFT; return SIDE; }
90
<A>right	{ yylval.i = RIGHT; return SIDE; }
91
<A>up		return(yylval.i = UP);
92
<A>down		return(yylval.i = DOWN);
93
<A>across	return(yylval.i = ACROSS);
94
<A>height|ht	return(yylval.i = HEIGHT);
95
<A>wid(th)?	return(yylval.i = WIDTH);
96
<A>rad(ius)?	return(yylval.i = RADIUS);
97
<A>invis	return(yylval.i = INVIS);
98
<A>dot(ted)	return(yylval.i = DOT);
99
<A>dash(ed)	return(yylval.i = DASH);
100
<A>solid	return(yylval.i = SOLID);
101
 
102
<A>ljust	{ yylval.i = LJUST; return JUST; }
103
<A>rjust	{ yylval.i = RJUST; return JUST; }
104
<A>above	{ yylval.i = ABOVE; return JUST; }
105
<A>below	{ yylval.i = BELOW; return JUST; }
106
<A>size		return(yylval.i = SIZE);
107
 
108
<A>from		return(yylval.i = FROM);
109
<A>to		return(yylval.i = TO);
110
<A>by|step	return(yylval.i = BY);
111
<A>at		return(yylval.i = AT);
112
<A>with		return(yylval.i = WITH);
113
<A>in		return(yylval.i = IN);
114
<A>out		return(yylval.i = OUT);
115
<A>off		return(yylval.i = OFF);
116
 
117
<A>sh{WS}+ {	BEGIN sh;
118
		if ((delim = input()) == '{') {
119
			shcnt = 1;
120
			delim = '}';
121
		}
122
		shell_init();
123
	}
124
<sh>{A}{B}* {
125
		int c;
126
		Obj *p;
127
		if (yytext[0] == delim) {
128
			shell_exec();
129
			BEGIN A;
130
		} else {
131
			p = lookup(yytext, 0);
132
			if (p != NULL && p->type == DEFNAME) {
133
				c = input();
134
				unput(c);
135
				if (c == '(')
136
					dodef(p);
137
				else
138
					pbstr(p->val);
139
			} else
140
				shell_text(yytext);
141
		}
142
	}
143
<sh>"{"		{ shcnt++; shell_text(yytext); }
144
<sh>"}"		{ if (delim != '}' || --shcnt > 0)
145
			shell_text(yytext);
146
		  else {
147
			shell_exec();
148
			BEGIN A;
149
		  }
150
		}
151
<sh>.|\n	{ if (yytext[0] == delim) {
152
			shell_exec();
153
			BEGIN A;
154
		  } else
155
			shell_text(yytext);
156
		}
157
 
158
<A>define{WS}+	{ BEGIN def; }
159
<def>{A}{B}*	{ definition(yytext); BEGIN A; }
160
 
161
<A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?i? {
162
		  yylval.f = atof(yytext); return(NUMBER); }
163
 
164
<A>^"."[^0-9].*	{ if (yytext[1] == 'G' && yytext[2] == '2') {
165
			yylval.i = yytext[2];
166
			return(EOF);
167
		  } else {
168
			yylval.p = tostring(yytext);
169
			return(PIC);
170
		  }
171
		}
172
 
173
<A>{A}{B}* {
174
		int c;
175
		Obj *p;
176
		p = lookup(yytext, 1);
177
		if (p->type == DEFNAME) {
178
			c = input();
179
			unput(c);
180
			if (c == '(')	/* it's name(...) */
181
				dodef(p);
182
			else	/* no argument list */
183
				pbstr(p->val);
184
		} else {
185
			yylval.op = p;
186
			return p->type;	/* NAME or VARNAME */
187
		}
188
	}
189
 
190
<A>"=="		return(EQ);
191
<A>">="		return(GE);
192
<A>"<="		return(LE);
193
<A>"!="		return(NE);
194
<A>">"		return(GT);
195
<A>"<"		return(LT);
196
<A>"&&"		return(AND);
197
<A>"||"		return(OR);
198
<A>"!"		return(NOT);	
199
 
200
<A>\"		{ BEGIN str; clen = 0; }
201
 
202
<A>#.*		;
203
 
204
<A>.		{ yylval.i = yytext[0]; return(yytext[0]); }
205
 
206
<str>\"		{ BEGIN A; cbuf[clen] = 0;
207
		  yylval.p = tostring(cbuf); return(STRING); }
208
<str>\n		{ ERROR "newline in string" WARNING; BEGIN A; return(ST); }
209
<str>"\\\""	{ cbuf[clen++] = '\\'; cbuf[clen++] = '"'; }
210
<str>"\\\\"	{ cbuf[clen++] = '\\'; cbuf[clen++] = '\\'; }
211
<str>.		{ CADD; }
212
 
213
%%