Mercurial > pub > ImplabNet
diff Implab/Automaton/RegularExpressions/RegularExpressionVisitorT.cs @ 178:d5c5db0335ee ref20160224
working on JSON parser
author | cin |
---|---|
date | Wed, 23 Mar 2016 19:51:45 +0300 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Implab/Automaton/RegularExpressions/RegularExpressionVisitorT.cs Wed Mar 23 19:51:45 2016 +0300 @@ -0,0 +1,37 @@ +using Implab; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace Implab.Automaton.RegularExpressions { + /// <summary> + /// </summary> + public class RegularExpressionVisitor<TTag> : RegularExpressionVisitor { + readonly Dictionary<int, TTag> m_tags = new Dictionary<int, TTag>(); + + readonly ITaggedDFABuilder<TTag> m_builder; + + public RegularExpressionVisitor(ITaggedDFABuilder<TTag> builder) : base(builder) { + m_builder = builder; + } + + public override void Visit(EndToken token) { + base.Visit(token); + var tagged = token as EndToken<TTag>; + if (tagged != null) + m_tags.Add(Index, tagged.Tag); + } + + protected override void MarkFinalState(HashSet<int> state) { + base.MarkFinalState(state); + m_builder.SetStateTag(Translate(state), GetStateTags(state)); + } + + TTag[] GetStateTags(IEnumerable<int> state) { + Debug.Assert(state != null); + return state.Where(m_tags.ContainsKey).Select(pos => m_tags[pos]).ToArray(); + } + + } +}