void InitImpDo( itnode *lastcomma ) { //====================================== // Initialize the implied DO-loop. int level; itnode *imp_do_list; CITNode = lastcomma; CITNode->opr = OPR_TRM; // marks the end of the i/o list ImpDo(); if( !ReqCloseParen() ) { level = 0; for(;;) { if( RecOpenParen() ) { level++; } else if( RecCloseParen() ) { level--; } if( level < 0 ) break; if( CITNode->link == NULL ) { DelCSNode(); CITNode->opr = OPR_TRM; CITNode->oprpos = 9999; break; } AdvanceITPtr(); } } ReqNOpn(); imp_do_list = lastcomma->link; lastcomma->link = CITNode->link; CITNode->link = NULL; FreeITNodes( imp_do_list ); }
void TermDo( void ) { // Terminate a DO or an implied DO. do_entry *do_pointer; sym_id do_var; if( CSHead->typ == CS_DO ) { do_pointer = CSHead->cs_info.do_parms; if( do_pointer->do_parm != NULL ) { if( ( StmtSw & SS_DATA_INIT ) == 0 ) { GLabel( CSHead->cycle ); } GDoEnd(); do_var = do_pointer->do_parm; if( (do_var->u.ns.flags & SY_SPECIAL_PARM) && !(do_var->u.ns.flags & SY_PS_ENTRY) ) { STUnShadow( do_var ); } do_var->u.ns.flags &= ~SY_DO_PARM; if( ( StmtSw & SS_DATA_INIT ) == 0 ) { GLabel( CSHead->bottom ); } } } else { Match(); } if( ( StmtSw & SS_DATA_INIT ) == 0 ) { FreeLabel( CSHead->branch ); FreeLabel( CSHead->bottom ); FreeLabel( CSHead->cycle ); } DelCSNode(); }
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(); } }
static void BadDoEnd( void ) { Error( DO_BAD_ENDDO ); FreeLabel( CSHead->branch ); FreeLabel( CSHead->bottom ); DelCSNode(); }
void CpEndLoop( void ) { // Compile an ENDLOOP statment. if( CSHead->typ == CS_LOOP ) { GLabel( CSHead->cycle ); FiniLoop(); } else { Match(); } DelCSNode(); CSNoMore(); }
void CpEndWhile( void ) { // Compile an ENDWHILE statement. if( CSHead->typ == CS_WHILE ) { GLabel( CSHead->cycle ); FiniLoop(); } else { Match(); } DelCSNode(); CSNoMore(); }
void CpUntil( void ) { // Compile an UNTIL statement. if( ( CSHead->typ == CS_LOOP ) || ( CSHead->typ == CS_WHILE ) ) { GLabel( CSHead->cycle ); CSCond( CSHead->branch ); GLabel( CSHead->bottom ); FreeLabel( CSHead->branch ); FreeLabel( CSHead->bottom ); FreeLabel( CSHead->cycle ); } else { Match(); } DelCSNode(); CSNoMore(); }
void CpEndif(void) { //================= // Process an ENDIF statement. if( ( CSHead->typ == CS_IF ) || ( CSHead->typ == CS_ELSEIF ) ) { GLabel( CSHead->branch ); FreeLabel( CSHead->branch ); GLabel( CSHead->bottom ); FreeLabel( CSHead->bottom ); } else if( CSHead->typ == CS_ELSE ) { GLabel( CSHead->bottom ); FreeLabel( CSHead->bottom ); } else { Match(); } DelCSNode(); CSNoMore(); }
void CpEndBlock( void ) { CheckCSList( CS_REMOTEBLOCK ); if( CSHead->typ == CS_REMOTEBLOCK ) { GLabel( CSHead->bottom ); FreeLabel( CSHead->bottom ); // Make sure REMOTEBLOCK statement was valid. if( CSHead->cs_info.rb != NULL ) { GEndBlock(); } GLabel( CSHead->branch ); FreeLabel( CSHead->branch ); DelCSNode(); } else { Match(); } CSNoMore(); StNumbers.in_remote = FALSE; ClearRem(); CSNoMore(); BIEndRBorEP(); }
void TermDoWhile( void ) { GLabel( CSHead->cycle ); FiniLoop(); DelCSNode(); }