/* ignore character case */ a [aA] b [bB] c [cC] d [dD] e [eE] f [fF] g [gG] h [hH] i [iI] j [jJ] k [kK] l [lL] m [mM] n [nN] o [oO] p [pP] q [qQ] r [rR] s [sS] t [tT] u [uU] v [vV] w [wW] x [xX] y [yY] z [zZ] %{ /* hash table functions, imported from table.c */ extern int hash_lookup(); extern int put_string(); int yyline=1, yycolumn=1; %} %% ";" {yycolumn+=yyleng; return(SEMInumber); } ":"/[^=] {yycolumn+=yyleng; return(COLONnumber); } "," {yycolumn+=yyleng; return(COMMAnumber); } "."/[^.] {yycolumn+=yyleng; return(DOTnumber); } "("/[^*] {yycolumn+=yyleng; return(LPARENnumber); } ")" {yycolumn+=yyleng; return(RPARENnumber); } "<"/[^=>] {yycolumn+=yyleng; return(LTnumber); } ">"/[^=] {yycolumn+=yyleng; return(GTnumber); } "=" {yycolumn+=yyleng; return(EQnumber); } "-" {yycolumn+=yyleng; return(MINUSnumber); } "+" {yycolumn+=yyleng; return(PLUSnumber); } "*" {yycolumn+=yyleng; return(TIMESnumber); } ".." {yycolumn+=yyleng; return(DOTDOTnumber); } ":=" {yycolumn+=yyleng; return(COLEQnumber); } "<=" {yycolumn+=yyleng; return(LEnumber); } ">=" {yycolumn+=yyleng; return(GEnumber); } "<>" {yycolumn+=yyleng; return(NEnumber); } {a}{n}{d} {yycolumn+=yyleng; return(ANDnumber); } {a}{r}{r}{a}{y} {yycolumn+=yyleng; return(ARRAYnumber); } {b}{e}{g}{i}{n} {yycolumn+=yyleng; return(BEGINnumber); } {c}{o}{n}{s}{t}{a}{n}{t} {yycolumn+=yyleng; return(CONSTnumber); } {d}{i}{v} {yycolumn+=yyleng; return(DIVIDEnumber); } {d}{o}{w}{n}{t}{o} {yycolumn+=yyleng; return(DOWNTOnumber); } {e}{l}{s}{e} {yycolumn+=yyleng; return(ELSEnumber); } {e}{l}{s}{i}{f} {yycolumn+=yyleng; return(ELSIFnumber); } {e}{n}{d} {yycolumn+=yyleng; return(ENDnumber); } {e}{n}{d}{i}{f} {yycolumn+=yyleng; return(ENDIFnumber); } {e}{n}{d}{l}{o}{o}{p} {yycolumn+=yyleng; return(ENDLOOPnumber); } {e}{n}{d}{r}{e}{c} {yycolumn+=yyleng; return(ENDRECnumber); } {e}{x}{i}{t} {yycolumn+=yyleng; return(EXITnumber); } {f}{o}{r} {yycolumn+=yyleng; return(FORnumber); } {f}{o}{r}{w}{a}{r}{d} {yycolumn+=yyleng; return(FORWARDnumber); } {f}{u}{n}{c}{t}{i}{o}{n} {yycolumn+=yyleng; return(FUNCTIONnumber); } {i}{f} {yycolumn+=yyleng; return(IFnumber); } {i}{s} {yycolumn+=yyleng; return(ISnumber); } {l}{o}{o}{p} {yycolumn+=yyleng; return(LOOPnumber); } {n}{o}{t} {yycolumn+=yyleng; return(NOTnumber); } {o}{f} {yycolumn+=yyleng; return(OFnumber); } {o}{r} {yycolumn+=yyleng; return(ORnumber); } {p}{r}{o}{c}{e}{d}{u}{r}{e} {yycolumn+=yyleng; return(PROCEDUREnumber); } {p}{r}{o}{g}{r}{a}{m} {yycolumn+=yyleng; return(PROGRAMnumber); } {r}{e}{c}{o}{r}{d} {yycolumn+=yyleng; return(RECORDnumber); } {r}{e}{p}{e}{a}{t} {yycolumn+=yyleng; return(REPEATnumber); } {r}{e}{t}{u}{r}{n} {yycolumn+=yyleng; return(RETURNnumber); } {t}{h}{e}{n} {yycolumn+=yyleng; return(THENnumber); } {t}{o} {yycolumn+=yyleng; return(TOnumber); } {t}{y}{p}{e} {yycolumn+=yyleng; return(TYPEnumber); } {u}{n}{t}{i}{l} {yycolumn+=yyleng; return(UNTILnumber); } {v}{a}{r} {yycolumn+=yyleng; return(VARnumber); } {w}{h}{i}{l}{e} {yycolumn+=yyleng; return(WHILEnumber); } [a-zA-Z][a-zA-Z0-9]* { yycolumn+=yyleng; yylval.semantic_value=hash_lookup(yytext); return(IDnumber); } [0-9]+ {yycolumn+=yyleng; sscanf(yytext,"%d",&yylval.semantic_value); return(ICONSTnumber); } '[^'\n]* { int i,j; char c, temp[1000]; c=input(); if (c!='\'') { ReportError("unclosed string",yyline, yycolumn); unput(c); } else { unput(c); if (yytext[yyleng-1] == '\\') { yycolumn+=yyleng; i=yyleng-1; j=0; while(yytext[i]=='\\'){ i--;j++;} if (j%2 != 0) yymore(); else { input(); yycolumn+=1; if (yyleng==2) ReportError("invalid character '\'", yyline,yycolumn-2); else if (yyleng==3) { if(yytext[1]=='\\') { yylval.semantic_value='\\'; return(CCONSTnumber); } else { escape_seq_convert(yytext+1, temp); yylval.semantic_value=put_string(temp); free(temp); return(SCONSTnumber); } } else { escape_seq_convert(yytext+1, temp); yylval.semantic_value=put_string(temp); free(temp); return(SCONSTnumber); } } } else { input();yycolumn+=yyleng+1; if (yyleng==2) { yylval.semantic_value=yytext[1]; return(CCONSTnumber); } else if (yyleng==3) { if (yytext[1]=='\\') { switch(yytext[2]) { case 'n' : yylval.semantic_value='\n'; return(CCONSTnumber); case 't' : yylval.semantic_value='\t'; return(CCONSTnumber); case '\'': yylval.semantic_value='\''; return(CCONSTnumber); default : yylval.semantic_value=yytext[2]; return(CCONSTnumber); } } else { escape_seq_convert(yytext+1, temp); yylval.semantic_value=put_string(temp); free(temp); return(SCONSTnumber); } } else { escape_seq_convert(yytext+1, temp); yylval.semantic_value=put_string(temp); free(temp); return(SCONSTnumber); } } } } "(*" { process_comment(); } \n { yyline++; yycolumn=1; } \t yycolumn+=8; " " yycolumn+=1; . { char temp[81]; sprintf(temp, "invalid character '%s'",yytext); ReportError(temp,yyline,yycolumn); yycolumn+=1; } %% /* discard comments */ process_comment() { char c; int line, column; line = yyline; column = yycolumn; yycolumn += yyleng; while ((c=input()) != 0) switch(c) { case '\n': yycolumn=1; yyline++; break; case '\t': yycolumn += 8; break; case '*': if ((c=input()) == ')') { yycolumn += 2; return; } else { yycolumn++; unput(c); } break; default: yycolumn++; break; } ReportError("unclosed comment",line,column); } ReportError(message,line,column) char *message; int line, column; { printf("\nError: %s \tline %d column %d\n\n",message,line,column); } /* process escape sequences (get rid of the 1st '\') in s, put results in s1 */ escape_seq_convert(s,s1) char *s, *s1; { char *t, *t1; t = s; t1 = s1; while (*t != '\0') { if (*t != '\\') *t1 = *t; else { switch (*(++t)) { case 'n' : *t1 = '\n'; break; case 't' : *t1 = '\t'; break; case '\\' : *t1 = '\\'; break; case '\'' : *t1 = '\''; break; default : *t1 = *t; } } t++; t1++; } *t1='\0'; }