Files
Work/as68hc11/Scan.hpp
2024-08-07 09:12:07 -04:00

94 lines
2.9 KiB
C++

#ifndef _AS68HC11_SCAN_HPP_
#define _AS68HC11_SCAN_HPP_
#ifndef _COMMON_BLOCK_HPP_
#include <common/block.hpp>
#endif
#ifndef _AS68HC11_EMIT_HPP_
#include <as68hc11/emit.hpp>
#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<String> &includePath=Block<String>());
Scan(PureViewOfFile &srcView,PureViewOfFile &dstView,Table &symbolTable,CodePointer &codePointer,Block<String> &includePath=Block<String>());
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<String> 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