/* ParseEndIf - parse the 'END IF' statement */ static void ParseEndIf(ParseContext *c) { switch (CurrentBlockType(c)) { case BLOCK_IF: fixupbranch(c, c->bptr->u.IfBlock.nxt, codeaddr(c)); fixupbranch(c, c->bptr->u.IfBlock.end, codeaddr(c)); PopBlock(c); break; case BLOCK_ELSE: fixupbranch(c, c->bptr->u.ElseBlock.end, codeaddr(c)); PopBlock(c); break; default: ParseError(c, "END IF without a matching IF/ELSE IF/ELSE"); break; } FRequire(c, T_EOL); }
/* ParseLoop - parse the 'LOOP' statement */ static void ParseLoop(ParseContext *c) { int inst; switch (CurrentBlockType(c)) { case BLOCK_DO: inst = putcbyte(c, OP_BR); putcword(c, c->bptr->u.DoBlock.nxt - inst - 1 - sizeof(VMUVALUE)); fixupbranch(c, c->bptr->u.DoBlock.end, codeaddr(c)); PopBlock(c); break; default: ParseError(c, "LOOP without a matching DO"); break; } FRequire(c, T_EOL); }
/* ParseIf - parse the 'IF' statement */ static void ParseIf(ParseContext *c) { Token tkn; ParseRValue(c); FRequire(c, T_THEN); PushBlock(c); c->bptr->type = BLOCK_IF; putcbyte(c, OP_BRF); c->bptr->u.IfBlock.nxt = putcword(c, 0); c->bptr->u.IfBlock.end = 0; if ((tkn = GetToken(c)) != T_EOL) { ParseStatement(c, tkn); fixupbranch(c, c->bptr->u.IfBlock.nxt, codeaddr(c)); PopBlock(c); } else Require(c, tkn, T_EOL); }
/* ParseNext - parse the 'NEXT' statement */ static void ParseNext(ParseContext *c) { ParseTreeNode *var; int inst; switch (CurrentBlockType(c)) { case BLOCK_FOR: FRequire(c, T_IDENTIFIER); var = GetSymbolRef(c, c->token); /* BUG: check to make sure it matches the symbol used in the FOR */ inst = putcbyte(c, OP_BR); putcword(c, c->bptr->u.ForBlock.nxt - inst - 1 - sizeof(VMUVALUE)); fixupbranch(c, c->bptr->u.ForBlock.end, codeaddr(c)); PopBlock(c); break; default: ParseError(c, "NEXT without a matching FOR"); break; } FRequire(c, T_EOL); }
static void EndOfStmt( void ) { do { switch( BlockStack->block_type ) { case T_LEFT_BRACE: EndBlock(); break; case T_IF: if( CurToken == T_ELSE ) { ElseStmt(); return; } DropBreakLabel(); break; case T_ELSE: DropBreakLabel(); break; case T_WHILE: DropContinueLabel(); Jump( BlockStack->top_label ); --LoopDepth; DropBreakLabel(); break; case T_FOR: EndForStmt(); --LoopDepth; DropBreakLabel(); if( CompFlags.c99_extensions ) { EndBlock(); /* Terminate the scope introduced by 'for' */ PopBlock(); } break; case T_DO: DropContinueLabel(); MustRecog( T_WHILE ); SrcLoc = TokenLoc; JumpTrue( BracketExpr(), BlockStack->top_label ); MustRecog( T_SEMI_COLON ); SrcLoc = TokenLoc; --LoopDepth; DropBreakLabel(); break; case T_SWITCH: EndSwitch(); DropBreakLabel(); break; #ifdef __SEH__ case T__TRY: case T___TRY: if( EndTry() ) return; break; case T__EXCEPT: case T___EXCEPT: DropBreakLabel(); TryScope = BlockStack->parent_index; CompFlags.exception_handler = 0; break; case T__FINALLY: case T___FINALLY: AddStmt( LeafNode( OPR_END_FINALLY ) ); CompFlags.in_finally_block = 0; TryScope = BlockStack->parent_index; break; #endif } PopBlock(); if( BlockStack == NULL ) break; } while( BlockStack->block_type != T_LEFT_BRACE ); }