public MiraeBuildResult(MiraeBuildError result, ErrorTarget target, Dictionary <NetworkBlockName, List <IBlock> > blockCodes) { Result = result; ErrorDetail = target; BlockCodes = blockCodes; StartingBlockName = NetworkBlockName.None; Context = ""; }
private MiraeBuildError BuildWhileBlock(WhileBlock environment, IBlock prev, byte conditionBlockId, out IBlock block) { ConditionBlock conditionBlock = environment.Condition; if (conditionBlock == null) { MiraeBuildError error = BuildConditionBlock(conditionBlockId, out conditionBlock); if (error > MiraeBuildError.Success) { block = null; return(error); } } block = new WhileBlock(environment.Id, prev, conditionBlock); return(MiraeBuildError.Success); }
public MiraeBuildResult Build(IEnumerable <MiraeNetworkBlock> networkBlocks) { MiraeNetworkBlock startingBlock = null; foreach (var networkBlock in networkBlocks) { if (networkBlock.Name == NetworkBlockName.LocalStarting) { startingBlock = networkBlock; } if (networkBlock.Name == NetworkBlockName.Starting && startingBlock == null) { startingBlock = networkBlock; } } if (startingBlock == null) { // Error return(new MiraeBuildResult(MiraeBuildError.NoStartingBlock, null, null)); } Dictionary <NetworkBlockName, List <IBlock> > dicBlocks = new Dictionary <NetworkBlockName, List <IBlock> >(); Stack <IOpenBracektBlock> openBracektBlockStack = new Stack <IOpenBracektBlock>(); foreach (var networkBlock in networkBlocks) { openBracektBlockStack.Clear(); List <IBlock> blocks = new List <IBlock>(); IBlock prevBlock = null; foreach (var current in networkBlock) { IBlock currentBlock = null; var id = current.Id; if (!mEnvironments.ContainsKey(id)) { return(new MiraeBuildResult(MiraeBuildError.UndefinedBlock, new MiraeBuildResult.ErrorTarget(networkBlock.Name, current.Id), null)); } var env = mEnvironments[id]; switch (env.BlockType) { case BlockType.If: { MiraeBuildError error; error = BuildIfBlock(env as IfBlock, prevBlock, current.ConditionId, out currentBlock); if (error > MiraeBuildError.Success) { // Error return(new MiraeBuildResult(error, new MiraeBuildResult.ErrorTarget(networkBlock.Name, current.Id), null)); } openBracektBlockStack.Push(currentBlock as IOpenBracektBlock); } break; case BlockType.While: { MiraeBuildError error; error = BuildWhileBlock(env as WhileBlock, prevBlock, current.ConditionId, out currentBlock); if (error > MiraeBuildError.Success) { // Error return(new MiraeBuildResult(error, new MiraeBuildResult.ErrorTarget(networkBlock.Name, current.Id), null)); } openBracektBlockStack.Push(currentBlock as IOpenBracektBlock); } break; case BlockType.CloseBracket: { if (openBracektBlockStack.Count == 0) { // Bracekt Error return(new MiraeBuildResult(MiraeBuildError.NoLeftBracekt, new MiraeBuildResult.ErrorTarget(networkBlock.Name, current.Id), null)); } var openBracektBlock = openBracektBlockStack.Pop(); MiraeBuildError error = BuildCloseBracekt(env.Id, prevBlock, openBracektBlock, out currentBlock); if (error > MiraeBuildError.Success) { // Error return(new MiraeBuildResult(error, new MiraeBuildResult.ErrorTarget(networkBlock.Name, current.Id), null)); } } break; case BlockType.Condition: { // Error return(new MiraeBuildResult(MiraeBuildError.WrongConditionPosition, new MiraeBuildResult.ErrorTarget(networkBlock.Name, current.Id), null)); } case BlockType.FunctionCall: { MiraeBuildError error = BuildFunctionCallBlock(env as FunctionCallBlock, prevBlock, out currentBlock); if (error > MiraeBuildError.Success) { // Error return(new MiraeBuildResult(error, new MiraeBuildResult.ErrorTarget(networkBlock.Name, current.Id), null)); } } break; case BlockType.Execute: { MiraeBuildError error = BuildExecuteBlock(env as ExecuteBlock, prevBlock, out currentBlock); if (error > MiraeBuildError.Success) { // Error return(new MiraeBuildResult(error, new MiraeBuildResult.ErrorTarget(networkBlock.Name, current.Id), null)); } } break; default: break; } if (currentBlock == null) { return(new MiraeBuildResult(MiraeBuildError.UnknownBlock, new MiraeBuildResult.ErrorTarget(networkBlock.Name, current.Id), null)); } // After Create Block blocks.Add(currentBlock); prevBlock = currentBlock; }// foreach (var current in block) if (openBracektBlockStack.Count > 0) { // Bracekt Error return(new MiraeBuildResult(MiraeBuildError.NoRightBracekt, new MiraeBuildResult.ErrorTarget(networkBlock.Name, 0), null)); } dicBlocks.Add(networkBlock.Name, blocks); }// foreach (var block in networkBlocks) var context = MiraeContextConverter.Convert(dicBlocks); return(new MiraeBuildResult(dicBlocks, startingBlock.Name, context)); }