示例#1
0
        static void OnClosingKey(CKey key, EKeyAddingMode inKeyAddMode, ITreeBuildSupport inSupport)
        {
            if (key == null)
            {
                return;
            }

            if (key.IsEmpty)
            {
                inSupport.GetLogger().LogError(EErrorCode.HeadWithoutValues, key);
                return;
            }

            if (inKeyAddMode == EKeyAddingMode.AddUnique)
            {
                return;
            }

            CKey parent = key.Parent;

            if (parent == null)
            {
                inSupport.GetLogger().LogError(EErrorCode.KeyMustHaveParent, key);
                return;
            }

            key.SetParent(null);

            if (inKeyAddMode == EKeyAddingMode.Override)
            {
                var pathes = new List <List <string> >();
                key.GetTerminalPathes(pathes, new List <string>());

                //for correct deleting array elems
                for (int i = pathes.Count - 1; i >= 0; --i)
                {
                    var path = pathes[i];
                    RemoveKeysByPath(parent, path);
                }

                inKeyAddMode = EKeyAddingMode.Add;
            }

            if (inKeyAddMode == EKeyAddingMode.Add)
            {
                CKey child_key = parent.FindChildKey(key.Name);
                if (child_key != null)
                {
                    child_key.MergeKey(key);
                }
                else
                {
                    key.SetParent(parent);
                }
            }
        }
示例#2
0
        //inStartLine - next of parent line
        static void CollectByDivs(CKey inParent, int inParentRank, int inStartLine, int inEndLine, List <CTokenLine> inLines,
                                  ITreeBuildSupport inSupport, CKey inRoot, EKeyAddingMode inKeyAddingMode)
        {
            int curr_rank = inParentRank + 1;
            List <Tuple <int, int> > recs_by_divs = new List <Tuple <int, int> >();

            CollectDividers(inStartLine, inEndLine, curr_rank, inLines, inSupport, recs_by_divs);

            if (recs_by_divs.Count > 1)
            {
                if (inKeyAddingMode == EKeyAddingMode.Override)
                {
                    inParent.ClearAllArrayKeys();
                }

                for (int i = 0; i < recs_by_divs.Count; i++)
                {
                    int first_line       = recs_by_divs[i].Item1;
                    int exlude_last_line = recs_by_divs[i].Item2;
                    if (first_line < exlude_last_line)
                    {
                        CKey arr_key = CKey.CreateArrayKey(inParent, inLines[first_line].Position);

                        if (IsLinePresent(curr_rank, first_line, exlude_last_line, inLines))
                        {
                            Collect(arr_key, curr_rank, first_line, exlude_last_line, inLines, inSupport, inRoot, EKeyAddingMode.AddUnique);
                        }
                        else
                        {
                            CollectByDivs(arr_key, curr_rank, first_line, exlude_last_line, inLines, inSupport, inRoot, EKeyAddingMode.AddUnique);
                        }

                        if (arr_key.IsEmpty)
                        {
                            arr_key.SetParent(null);
                        }
                    }
                }
            }
            else
            {
                Collect(inParent, inParentRank, recs_by_divs[0].Item1, recs_by_divs[0].Item2, inLines, inSupport, inRoot, inKeyAddingMode);
            }
        }
