@@ -14,7 +14,7 namespace Implab.Automaton.RegularExpres | |||
|
14 | 14 | } |
|
15 | 15 | |
|
16 | 16 | public EndToken() |
|
17 |
: this( |
|
|
17 | : this(default(TTag)) { | |
|
18 | 18 | } |
|
19 | 19 | |
|
20 | 20 | public TTag Tag { |
@@ -122,7 +122,7 namespace Implab.Automaton.RegularExpres | |||
|
122 | 122 | m_ends.Add(m_idx, token.Tag); |
|
123 | 123 | } |
|
124 | 124 | |
|
125 |
public void BuildDFA(IDFATableBuilder |
|
|
125 | public void BuildDFA(IDFATableBuilder dfa) { | |
|
126 | 126 | Safe.ArgumentNotNull(dfa,"dfa"); |
|
127 | 127 | |
|
128 | 128 | var states = new MapAlphabet<HashSet<int>>(new CustomEqualityComparer<HashSet<int>>( |
@@ -165,7 +165,7 namespace Implab.Automaton.RegularExpres | |||
|
165 | 165 | |
|
166 | 166 | queue.Enqueue(next); |
|
167 | 167 | } |
|
168 |
dfa. |
|
|
168 | dfa.Add(new AutomatonTransition(s1, s2, a)); | |
|
169 | 169 | } |
|
170 | 170 | } |
|
171 | 171 | } |
@@ -1,8 +1,11 | |||
|
1 | 1 | using System; |
|
2 | using System.Collections.Generic; | |
|
3 | using System.Linq; | |
|
2 | 4 | |
|
3 | 5 | namespace Implab.Automaton.RegularExpressions { |
|
4 | 6 | public class RegularDFADefinition<TInput, TTag> : DFATable { |
|
5 | 7 | |
|
8 | readonly Dictionary<int,TTag[]> m_tags = new Dictionary<int, TTag[]>(); | |
|
6 | 9 | readonly IAlphabet<TInput> m_alphabet; |
|
7 | 10 | |
|
8 | 11 | public RegularDFADefinition(IAlphabet<TInput> alphabet) { |
@@ -25,16 +28,39 namespace Implab.Automaton.RegularExpres | |||
|
25 | 28 | return base.ConstructTransitionTable(); |
|
26 | 29 | } |
|
27 | 30 | |
|
31 | public void MarkFinalState(int s, TTag[] tags) { | |
|
32 | MarkFinalState(s); | |
|
33 | SetStateTag(s, tags); | |
|
34 | } | |
|
35 | ||
|
36 | public void SetStateTag(int s, TTag[] tags) { | |
|
37 | Safe.ArgumentNotNull(tags, "tags"); | |
|
38 | m_tags[s] = tags; | |
|
39 | } | |
|
40 | ||
|
41 | public TTag[] GetStateTag(int s) { | |
|
42 | TTag[] tags; | |
|
43 | return m_tags.TryGetValue(s, out tags) ? tags : new TTag[0]; | |
|
44 | } | |
|
45 | ||
|
28 | 46 | /// <summary> |
|
29 | 47 | /// Optimize the specified alphabet. |
|
30 | 48 | /// </summary> |
|
31 | /// <param name = "dfaTable"></param> | |
|
32 | 49 | /// <param name="alphabet">Пустой алфавит, который будет зполнен в процессе оптимизации.</param> |
|
33 |
public |
|
|
50 | public RegularDFADefinition<TInput,TTag> Optimize(IAlphabetBuilder<TInput> alphabet) { | |
|
34 | 51 | Safe.ArgumentNotNull(alphabet, "alphabet"); |
|
35 | Safe.ArgumentNotNull(dfaTable, "dfaTable"); | |
|
52 | ||
|
53 | var dfaTable = new RegularDFADefinition<TInput, TTag>(alphabet); | |
|
54 | ||
|
55 | var states = new DummyAlphabet(StateCount); | |
|
56 | var map = new MapAlphabet<int>(); | |
|
36 | 57 | |
|
37 |
Optimize(dfaTable, InputAlphabet, alphabet, |
|
|
58 | Optimize(dfaTable, InputAlphabet, alphabet, states, map); | |
|
59 | ||
|
60 | foreach (var g in m_tags.Where(x => x.Key < StateCount).GroupBy(x => map.Translate(x.Key), x => x.Value )) | |
|
61 | dfaTable.SetStateTag(g.Key, g.SelectMany(x => x).ToArray()); | |
|
62 | ||
|
63 | return dfaTable; | |
|
38 | 64 | } |
|
39 | 65 | |
|
40 | 66 |
@@ -190,7 +190,6 | |||
|
190 | 190 | <Compile Include="Automaton\IDFATable.cs" /> |
|
191 | 191 | <Compile Include="Automaton\IDFATableBuilder.cs" /> |
|
192 | 192 | <Compile Include="Automaton\DFATable.cs" /> |
|
193 | <Compile Include="Automaton\RegularExpressions\IDFATable2.cs" /> | |
|
194 | 193 | </ItemGroup> |
|
195 | 194 | <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> |
|
196 | 195 | <ItemGroup /> |
|
1 | NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now