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