示例#3
0
        void FindHeadAndTail(ILogger inLoger)
        {
            if (_tokens.Length == 0)
            {
                return;
            }

            if (_tokens[0].TokenType == ETokenType.Sharp)
            {
                return;
            }

            if (_tokens[0].TokenType == ETokenType.RecordDivider)
            {
                return;
            }

            int    cur_index = 0;
            CToken toc       = _tokens[cur_index];

            if (toc.TokenType == ETokenType.AddKey)
            {
                _addition_mode = EKeyAddingMode.Add;
                cur_index++;
            }
            else if (toc.TokenType == ETokenType.OverrideKey)
            {
                _addition_mode = EKeyAddingMode.Override;
                cur_index++;
            }
            //if (toc.TokenType == ETokenType.OverrideKey)
            //{
            //    _addition_mode = EKeyAddingMode.Override;
            //    cur_index++;
            //}

            int token_count = _tokens.Length - cur_index;

            if (cur_index == 0 && token_count == 1 && Utils.IsDataType(toc.TokenType))
            {//written only one value
                _tail = new CToken[1] {
                    _tokens[0]
                };
                return;
            }

            if (token_count < 2)
            {
                inLoger.LogError(EErrorCode.CantResolveLine, this);
                return;
            }

            toc = _tokens[cur_index + 1];
            if (toc.TokenType == ETokenType.Colon)
            {
                _head      = _tokens[cur_index];
                cur_index += 2;
                if (!Utils.IsDataType(_head.TokenType))
                {
                    inLoger.LogError(EErrorCode.StrangeHeadType, _head);
                }
            }
            else if (_tokens[0].TokenType == ETokenType.Colon)
            {
                IsNewArrayLine = true;
            }

            List <CToken> lst = new List <CToken>();

            for (int i = cur_index; i < _tokens.Length; ++i)
            {
                if (Utils.IsDataType(_tokens[i].TokenType))
                {
                    lst.Add(_tokens[i]);
                }
            }
            _tail = lst.ToArray();
        }
示例#4
0
        static Tuple <CKey, int> CreateKey(int inStartLine, int inEndLine, List <CTokenLine> inLines, ITreeBuildSupport inSupport,
                                           CKey inRoot, CKey inParent, EKeyAddingMode inKeyAddingMode)
        {
            CTokenLine line     = inLines[inStartLine];
            int        key_rank = line.Rank;

            if (line.IsHeadEmpty)
            {
                CKey arr_key = CKey.CreateArrayKey(inParent, line.Position);
                arr_key.AddTokenTail(line, inSupport.GetLogger());
                return(new Tuple <CKey, int>(arr_key, inStartLine + 1));
            }
            else
            {
                CKey key = null;
                if (inKeyAddingMode != EKeyAddingMode.AddUnique)
                {
                    key = inParent.FindChildKey(line.Head.Text);
                    if (key == null)
                    {
                        inSupport.GetLogger().LogError(EErrorCode.CantFindKey, line, $"Key name: {line.Head.Text}");
                    }
                    else
                    {
                        if (inKeyAddingMode == EKeyAddingMode.Override)
                        {
                            key.ClearComments();
                            key.ClearValues();
                        }

                        if (inKeyAddingMode == EKeyAddingMode.Override || inKeyAddingMode == EKeyAddingMode.Add)
                        {
                            key.AddTokenTail(line, inSupport.GetLogger());
                        }
                    }
                }
                else if (inParent.IsKeyWithNamePresent(line.Head.Text))
                {
                    inSupport.GetLogger().LogError(EErrorCode.ElementWithNameAlreadyPresent, line);
                }

                if (key == null)
                {
                    key = CKey.Create(inParent, line, inSupport.GetLogger());
                }

                int last_line = FindNextSameRankLine(inStartLine, inEndLine, key_rank, inLines);

                if (last_line > inStartLine + 1)
                {
                    EKeyAddingMode next_add_mode = inKeyAddingMode;
                    if (next_add_mode == EKeyAddingMode.Add)
                    {
                        next_add_mode = EKeyAddingMode.AddUnique;
                    }

                    CollectByDivs(key, key_rank, inStartLine + 1, last_line, inLines, inSupport, inRoot, next_add_mode);
                }

                if (key.KeyCount == 0 && key.ValuesCount == 0)
                {
                    inSupport.GetLogger().LogError(EErrorCode.HeadWithoutValues, line);
                }

                return(new Tuple <CKey, int>(key, last_line));
            }
        }
