asCScriptNode *asCParser::ParseFor() { asCScriptNode *node = new asCScriptNode(snFor); sToken t; GetToken(&t); if( t.type != ttFor ) { Error(ExpectedToken("for").AddressOf(), &t); return node; } node->UpdateSourcePos(t.pos, t.length); GetToken(&t); if( t.type != ttOpenParanthesis ) { Error(ExpectedToken("(").AddressOf(), &t); return node; } if( IsVarDecl() ) node->AddChildLast(ParseDeclaration()); else node->AddChildLast(ParseExpressionStatement()); if( isSyntaxError ) return node; node->AddChildLast(ParseExpressionStatement()); if( isSyntaxError ) return node; GetToken(&t); if( t.type != ttCloseParanthesis ) { RewindTo(&t); node->AddChildLast(ParseAssignment()); if( isSyntaxError ) return node; GetToken(&t); if( t.type != ttCloseParanthesis ) { Error(ExpectedToken(")").AddressOf(), &t); return node; } } node->AddChildLast(ParseStatement()); return node; }
asCScriptNode *asCParser::ParseStatement() { sToken t1; GetToken(&t1); RewindTo(&t1); if( t1.type == ttIf ) return ParseIf(); else if( t1.type == ttFor ) return ParseFor(); else if( t1.type == ttWhile ) return ParseWhile(); else if( t1.type == ttReturn ) return ParseReturn(); else if( t1.type == ttStartStatementBlock ) return ParseStatementBlock(); else if( t1.type == ttBreak ) return ParseBreak(); else if( t1.type == ttContinue ) return ParseContinue(); else if( t1.type == ttDo ) return ParseDoWhile(); else if( t1.type == ttSwitch ) return ParseSwitch(); else return ParseExpressionStatement(); }
Statement *ParseStatement() { Statement *snp; switch( lastst ) { case semicolon: NextToken(); snp = NULL; break; case begin: NextToken(); snp = ParseCompoundStatement(); return snp; case kw_if: snp = ParseIfStatement(); break; case kw_while: snp = ParseWhileStatement(); break; case kw_until: snp = ParseUntilStatement(); break; case kw_for: snp = ParseForStatement(); break; case kw_forever: snp = ParseForeverStatement(); break; case kw_firstcall: snp = ParseFirstcallStatement(); break; case kw_return: snp = ParseReturnStatement(); break; case kw_break: snp = ParseBreakStatement(); break; case kw_goto: snp = ParseGotoStatement(); break; case kw_continue: snp = ParseContinueStatement(); break; case kw_do: case kw_loop: snp = ParseDoStatement(); break; case kw_switch: snp = ParseSwitchStatement(); break; case kw_try: snp = ParseTryStatement(); break; case kw_throw: snp = ParseThrowStatement(); break; case kw_vortex: snp = vortex_stmt(); break; case kw_intoff: snp = ParseIntoffStatement(); break; case kw_inton: snp = ParseIntonStatement(); break; case kw_stop: snp = ParseStopStatement(); break; case kw_asm: snp = ParseAsmStatement(); break; case kw_critical: snp = ParseCriticalStatement(); break; case kw_spinlock: snp = ParseSpinlockStatement(); break; case kw_spinunlock: snp = ParseSpinunlockStatement(); break; case id: SkipSpaces(); if( lastch == ':' ) return ParseLabelStatement(); // else fall through to parse expression default: snp = ParseExpressionStatement(); break; } if( snp != NULL ) snp->next = NULL; return snp; }