示例#1
0
 public void AddValue(SourceEntity node)
 {
     if (node != null)
     {
         Value.AddRange(node.Value);
     }
 }
示例#2
0
 public void AddItem(SourceEntity item)
 {
     if (item != null)
     {
         Items.Add(item);
     }
 }
示例#3
0
 public void AddSubItems(SourceEntity item)
 {
     if (item != null)
     {
         if (item is SourceEntityUniformSet)
         {
             this.UniformSet          = item.UniformSet;
             this.UniformSet.Location = item.Location;
             UniformSet.RangeStart    = Items.Count;
             UniformSet.RangeEnd      = UniformSet.RangeStart + item.Items.Count;
         }
         Items.AddRange(item.Items);
     }
 }
示例#4
0
        /// <summary>
        /// Преобразование дерева из парсера в рабочее дерево
        /// </summary>
        /// <param name="s">Корень аспектного дерева</param>
        /// <param name="FileName">относительный путь к файлу, содержащему данный подаспект</param>
        private PointOfInterest ConvertSourceEntityToPointOfInterest(SourceEntity s, string FileName)
        {
            if (s == null)
            {
                return(null);
            }
            PointOfInterest res = new PointOfInterest(s.Location);

            res.Context.Add(new OuterContextNode(s.Value, s.GetType().Name));
            if (s.Value != null && s.Value.Count != 0)
            {
                res.Title = string.Join(" ", s.Value);
            }
            res.FileName = FileName;
            res.ID       = s.Name;
            foreach (SourceEntity se in s.Items)
            {
                res.Items.Add(ConvertSourceEntityToPointOfInterest(se, FileName));
            }
            return(res);
        }
示例#5
0
        /// <summary>
        /// Парсинг текста.
        /// Этой функцией можно вызывать парсинг открытого существующего файла, если он изменен и еще не сохранен, получив его обновленное содержимое из среды разработки.
        /// </summary>
        /// <param name="Text">Текст</param>
        /// <param name="FileName">Имя файла. Должно содержать как минимум расширение для корректного выбора парсера.
        /// Имя файла будет сохранено в узлах аспектного дерева</param>
        /// <returns>Корень дерева</returns>
        public PointOfInterest ParseText(string Text, string FileName)
        {
            string LangID = FilenameToLangID(FileName);
            ILightWeightScanner   Scanner;
            LightweightParserBase Parser;

            if (scanners.ContainsKey(LangID) && parsers.ContainsKey(LangID))
            {
                Scanner = scanners[LangID];
                Parser  = parsers[LangID];
            }
            else if (DefaultParser != null && DefaultScanner != null)
            {
                Scanner = DefaultScanner;
                Parser  = DefaultParser;
            }
            else
            {
                GlobalData.traceAction("Нет парсера для файлов " + LangID);
                return(null);
            }
            Scanner.SetSource(Text);
            Parser.Parse();
            SourceEntity result = Parser.Root;

            if (result == null)
            {
                return(null);
            }
            PointOfInterest rootPt = ConvertSourceEntityToPointOfInterest(result, FileName);

            SetContext(rootPt);
            _LastTimeErrors.Clear();
            foreach (SourceEntity se in Parser.Errors)
            {
                _LastTimeErrors.Add(ConvertSourceEntityToPointOfInterest(se, FileName));
            }
            return(rootPt);
        }