示例#5
0
        //inStartLine - next of parent line
        static void Collect(CKey inParent, int inParentRank, int inStartLine, int inEndLine, List <CTokenLine> inLines, ITreeBuildSupport inSupport,
                            CKey inRoot, EKeyAddingMode inKeyAddingMode)
        {
            CBuildCommands command_for_next_string = null;
            int            start = inStartLine;

            do
            {
                int        old_start = start;
                CTokenLine line      = inLines[start];
                if (line.IsCommandLine())
                {
                    if (line.Command == ECommands.Name)
                    {
                        if (line.CommandParams.Length < 1)
                        {
                            inSupport.GetLogger().LogError(EErrorCode.EmptyCommand, line);
                        }
                        else
                        {
                            if (inParent.IsArray && line.Rank == inParentRank)
                            {
                                if (!inParent.SetName(line.CommandParams[0]))
                                {
                                    inSupport.GetLogger().LogError(EErrorCode.DublicateKeyName, line);
                                }
                            }
                            else
                            {
                                //inSupport.GetLogger().LogError(EErrorCode.NextArrayKeyNameMissParent, line);
                                if (command_for_next_string == null)
                                {
                                    command_for_next_string = new CBuildCommands(inSupport.GetLogger());
                                }
                                command_for_next_string.SetNextArrayKeyName(line.CommandParams[0], line.Position.Line, inParent);
                            }
                        }
                    }
                    else if (line.Command == ECommands.Insert)
                    {
                        ExecuteCommand_Insert(inParent, line, inSupport, inRoot);
                    }
                    else if (line.Command == ECommands.Delete)
                    {
                        ExecuteCommand_Delete(inParent, line, inSupport);
                    }
                    else if (line.Command == ECommands.ChangeValue)
                    {
                        inParent.ChangeValues(line.CommandParams.GetDictionary());
                    }
                }
                else if (line.IsEmpty() && line.Comments != null)
                {
                    if (command_for_next_string == null)
                    {
                        command_for_next_string = new CBuildCommands(inSupport.GetLogger());
                    }
                    command_for_next_string.SetNextLineComment(line.Comments.Text, line.Position.Line, inParent);
                }
                else if (!line.IsEmpty())
                {
                    EKeyAddingMode adding_mode = inKeyAddingMode;
                    if (adding_mode == EKeyAddingMode.AddUnique && line.AdditionMode != EKeyAddingMode.AddUnique)
                    {
                        adding_mode = line.AdditionMode;
                    }

                    Tuple <CKey, int> new_key_new_line = CreateKey(start, inEndLine, inLines, inSupport, inRoot, inParent, adding_mode);

                    CKey new_key = new_key_new_line.Item1;

                    if (command_for_next_string != null && command_for_next_string.IsNextArrayKeyNamePresent)
                    {
                        if (!new_key.SetName(command_for_next_string.PopNextArrayKeyName(inParent)))
                        {
                            inSupport.GetLogger().LogError(EErrorCode.DublicateKeyName, line);
                        }
                    }

                    if (command_for_next_string != null && command_for_next_string.IsNextLineCommentPresent)
                    {
                        new_key.AddComments(command_for_next_string.PopNextLineComments(inParent));
                    }

                    //if (!new_key.IsArray && line.AdditionMode == EKeyAddingMode.AddUnique && inParent.IsKeyWithNamePresent(new_key.Name))
                    //    inSupport.GetLogger().LogError(EErrorCode.ElementWithNameAlreadyPresent, inLines[start]);

                    //if(line.AdditionMode == EKeyAddingMode.AddUnique)
                    //    new_key.SetParent(inParent);
                    //else if (line.AdditionMode == EKeyAddingMode.Override || line.AdditionMode == EKeyAddingMode.Add)
                    //{
                    //    if (line.AdditionMode == EKeyAddingMode.Override)
                    //    {
                    //        var pathes = new List<List<string>>();
                    //        new_key.GetTerminalPathes(pathes, new List<string>());

                    //        //for correct deleting array elems
                    //        for (int i = pathes.Count - 1; i >= 0; --i)
                    //        {
                    //            var path = pathes[i];
                    //            RemoveKeysByPath(inParent, path);
                    //        }
                    //    }

                    //    CKey child_key = inParent.FindChildKey(new_key.Name);
                    //    if (child_key != null)
                    //        child_key.MergeKey(new_key);
                    //    else
                    //        new_key.SetParent(inParent);
                    //}

                    start = new_key_new_line.Item2;
                }

                if (old_start == start)
                {
                    start++;
                }
            }while (start < inEndLine);
        }