#include #include #include #include Parse::Parse(PureViewOfFile &srcView,PureViewOfFile &dstView) : Emit(srcView,dstView), mNumeralValue(0), mIsInError(FALSE), mLastMessage("Success"), mLastLineNumber(FirstLine), mLineNumber(FirstLine), mCurrentSymbolType(Scan::unknown1), mLogFile("parse.log",FileHandle::Write,FileHandle::ShareRead,FileHandle::Overwrite), mCodeBytes(0) { createSimpleExpressionSymbols(); createExpressionSymbols(); createStatementSymbols(); createFactorSymbols(); createTermSymbols(); createMathSymbols(); createAddSymbols(); createSignSymbols(); } Parse::~Parse() { } BOOL Parse::parse(void) { mCodeBytes=0; nextSymbol(); insertSymbols(ParseSymbol(Scan::endtext1)); while(Scan::endtext1!=currentSymbolType()&&!isInError())statement(); removeSymbols(ParseSymbol(Scan::endtext1)); if(isInError())return FALSE; mCodeBytes=outputView().tell(); resolve(); return !isInError(); } void Parse::statement(void) { if(symbolIn(ParseSymbol(Scan::origin1))){originStatement();return;} else if(symbolIn(ParseSymbol(Scan::label1))){labelStatement();return;} else if(symbolIn(ParseSymbol(Scan::literal1))){parseLiteral();return;} else if(Scan::name1==currentSymbolType()) { switch(mCurrentSymbol->symbolType()) { case Symbol::KeywordSymbol : keywordStatement(); break; case Symbol::DirectiveSymbol : syntaxError(); break; case Symbol::UserSymbol : userStatement(); break; } } else syntaxCheck(); } void Parse::labelStatement(void) { Label codeLabel; SmartPointer