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; }
Statement *ParseIfStatement() { Statement *snp; dfs.puts("<ParseIfStatement>"); NextToken(); if (lastst == kw_firstcall) return ParseFirstcallStatement(); currentFn->UsesPredicate = TRUE; snp = NewStatement(st_if, FALSE); snp->predreg = iflevel; iflevel++; if ((iflevel > maxPn-1) && isThor) error(ERR_OUTOFPREDS); if( lastst != openpa ) error(ERR_EXPREXPECT); else { NextToken(); if( expression(&(snp->exp)) == 0 ) error(ERR_EXPREXPECT); needpunc( closepa,19 ); if (lastst==kw_then) NextToken(); snp->s1 = ParseStatement(); if (snp->s1) snp->s1->outer = snp; if( lastst == kw_else ) { NextToken(); snp->s2 = ParseStatement(); if (snp->s2) snp->s2->outer = snp; } else if (lastst == kw_elsif) { snp->s2 = ParseIfStatement(); if (snp->s2) snp->s2->outer = snp; } else snp->s2 = 0; } iflevel--; dfs.puts("</ParseIfStatement>"); return snp; }