%{ #include "symtab.h" #include "poly.h" #include "mmstort.tab.h" int scanline=1; int lineno=0; /* is set after scanning an instruction and before scanning a polynom */ #define SET_OM(ups,mu) (yylval.time.oops=(ups),yylval.time.mems=(mu)) #define SET_VAR(name) (yylval.i=pgetvar(name)) #define SET_NUM(name) (yylval.d=atof(name)) %} %s OP ARG POLY IGNORE OFF RT SPACE [[:blank:]] LABEL ([a-zA-Z:_][a-zA-Z0-9:_]*|[0-9]H)?{SPACE}+ FOP FADD|FIX|FSUB|FIXU|FLOT|FLOTU|SFLOT|SFLOTU|FMUL|FCMPE|FEQLE|FREM|FINT LOPA ((LD|ST)[BWTO]) LOP {LOPA}|{LOPA}U|(LD|ST)(SF|HT|UNC)|STCO NULLOP IS|BYTE|WYDE|TETRA|OCTA|GREG|LOC|PREFIX|BSPEC|ESPEC OPCODE [A-Z0-9]+ ARGUMENT ([^[:blank:]'"\n;]|\'.\'|\"[^"\n]+\")+ SUP \^(\\prime|\{(\\prime)+\}) SUB \_([0-9a-bA-B]|\{[0-9a-bA-B]+\}) PFM \\fmt\{[^}\n]*\} PCTRL \\(rfloor|lfloor|hidewidth) PKERN \\kern{SPACE}*[+-]?[0-9]+(pt|ex|em) POTHER \~|\\! PIGNORE {PFM}|{PCTRL}|{PKERN}|{POTHER} VARIABLE [a-zA-Z]({SUB}|{SUP})*|\\upsilon|\\mu NUMBER [0-9]+(\.[0-9]*)? TEXCODE ([^[:blank:]\n&]|(\\([a-zA-Z]+|[^[:blank:]\n]){SPACE}*))+ TEXREF {SPACE}+[^[:blank:]\n&]+ %% /* commands for mmstort */ ^"%%%rtoff".*\n? scanline++;BEGIN(OFF); ^"%%%off".*\n? scanline++;BEGIN(OFF); ^"%%%rton".*\n? scanline++;BEGIN(INITIAL); ^"%%%on".*\n? scanline++;BEGIN(INITIAL); ^"%%%rt"{TEXREF} BEGIN(RT); ^"%%%rton".*\n? scanline++;BEGIN(INITIAL); ^"%%%on".*\n? scanline++;BEGIN(INITIAL); ^.*\n? scanline++; /* lines without & are without runtime info */ ^[^&\n]*\n scanline++; /* from now on all lines have an & */ ^{LABEL} lineno=scanline;BEGIN(OP); ^. BEGIN(IGNORE); .*\n? scanline++;BEGIN(INITIAL); (TRAP|RESUME|TRIP){SPACE}+ SET_OM(5,0);BEGIN(ARG); return OPCODE; {FOP}{SPACE}+ SET_OM(4,0);BEGIN(ARG);return OPCODE; (FDIV|FSQRT){SPACE}+ SET_OM(40,0);BEGIN(ARG);return OPCODE; (MUL|MULU){SPACE}+ SET_OM(10,0);BEGIN(ARG);return OPCODE; (DIV|DIVU){SPACE}+ SET_OM(60,0);BEGIN(ARG);return OPCODE; {LOP}{SPACE}+ SET_OM(1,1);BEGIN(ARG);return OPCODE; (POP|PUSHGO){SPACE}+ SET_OM(3,0);BEGIN(ARG);return OPCODE; (SAVE|UNSAVE){SPACE}+ SET_OM(1,20);BEGIN(ARG);return OPCODE; {NULLOP}{SPACE}+ SET_OM(0,0);BEGIN(ARG);return OPCODE; {OPCODE}{SPACE}+ SET_OM(1,0);BEGIN(ARG);return OPCODE; . BEGIN(IGNORE); /* indented comment with & */ {ARGUMENT};{LABEL} BEGIN(OP); {ARGUMENT}{SPACE}+ lineno=scanline;BEGIN(POLY); {ARGUMENT} BEGIN(INITIAL); /* now we tokenize a polynom */ \% BEGIN(IGNORE); \& BEGIN(IGNORE);return EOP; /* end of the polynom */ \n scanline++;BEGIN(INITIAL);return EOP; /* end of the polynom */ {SPACE}+ ; \\sum ; /*ignore \sum */ {VARIABLE} SET_VAR(yytext); return VAR; {NUMBER} SET_NUM(yytext); return NUM; \( return OPEN; \) return CLOSE; \+ return PLUS; \- return MINUS; \* return MUL; \/ return DIV; {PIGNORE} ; /* things in polynomes that we ignore */ \\bg\{ return BGSTART; \} return BGEND; . fprintf(stderr,"Error in line %d: unexpected character %c (%x)\n",scanline,yytext[0],yytext[0]);exit(1); "%%tex"{SPACE}+{TEXCODE} ; {SPACE}*\& lineno=scanline;BEGIN(POLY);return VERIFY; . ; /* I dont know how to get here but I ignore it */ \n ; %% static YY_BUFFER_STATE input_buffer = ((YY_BUFFER_STATE)0); extern int set_input(char *inputname) { FILE *input =fopen(inputname,"r"); if (input==NULL) { fprintf(stderr,"unable to open input file %s\n",inputname); exit(1); } input_buffer = yy_create_buffer( input, YY_BUF_SIZE); yy_switch_to_buffer(input_buffer); }