void CpWhile( void ) { //================= // Compile a WHILE statement. // WHILE( expr )DO <:label> -- block while // WHILE( expr ) <:label> -- block while // WHILE( expr ) STATEMENT -- one line while CSExtn(); InitLoop( CS_WHILE ); CSCond( CSHead->bottom ); if( RecNOpn() && RecNextOpr( OPR_COL ) ) { BlockLabel(); } else if( RecKeyWord( "DO" ) && ( RecNextOpr( OPR_TRM ) || RecNextOpr( OPR_COL ) ) ) { CITNode->opn.ds = DSOPN_PHI; BlockLabel(); } else { Recurse(); GLabel( CSHead->cycle ); FiniLoop(); DelCSNode(); } }
void CpQuit(void) { //================ // Compile a QUIT statement. itnode *block_label; csnode *csblock; CSExtn(); block_label = GetBlockLabel(); csblock = CSHead; if( block_label->opnd_size != 0 ) { for(;;) { if( CmpNode2Str( block_label, &csblock->label ) ) break; if( csblock->link == NULL ) break; csblock = csblock->link; } } if( csblock->typ == CS_EMPTY_LIST ) { StmtErr( SP_BAD_QUIT ); } else if( (csblock->typ == CS_GUESS) || (csblock->typ == CS_ADMIT) ) { GBranch( csblock->branch ); } else { GBranch( csblock->bottom ); } BlockLabel(); }
void CpCycle(void) { //================= // Compile the CYCLE statement. itnode *block_label; csnode *csblock; CSExtn(); block_label = GetBlockLabel(); csblock = CSHead; for(;;) { if( ( csblock->typ == CS_DO ) || ( csblock->typ == CS_DO_WHILE ) || ( csblock->typ == CS_WHILE ) || ( csblock->typ == CS_LOOP ) ) { if( block_label->opnd_size == 0 ) break; if( CmpNode2Str( block_label, &csblock->label ) ) break; } if( csblock->link == NULL ) break; csblock = csblock->link; } if( csblock->typ == CS_EMPTY_LIST ) { StmtErr( SP_BAD_QUIT ); } else { GBranch( csblock->cycle ); } BlockLabel(); }
void CpLoop( void ) { // Compile a LOOP statement. CSExtn(); InitLoop( CS_LOOP ); BlockLabel(); }
void CpDoWhile( void ) { // Compile a DO WHILE statement. Extension( DO_DO_EXT ); InitLoop( CS_DO_WHILE ); CSHead->cs_info.do_term = DoLabel(); if( RecKeyWord( "WHILE" ) ) { RemKeyword( CITNode, 5 ); CSCond( CSHead->bottom ); BlockLabel(); } else { if( ReqNOpn() ) { BlockLabel(); } } }
void CpLogIf(void) { //================= // Process a logical IF statement. label_id if_skip; if_skip = NextLabel(); CSCond( if_skip ); if( RecKeyWord( "THEN" ) && ( RecNextOpr( OPR_TRM ) || RecNextOpr( OPR_COL ) ) ) { AddCSNode( CS_IF ); CSHead->branch = if_skip; CSHead->bottom = NextLabel(); CITNode->opn.ds = DSOPN_PHI; // not part of the block label BlockLabel(); CtrlFlgs |= CF_BAD_DO_ENDING; } else { Recurse(); GLabel( if_skip ); FreeLabel( if_skip ); } }