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