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