1 %{
2 /*-
3  * %sccs.include.proprietary.c%
4  */
5 
6 #ifndef lint
7 static char sccsid[] = "@(#)lextab.l	5.1 (Berkeley) 04/16/91";
8 #endif /* not lint */
9 
10 #include "y.tab.h"
11 #include "b.h"
12 
13 #undef YY_INPUT
14 #define YY_INPUT(buf,result,max_size)	\
15 	{				\
16 	int c = ninput();		\
17 	if ( c == EOF )			\
18 		result = YY_NULL;	\
19 	else				\
20 		{			\
21 		buf[0] = c;		\
22 		result = 1;		\
23 		}			\
24 	}
25 
26 extern int yylval;
27 #define xxbpmax	1700
28 char xxbuf[xxbpmax + 2];
29 int xxbp = -1;
30 #define xxunmax	200
31 char xxunbuf[xxunmax + 2];
32 int xxunbp = -1;
33 
34 
35 int blflag;
36 %}
37 
38 D	[0-9]
39 A	[0-9a-z]
40 L	[a-z]
41 SP	[^0-9a-z]
42 
43 %%
44 
45 %{
46 char *xxtbuff;
47 int xxj, xxn, xxk;
48 char *xxp;
49 %}
50 [=/,(]{D}+[h]			{
51 				blflag = 1;
52 				sscanf(&yytext[1],"%d",&xxn);
53 				xxtbuff = malloc(2*xxn+3);
54 				for (xxj = xxk = 1; xxj <= xxn; ++xxj)
55 					{
56 					xxtbuff[xxk] = input();
57 					if (xxtbuff[xxk] == '"')
58 						xxtbuff[++xxk] = '"';
59 					++xxk;
60 					}
61 				xxtbuff[0] = xxtbuff[xxk++] = '"';
62 				xxtbuff[xxk] = '\0';
63 				putback(xxtbuff);
64 				free(xxtbuff);
65 
66 				backup(yytext[0]);
67 				blflag = 0;
68 				xxbp = -1;
69 				}
70 IF			{fixval(); xxbp = -1; return(xxif);}
71 ELSE			{fixval(); xxbp = -1; return(xxelse);}
72 REPEAT			{fixval(); xxbp = -1; return(xxrept); }
73 WHILE			{fixval(); xxbp = -1; return(xxwhile); }
74 UNTIL			{ fixval(); xxbp = -1; return(xxuntil); }
75 DO			{fixval(); xxbp = -1; return(xxdo); }
76 SWITCH			{fixval(); xxbp = -1; return(xxswitch); }
77 CASE			{fixval(); xxbp = -1; return(xxcase); }
78 DEFAULT			{fixval(); xxbp = -1; return(xxdefault); }
79 END			{fixval(); xxbp = -1; return(xxend); }
80 
81 ".true."		|
82 ".false."		|
83 
84 {L}{A}*		{fixval(); xxbp = -1; return(xxident); }
85 ~{D}+			{xxbuf[0] = ' '; fixval(); xxbp = -1; return(xxnum); }
86 {D}+/"."(ge|gt|le|lt|eq|ne|not|or|and)"."	|
87 {D}+\.?			|
88 {D}+\.?[de][+-]?{D}+		|
89 {D}*\.{D}+[de][+-]?{D}+		|
90 {D}*\.{D}+			{fixval(); xxbp = -1; return(xxnum); }
91 
92 ".gt."			{ putback(">"); xxbp = -1; }
93 ".ge."			{ putback(">=");xxbp = -1; }
94 ".lt."			{ putback("<"); xxbp = -1; }
95 ".le."			{ putback("<="); xxbp = -1; }
96 ".eq."			{ putback("=="); xxbp = -1; }
97 ".ne."			{ putback("!="); xxbp = -1; }
98 ".not."			{ putback("!"); xxbp = -1; }
99 ".or."			{ putback("||"); xxbp = -1; }
100 ".and."			{ putback("&&"); xxbp = -1; }
101 ">="		{fixval(); xxbp = -1;  return(xxge);  }
102 "<="		{fixval(); xxbp = -1;  return(xxle); }
103 ==			{fixval(); xxbp = -1; return(xxeq); }
104 !=			{fixval(); xxbp = -1; return(xxne); }
105 "||"			{fixval(); xxbp = -1; return('|'); }
106 "&&"			{fixval(); xxbp = -1;  return('&'); }
107 "**"			{fixval(); xxbp = -1; return('^'); }
108 
109 #.*			{fixval(); xxbp = -1; return(xxcom); }
110 \"([^"]|\"\")*\"		{fixval(); xxbp = -1; return(xxstring); }
111 '([^']|'')*'				{
112 					fixval();
113 					xxp = (char *)yylval;
114 					xxn = slength(xxp);
115 					xxtbuff = malloc(2*xxn+1);
116 					xxtbuff[0] = '"';
117 					for (xxj = xxk = 1; xxj < xxn-1; ++xxj)
118 						{
119 						if (xxp[xxj] == '\'' && xxp[++xxj] == '\'')
120 							xxtbuff[xxk++] = '\'';
121 						else if (xxp[xxj] == '"')
122 							{
123 							xxtbuff[xxk++] = '"';
124 							xxtbuff[xxk++] = '"';
125 							}
126 						else
127 							xxtbuff[xxk++] = xxp[xxj];
128 						}
129 					xxtbuff[xxk++] = '"';
130 					xxtbuff[xxk] = '\0';
131 					free(xxp);
132 					yylval = (int)xxtbuff;
133 					xxbp = -1;
134 					return(xxstring);
135 					}
136 
137 ^\n		xxbp = -1;
138 \n		{xxbp = -1; if (newflag) {fixval(); return('\n'); }  }
139 {SP}		{fixval(); xxbp = -1; return(yytext[0]); }
140 
141 %%
142 
143 rdchar()
144 	{
145 	int c;
146 	if (xxunbp >= 0)
147 		return(xxunbuf[xxunbp--]);
148 	c = getchar();
149 	if (c == EOF) return('\0');
150 	else return((char)c);
151 	}
152 
153 backup(c)
154 char c;
155 	{
156 	if (++xxunbp > xxunmax)
157 		{
158 		xxunbuf[xxunmax + 1] = '\0';
159 		error("RATFOR beautifying; input backed up too far during lex:\n",
160 			xxunbuf,"\n");
161 		}
162 	xxunbuf[xxunbp] = c;
163 	}
164 
165 ninput()
166 	{
167 	char c,d;
168 	if (blflag) c = rdchar();
169 	else
170 		while ( (c = rdchar()) == ' ' || c == '\t')
171 		addbuf(c);
172 	if (c != '\n')
173 		return(addbuf(c));
174 	while ( (d = rdchar()) == ' ' || d == '\t');
175 	if (d == '&')
176 		return(ninput());
177 	backup(d);
178 	return(addbuf('\n'));
179 	}
180 
181 addbuf(c)
182 char c;
183 	{
184 	if (++xxbp > xxbpmax)
185 		{
186 		xxbuf[xxbpmax +1] = '\0';
187 		error("RATFOR beautifying; buffer xxbuf too small for token beginning:\n",
188 			xxbuf,"\n");
189 		}
190 	xxbuf[xxbp] = c;
191 	xxbuf[xxbp + 1] = '\0';
192 	return(c);
193 	}
194 
195 
196 fixval()
197 	{
198 	int i, j, k;
199 	for (j = 0; xxbuf[j] == ' ' || xxbuf[j] == '\t'; ++j);
200 	for (k = j; xxbuf[k] != '\0'; ++k);
201 	for (--k; k > j && xxbuf[k] == ' ' || xxbuf[k]  == '\t'; --k);
202 	xxbuf[k+1] = '\0';
203 	i = slength(&xxbuf[j]) + 1;
204 	yylval = malloc(i);
205 	str_copy(&xxbuf[j],yylval,i);
206 	}
207 
208 
209 
210 putback(str)
211 char *str;
212 	{
213 	int i;
214 	for (i = 0; str[i] != '\0'; ++i);
215 	for (--i; i >= 0; --i)
216 		backup(str[i]);
217 	}
218 
219