110986Srrh %{
210986Srrh 
310986Srrh #ifndef lint
4*35273Sbostic static char sccsid[] = "@(#)lextab.l	4.2	(Berkeley)	07/22/88";
510986Srrh #endif not lint
610986Srrh 
710986Srrh #include "y.tab.h"
810986Srrh #include "b.h"
910986Srrh #undef	input
1010986Srrh #define input()	ninput()
1110986Srrh #undef	unput
1210986Srrh #define unput(c)	nunput(c)
13*35273Sbostic extern char *malloc();
1410986Srrh extern int yylval;
1510986Srrh #define xxbpmax	1700
1610986Srrh char xxbuf[xxbpmax + 2];
1710986Srrh int xxbp = -1;
1810986Srrh #define xxunmax	200
1910986Srrh char xxunbuf[xxunmax + 2];
2010986Srrh int xxunbp = -1;
2110986Srrh 
2210986Srrh 
2310986Srrh int blflag;
2410986Srrh %}
2510986Srrh 
2610986Srrh D	[0-9]
2710986Srrh A	[0-9a-z]
2810986Srrh L	[a-z]
2910986Srrh SP	[^0-9a-z]
3010986Srrh 
3110986Srrh %%
3210986Srrh 
3310986Srrh %{
3410986Srrh char *xxtbuff;
3510986Srrh int xxj, xxn, xxk;
3610986Srrh char *xxp;
3710986Srrh %}
3810986Srrh [=/,(]{D}+[h]			{
3910986Srrh 				blflag = 1;
4010986Srrh 				sscanf(&yytext[1],"%d",&xxn);
4110986Srrh 				xxtbuff = malloc(2*xxn+3);
4210986Srrh 				for (xxj = xxk = 1; xxj <= xxn; ++xxj)
4310986Srrh 					{
4410986Srrh 					xxtbuff[xxk] = ninput();
4510986Srrh 					if (xxtbuff[xxk] == '"')
4610986Srrh 						xxtbuff[++xxk] = '"';
4710986Srrh 					++xxk;
4810986Srrh 					}
4910986Srrh 				xxtbuff[0] = xxtbuff[xxk++] = '"';
5010986Srrh 				xxtbuff[xxk] = '\0';
5110986Srrh 				putback(xxtbuff);
5210986Srrh 				free(xxtbuff);
5310986Srrh 
5410986Srrh 				backup(yytext[0]);
5510986Srrh 				blflag = 0;
5610986Srrh 				xxbp = -1;
5710986Srrh 				}
5810986Srrh IF			{fixval(); xxbp = -1; return(xxif);}
5910986Srrh ELSE			{fixval(); xxbp = -1; return(xxelse);}
6010986Srrh REPEAT			{fixval(); xxbp = -1; return(xxrept); }
6110986Srrh WHILE			{fixval(); xxbp = -1; return(xxwhile); }
6210986Srrh UNTIL			{ fixval(); xxbp = -1; return(xxuntil); }
6310986Srrh DO			{fixval(); xxbp = -1; return(xxdo); }
6410986Srrh SWITCH			{fixval(); xxbp = -1; return(xxswitch); }
6510986Srrh CASE			{fixval(); xxbp = -1; return(xxcase); }
6610986Srrh DEFAULT			{fixval(); xxbp = -1; return(xxdefault); }
6710986Srrh END			{fixval(); xxbp = -1; return(xxend); }
6810986Srrh 
6910986Srrh ".true."		|
7010986Srrh ".false."		|
7110986Srrh 
7210986Srrh {L}{A}*		{fixval(); xxbp = -1; return(xxident); }
7310986Srrh ~{D}+			{xxbuf[0] = ' '; fixval(); xxbp = -1; return(xxnum); }
7410986Srrh {D}+/"."(ge|gt|le|lt|eq|ne|not|or|and)"."	|
7510986Srrh {D}+\.?			|
7610986Srrh {D}+\.?[de][+-]?{D}+		|
7710986Srrh {D}*\.{D}+[de][+-]?{D}+		|
7810986Srrh {D}*\.{D}+			{fixval(); xxbp = -1; return(xxnum); }
7910986Srrh 
8010986Srrh ".gt."			{ putback(">"); xxbp = -1; }
8110986Srrh ".ge."			{ putback(">=");xxbp = -1; }
8210986Srrh ".lt."			{ putback("<"); xxbp = -1; }
8310986Srrh ".le."			{ putback("<="); xxbp = -1; }
8410986Srrh ".eq."			{ putback("=="); xxbp = -1; }
8510986Srrh ".ne."			{ putback("!="); xxbp = -1; }
8610986Srrh ".not."			{ putback("!"); xxbp = -1; }
8710986Srrh ".or."			{ putback("||"); xxbp = -1; }
8810986Srrh ".and."			{ putback("&&"); xxbp = -1; }
8910986Srrh ">="		{fixval(); xxbp = -1;  return(xxge);  }
9010986Srrh "<="		{fixval(); xxbp = -1;  return(xxle); }
9110986Srrh ==			{fixval(); xxbp = -1; return(xxeq); }
9210986Srrh !=			{fixval(); xxbp = -1; return(xxne); }
9310986Srrh "||"			{fixval(); xxbp = -1; return('|'); }
9410986Srrh "&&"			{fixval(); xxbp = -1;  return('&'); }
9510986Srrh "**"			{fixval(); xxbp = -1; return('^'); }
9610986Srrh 
9710986Srrh #.*			{fixval(); xxbp = -1; return(xxcom); }
9810986Srrh \"([^"]|\"\")*\"		{fixval(); xxbp = -1; return(xxstring); }
9910986Srrh '([^']|'')*'				{
10010986Srrh 					fixval();
101*35273Sbostic 					xxp = (char *)yylval;
10210986Srrh 					xxn = slength(xxp);
10310986Srrh 					xxtbuff = malloc(2*xxn+1);
10410986Srrh 					xxtbuff[0] = '"';
10510986Srrh 					for (xxj = xxk = 1; xxj < xxn-1; ++xxj)
10610986Srrh 						{
10710986Srrh 						if (xxp[xxj] == '\'' && xxp[++xxj] == '\'')
10810986Srrh 							xxtbuff[xxk++] = '\'';
10910986Srrh 						else if (xxp[xxj] == '"')
11010986Srrh 							{
11110986Srrh 							xxtbuff[xxk++] = '"';
11210986Srrh 							xxtbuff[xxk++] = '"';
11310986Srrh 							}
11410986Srrh 						else
11510986Srrh 							xxtbuff[xxk++] = xxp[xxj];
11610986Srrh 						}
11710986Srrh 					xxtbuff[xxk++] = '"';
11810986Srrh 					xxtbuff[xxk] = '\0';
11910986Srrh 					free(xxp);
120*35273Sbostic 					yylval = (int)xxtbuff;
12110986Srrh 					xxbp = -1;
12210986Srrh 					return(xxstring);
12310986Srrh 					}
12410986Srrh 
12510986Srrh ^\n		xxbp = -1;
12610986Srrh \n		{xxbp = -1; if (newflag) {fixval(); return('\n'); }  }
12710986Srrh {SP}		{fixval(); xxbp = -1; return(yytext[0]); }
12810986Srrh 
12910986Srrh %%
13010986Srrh 
13110986Srrh rdchar()
13210986Srrh 	{
13310986Srrh 	int c;
13410986Srrh 	if (xxunbp >= 0)
13510986Srrh 		return(xxunbuf[xxunbp--]);
13610986Srrh 	c = getchar();
13710986Srrh 	if (c == EOF) return('\0');
13810986Srrh 	else return((char)c);
13910986Srrh 	}
14010986Srrh 
14110986Srrh backup(c)
14210986Srrh char c;
14310986Srrh 	{
14410986Srrh 	if (++xxunbp > xxunmax)
14510986Srrh 		{
14610986Srrh 		xxunbuf[xxunmax + 1] = '\0';
14710986Srrh 		error("RATFOR beautifying; input backed up too far during lex:\n",
14810986Srrh 			xxunbuf,"\n");
14910986Srrh 		}
15010986Srrh 	xxunbuf[xxunbp] = c;
15110986Srrh 	}
15210986Srrh 
15310986Srrh nunput(c)
15410986Srrh char c;
15510986Srrh 	{
15610986Srrh 	backup(c);
15710986Srrh 	if (xxbp < 0) return;
15810986Srrh 	if (c != xxbuf[xxbp])
15910986Srrh 		{
16010986Srrh 		xxbuf[xxbp + 1] = '\0';
16110986Srrh 		error("RATFOR beautifying; lex call of nunput with wrong char:\n",
16210986Srrh 			xxbuf,"\n");
16310986Srrh 		}
16410986Srrh 	for ( --xxbp; xxbp >= 0 && (xxbuf[xxbp] == ' ' || xxbuf[xxbp] == '\t'); --xxbp)
16510986Srrh 		backup(xxbuf[xxbp]);
16610986Srrh 	xxbuf[xxbp+1] = '\0';
16710986Srrh 	}
16810986Srrh 
16910986Srrh ninput()
17010986Srrh 	{
17110986Srrh 	char c,d;
17210986Srrh 	if (blflag) c = rdchar();
17310986Srrh 	else
17410986Srrh 		while ( (c = rdchar()) == ' ' || c == '\t')
17510986Srrh 		addbuf(c);
17610986Srrh 	if (c != '\n')
17710986Srrh 		return(addbuf(c));
17810986Srrh 	while ( (d = rdchar()) == ' ' || d == '\t');
17910986Srrh 	if (d == '&')
18010986Srrh 		return(ninput());
18110986Srrh 	backup(d);
18210986Srrh 	return(addbuf('\n'));
18310986Srrh 	}
18410986Srrh 
18510986Srrh addbuf(c)
18610986Srrh char c;
18710986Srrh 	{
18810986Srrh 	if (++xxbp > xxbpmax)
18910986Srrh 		{
19010986Srrh 		xxbuf[xxbpmax +1] = '\0';
19110986Srrh 		error("RATFOR beautifying; buffer xxbuf too small for token beginning:\n",
19210986Srrh 			xxbuf,"\n");
19310986Srrh 		}
19410986Srrh 	xxbuf[xxbp] = c;
19510986Srrh 	xxbuf[xxbp + 1] = '\0';
19610986Srrh 	return(c);
19710986Srrh 	}
19810986Srrh 
19910986Srrh 
20010986Srrh fixval()
20110986Srrh 	{
20210986Srrh 	int i, j, k;
20310986Srrh 	for (j = 0; xxbuf[j] == ' ' || xxbuf[j] == '\t'; ++j);
20410986Srrh 	for (k = j; xxbuf[k] != '\0'; ++k);
20510986Srrh 	for (--k; k > j && xxbuf[k] == ' ' || xxbuf[k]  == '\t'; --k);
20610986Srrh 	xxbuf[k+1] = '\0';
20710986Srrh 	i = slength(&xxbuf[j]) + 1;
20810986Srrh 	yylval = malloc(i);
20910986Srrh 	str_copy(&xxbuf[j],yylval,i);
21010986Srrh 	}
21110986Srrh 
21210986Srrh 
21310986Srrh 
21410986Srrh putback(str)
21510986Srrh char *str;
21610986Srrh 	{
21710986Srrh 	int i;
21810986Srrh 	for (i = 0; str[i] != '\0'; ++i);
21910986Srrh 	for (--i; i >= 0; --i)
22010986Srrh 		backup(str[i]);
22110986Srrh 	}
22210986Srrh 
223