%{ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include "emlookup.h" #include "subr.h" #include "error.h" #include "hall.h" #include "coerc.h" #include "extern.h" /* fileno is not C89 and can be missing sometimes. */ #ifdef __LINUX__ int fileno(FILE *stream); #endif int lineno=1; extern char *filename; #undef yywrap %} %% "/*" { char c; c = input(); if (c=='\n') lineno++; do { while (c!='*') { c = input(); if (c=='\n') lineno++; } c = input(); if (c=='\n') lineno++; } while (c!='/'); } ^\#(line)?[ \t]*[0-9]+[ \t]+\".*\".*$ { int ind,ind2; for (ind=0; yytext[ind] < '0' || yytext[ind]>'9'; ind++) ; lineno=atoi(&yytext[ind])-1; for(;yytext[ind]!='"';ind++) ; for(ind2=ind+1;yytext[ind2]!='"';ind2++) ; yytext[ind2]=0; if (strcmp(yytext+ind+1,filename)!=0) filename=mystrcpy(yytext+ind+1); } "==" return(CMPEQ); "!=" return(CMPNE); "<" return(CMPLT); "<=" return(CMPLE); ">" return(CMPGT); ">=" return(CMPGE); "||" return(OR2); "&&" return(AND2); "<<" return(LSHIFT); ">>" return(RSHIFT); "!" return(NOT); "~" return(COMP); ":ro" { yylval.yy_int = AD_RO; return(ADORNACCESS); } ":wo" { yylval.yy_int = AD_WO; return(ADORNACCESS); } ":rw" { yylval.yy_int = AD_RW; return(ADORNACCESS); } ":cc" { yylval.yy_int = AD_CC; return(ADORNCC); } \$[0-9]+ { yylval.yy_int = atoi(yytext+1); return(DOLLAR); } \%[0-9]+ { yylval.yy_int = atoi(yytext+1); return(PERCENT); } \%[a-z] { yylval.yy_int = yytext[1]-'a'; return(ALLREG); } [0-9]+|0x[0-9A-Fa-f]+ { yylval.yy_int = myatoi(yytext); return(NUMBER); } [_A-Za-z][_A-Za-z0-9]* { register symbol *sy_p; if (yyleng==3 && emhere && (yylval.yy_int=mlookup(yytext))!=0) { return(EMMNEM); } if ((sy_p=lookup(yytext,symkeyw,justlooking))!=0) return(sy_p->sy_value.syv_keywno); yylval.yy_str = mystrcpy(yytext); return(IDENT); } \%[_A-Za-z][_A-Za-z0-9]* { yylval.yy_str = mystrcpy(yytext+1); return(PERC_IDENT); } \"[^"\n]*\" { yytext[yyleng-1]=0; yylval.yy_str = mystrcpy(yytext+1); return(STRING); } [0-9][bf] { yytext[2]=0; yylval.yy_str = mystrcpy(yytext); return(STRING); } \n { lineno++; } [ \t]* ; . return(yytext[0]); %% int skipping=0; int yywrap() { if (skipping) fatal("EOF reached during error recovery"); return(1); } /* unput isn't technically legal in this section, so we need the * following definition to make it work. */ #define yytext_ptr yytext void skipupto(int tok, char *str) { int i; skipping=1; while (yylex()!=tok) ; for(i=strlen(str); i>0; i--) unput(str[i-1]); skipping=0; }