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; }
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(); }