view Implab/Automaton/RegularExpressions/RegularExpressionVisitorT.cs @ 212:a01d9df88d74 v2

Added class Trace<T> to manage channels for individual classes, if SomeClass uses Trace<SomeClass> it sould be marked with TraceSourceAttribute
author cin
date Tue, 04 Apr 2017 12:04:05 +0300
parents d5c5db0335ee
children
line wrap: on
line source

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

    }
}