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