//------------------------------------------------------------ // LogicalNot用評価関数。 void evaluateLogicalNot(SemanticAnalyzeComponent aComp) { // boolしか対応しない StatementUtil.CheckBoolExpression(aComp, mFirstNode, mExpr.mExpr); // SR設定 mTransferredEIHolder.ReceiveAndSetSR(aComp); // 伝達できるなら伝達する mTransferredEIHolder.TransferIfPossible(aComp); // 1つめを評価 mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate); // 伝達情報リセット aComp.TransferredEvaluateInfoReset(); // 命令追加 aComp.BCFunction.AddOPCode_SReg1_SReg2( BCOpCode.OpType.NTBOOL , mEvaluateInfo.SR , mFirstNode.GetEvaluateInfo().SR ); // イベント送信 mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Release); }
//------------------------------------------------------------ // 意味解析。 public void SemanticAnalyze(SemanticAnalyzeComponent aComp) { // ラベル作成 BCLabel labelContinue = aComp.BCFunction.LabelCreate(); BCLabel labelBreak = aComp.BCFunction.LabelCreate(); // 式の意味解析 var exprEvaluateNode = mExpression.CreateEvaluateNode(); exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze); // boolチェック StatementUtil.CheckBoolExpression(aComp, exprEvaluateNode, mExpression); // continueラベル挿入 aComp.BCFunction.LabelInsert(labelContinue); // 式の評価 exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate); exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Release); // 分岐 aComp.BCFunction.AddOPCode_SReg_Label( BCOpCode.OpType.JMPNEG , exprEvaluateNode.GetEvaluateInfo().SR , labelBreak ); // スコープに入る aComp.ScopeEnter(); // ラベルの登録 aComp.RegisterLabelContinue(labelContinue); aComp.RegisterLabelBreak(labelBreak); // 文の解析 mStatement.SemanticAnalyze(aComp); // スコープから出る aComp.ScopeLeave(); // continueする aComp.BCFunction.AddOPCode_Label( BCOpCode.OpType.JMP , labelContinue ); // breakラベル挿入 aComp.BCFunction.LabelInsert(labelBreak); }
//------------------------------------------------------------ // 意味解析。 public void SemanticAnalyze(SemanticAnalyzeComponent aComp) { // ラベル作成 BCLabel labelElse = aComp.BCFunction.LabelCreate(); BCLabel labelEnd = aComp.BCFunction.LabelCreate(); // 式の意味解析 var exprEvaluateNode = mExpression.CreateEvaluateNode(); exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze); // boolチェック StatementUtil.CheckBoolExpression(aComp, exprEvaluateNode, mExpression); // 式の評価 exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate); exprEvaluateNode.SendEvent(aComp, EvaluateNodeEventKind.Release); // 式がfalseならelseに飛ぶ aComp.BCFunction.AddOPCode_SReg_Label( BCOpCode.OpType.JMPNEG , exprEvaluateNode.GetEvaluateInfo().SR , labelElse ); // Thenの解析 { // スコープに入る aComp.ScopeEnter(); // Thenの解析 mThenStatement.SemanticAnalyze(aComp); // スコープから出る aComp.ScopeLeave(); // endに飛ぶ if (mElseStatement != null) {// elseがあるときだけでよい aComp.BCFunction.AddOPCode_Label( BCOpCode.OpType.JMP , labelEnd ); } } // elseラベル挿入 aComp.BCFunction.LabelInsert(labelElse); // Elseの解析 if (mElseStatement != null) { // スコープに入る aComp.ScopeEnter(); // Thenの解析 mElseStatement.SemanticAnalyze(aComp); // スコープから出る aComp.ScopeLeave(); } // endラベル挿入 aComp.BCFunction.LabelInsert(labelEnd); }