Ejemplo n.º 1
0
 public MiraeBuildResult(MiraeBuildError result, ErrorTarget target, Dictionary <NetworkBlockName, List <IBlock> > blockCodes)
 {
     Result            = result;
     ErrorDetail       = target;
     BlockCodes        = blockCodes;
     StartingBlockName = NetworkBlockName.None;
     Context           = "";
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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));
        }