Ejemplo n.º 1
0
        private TrackPart TrySymbol(TreeNode tnp, SymbolLineDefinitionItem si, int p)
        {
            SymbolDefinition sd;
            TrackPart part = new TrackPart();

            part.symbolType = si.type;
            part.symbolText = si.text;
            part.status = TrackStatus.FAILED;
            part.position = p;

            if (p >= FilteredSource.Count)
                return part;

            TreeNode tn;
            if (si.type == SymbolType.BY_SYMBOL)
            {
                if (successSymbols.ContainsKey(p))
                {
                    if (successSymbols[p].ContainsKey(si.text))
                    {
                        tn = PushNode(tnp, si.type + " " + si.text);
                        tn.ImageIndex = tn.SelectedImageIndex = 1;
                        TrackPart tpp = successSymbols[p][si.text];
                        part.end = tpp.end;
                        part.children = tpp.children;
                        part.status = TrackStatus.MATCHED;
                        return part;
                    }
                }
                if (failedSymbols.ContainsKey(si.text))
                {
                    if (failedSymbols[si.text].Contains(p))
                    {
                        tn = PushNode(tnp, si.type + " " + si.text);
                        tn.ImageIndex = tn.SelectedImageIndex = 2;
                        return part;
                    }
                }
            }

            tn = PushNode(tnp, "{0} {1} [pos {2}]", si.type, si.text, p);
            if (si.type == SymbolType.BY_TYPE)
            {
                SourceNode sn = InputSource[FilteredSource[p]];
                if (sn.type.Equals(si.text))
                {
                    part.status = TrackStatus.MATCHED;
                    part.end = p;
                }
            }
            else if (si.type == SymbolType.BY_VALUE)
            {
                SourceNode sn = InputSource[FilteredSource[p]];
                if (sn.value.Equals(si.text))
                {
                    part.status = TrackStatus.MATCHED;
                    part.end = p;
                }
            }
            else if (si.type == SymbolType.BY_SYMBOL && symbolsMap.ContainsKey(si.text))
            {
                sd = symbolsMap[si.text];
                foreach (SymbolLineDefinition line in sd.lines)
                {
                    if (MatchSymbolLine(p, part, tn, line))
                        break;
                }

                // we have matched line and lp with list of trackparts
                // now we should try recursive definitions, if there are any
                if (part.status == TrackStatus.MATCHED)
                {
                    part = MatchRecursiveLines(sd, part, tn);

                }
            }

            tn.Text = tn.Text + " [end " + part.end + "]";
            tn.ImageIndex = tn.SelectedImageIndex = (part.status == TrackStatus.MATCHED ? 1 : (part.status == TrackStatus.FAILED ? 2 : 0));

            if (si.type == SymbolType.BY_SYMBOL)
            {
                if (part.status == TrackStatus.FAILED)
                {
                    if (!failedSymbols.ContainsKey(si.text))
                        failedSymbols.Add(si.text, new HashSet<int>());
                    failedSymbols[si.text].Add(p);
                }
                else if (part.status == TrackStatus.MATCHED)
                {
                    if (!successSymbols.ContainsKey(p))
                        successSymbols.Add(p, new Dictionary<string, TrackPart>());
                    TrackPart tpp = new TrackPart();
                    tpp.children = part.children;
                    tpp.end = part.end;
                    successSymbols[p].Add(si.text, tpp);
                }
            }

            return part;
        }
Ejemplo n.º 2
0
        public override void Run()
        {
            OutputSource = new TrackPart();

            FilterInput();

            SymbolLineDefinitionItem si = new SymbolLineDefinitionItem();
            si.text = MainSymbol;
            si.type = SymbolType.BY_SYMBOL;
            OutputSource = TrySymbol(mainNode, si, 0);
            if (OutputSource.end < FilteredSource.Count)
                Message = "Error: file was not recognized completely, last matched index is " + OutputSource.end.ToString();
        }