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