#ifndef _AS68HC11_SCAN_HPP_ #define _AS68HC11_SCAN_HPP_ #ifndef _COMMON_BLOCK_HPP_ #include #endif #ifndef _AS68HC11_EMIT_HPP_ #include #endif class Table; class Scan : public Emit { public: enum ScanSymbols{unknown1,name1,asterisk1,apostrophe1,equ1,origin1,rmb1,comma1,label1,literal1,leftbracket1,rightbracket1,numeral1, char1,divide1,plus1,minus1,leftparen1,rightparen1,newline1,endtext1, ix1,iy1,aba1,abx1,aby1,adca1,adcb1,adda1,addb1,addd1,anda1,andb1,asl1,asla1,aslb1, asld1,asr1,asra1,asrb1,bcc1,bclr1,bcs1,beq1,bge1,bgt1,bhi1,bhs1,bita1,bitb1,ble1,blo1, bls1,blt1,bmi1,bne1,bpl1,bra1,brclr1,brn1,brset1,bset1,bsr1,bvc1,bvs1,cba1,clc1,cli1,clr1, clra1,clrb1,clv1,cmpa1,cmpb1,com1,coma1,comb1,cpd1,cpx1,cpy1,daa1,dec1,deca1,decb1,des1, dex1,dey1,eora1,eorb1,fdiv1,idiv1,inc1,inca1,incb1,ins1,inx1,iny1,jmp1,jsr1,ldaa1,ldab1, ldd1,lds1,ldx1,ldy1,lsl1,lsla1,lslb1,lsld1,lsr1,lsra1,lsrb1,lsrd1,mul1,neg1,nega1,negb1, nop1,oraa1,orab1,psha1,pshb1,pshx1,pshy1,pula1,pulb1,pulx1,puly1,rol1,rola1,rolb1,ror1, rora1,rorb1,rti1,rts1,sba1,sbca1,sbcb1,sec1,sei1,sev1,staa1,stab1,std1,stop1,sts1,stx1, sty1,suba1,subb1,subd1,swi1,tab1,tap1,tba1,test1,tpa1,tst1,tsta1,tstb1,tsx1,tsy1,txs1, tys1,wai1,xgdx1,xgdy1,end1}; Scan(PureViewOfFile &srcView,PureViewOfFile &dstView,Table &symbolTable,Block &includePath=Block()); Scan(PureViewOfFile &srcView,PureViewOfFile &dstView,Table &symbolTable,CodePointer &codePointer,Block &includePath=Block()); virtual ~Scan(); bool analyze(void); const String &lastMessage(void)const; private: enum {SpaceChar=32,TabChar=9}; void readch(void); void skipSeparators(void); bool scanNumeral(void); void scanNewLine(void); bool scanWord(void); void scanComment(void); void scanCharacter(void); void scanUnknown(void); void hex(char chBuffer[],int chIndex); void binary(char chBuffer[],int chIndex); void decimal(char chBuffer[],int chIndex); bool scanInclude(void); bool isKeySymbol(void)const; bool isInHex(int chr)const; bool getIncludeFile(const String &fileName,String &pathFileName); Block mIncludePath; WORD mUserSymbols; Table &mSymbolTable; String mWordString; String mLastMessage; bool mIsInError; bool mEmitEndText; int mChar; }; inline void Scan::readch(void) { mChar=read(); } inline bool Scan::isKeySymbol(void)const { return (' '==mChar||','==mChar||'['==mChar||']'==mChar||':'==mChar||'*'==mChar||'/'==mChar||'+'==mChar||'-'==mChar||'('==mChar||')'==mChar); } inline bool Scan::isInHex(int chr)const { if('A'==chr||'B'==chr||'C'==chr||'D'==chr||'E'==chr||'F'==chr|| 'a'==chr||'b'==chr||'c'==chr||'d'==chr||'e'==chr||'f'==chr)return TRUE; return FALSE; } inline void Scan::scanUnknown(void) { readch(); emit(unknown1); } inline const String &Scan::lastMessage(void)const { return mLastMessage; } #endif