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