#include #include #include #define PI 3.141592654 float getnum (char *pointer); main (int argc, char *argv[]) { char buffer[1024]; /* Buffer to hold a line */ char *pointer; char *endpointer; short instring=0; int n,m; float num; int linenum=0; /* Parse into lines, surrounded by G...G */ pointer=buffer; while ( (*pointer=getchar()) != EOF ) { if (*pointer=='G') { break; } pointer++; } while (1) { linenum++; pointer=buffer; while ((*pointer=getchar())!=EOF) { if (isspace(*pointer)) { continue; } if (*pointer=='G') { *pointer='\0'; break; } pointer++; } if (*pointer==EOF) { break; } /* printf ("%03d [G%sG]\n",linenum,buffer); */ /* Process Line Here */ endpointer=pointer-1; pointer=buffer; printf ("%03d [",linenum); while (*pointer!='\0' && pointer<=endpointer) { switch (*pointer) { case 'B': num=getnum (pointer); printf (" %.0f ",num); while (*pointer=='B') { pointer++; } break; case 'Q': num=getnum (pointer); printf (" %.2f ",num); do { pointer++; } while (*pointer!='Q'); pointer++; break; case 'd': num=getnum (pointer); printf (" %.2f ",num); do { pointer++; } while (*pointer!='d'); pointer++; break; case 'g': num=getnum (pointer); num=2*PI*(num/216); printf (" %.2frad ",num); do { pointer++; } while (*pointer!='g'); pointer++; break; case 'K': if (*(pointer+1)=='B' || *(pointer+1)=='Q' || *(pointer+1)=='d') { pointer++; num=getnum (pointer); printf (" -%.2f ",num); do { pointer++; } while (*pointer!='K'); pointer++; } else { printf ("%~"); pointer++; switch (*pointer) { case 'R': pointer++; printf (":TRUE:"); break; case 'S': pointer++; printf (":FALSE:"); break; } pointer++; } break; case 'O': pointer++; num=getnum (pointer); printf (" 1/%.0f ",num); do { pointer++; } while (*pointer!='O'); pointer++; break; case 'R': pointer++; printf (":TRUE:"); break; case 'S': pointer++; printf (":FALSE:"); break; case 'H': pointer++; printf (":PLUS:"); break; case 'I': pointer++; printf (":SUB+:"); break; case 'J': pointer++; printf (":SUB-:"); break; case 'L': pointer++; printf (":MULT:"); break; case 'M': pointer++; printf (":DIV+:"); break; case 'N': pointer++; printf (":DIV/:"); break; case 'T': pointer++; printf (":SUB<:"); break; case 'U': pointer++; printf (":SUB>:"); break; case 'P': pointer++; printf (":EQV:"); break; case 'V': pointer++; printf (":IF:"); break; case 'W': pointer++; printf (":THEN:"); break; case 'X': pointer++; printf (" X "); break; case 'Y': pointer++; printf (" Y "); break; case 'Z': pointer++; printf (" Z "); break; case 'a': pointer++; printf (" a "); break; case 'b': pointer++; printf (" b "); break; case 'c': pointer++; printf (" c "); break; case 'e': pointer++; printf (":DIV>:"); break; case 'f': pointer++; printf (":DIV<:"); break; case 'i': pointer++; printf (":AND:"); break; case 'j': pointer++; printf (":OR:"); break; case 'h': pointer++; printf (":COS:"); break; case 'k': pointer++; printf (":SIN:"); break; default: printf (":*%c*:",*pointer); pointer++; break; } } printf ("]\n"); while ( (*pointer=getchar())!=EOF && *pointer!='G') { } } } float getnum (char *pointer) { char *store=pointer; float retval=0; int length=-1; int m; int power; int mult=1; char *dp=NULL; if (*pointer=='B') { while (*pointer=='B') { retval+=1; pointer++; } } else if (*pointer=='Q' || *pointer=='g') { *pointer++; length=-1; while (*pointer!='Q' && *pointer!='g' && *pointer!='d') { length++; pointer++; } if (*pointer=='d') { dp=pointer; } pointer=store+1; for (m=length/2;m>=0;m--) { retval+=((int) (*pointer)-'A') * pow(6,m); pointer++; } if (dp!=NULL) { retval+=getnum (dp); } } else if (*pointer=='d') { *pointer++; length=-1; while (*pointer!='d') { length++; pointer++; } pointer=store+1; for (m=length/2;m>=0;m--) { retval+=((int) (*pointer)-'A') * (1/pow(6,m+1)); pointer++; } } else { retval=-999; } return retval; }