@@ -14,7 +14,7 namespace Implab.Automaton.RegularExpres | |||||
14 | } |
|
14 | } | |
15 |
|
15 | |||
16 | public EndToken() |
|
16 | public EndToken() | |
17 |
: this( |
|
17 | : this(default(TTag)) { | |
18 | } |
|
18 | } | |
19 |
|
19 | |||
20 | public TTag Tag { |
|
20 | public TTag Tag { |
@@ -122,7 +122,7 namespace Implab.Automaton.RegularExpres | |||||
122 | m_ends.Add(m_idx, token.Tag); |
|
122 | m_ends.Add(m_idx, token.Tag); | |
123 | } |
|
123 | } | |
124 |
|
124 | |||
125 |
public void BuildDFA(IDFATableBuilder |
|
125 | public void BuildDFA(IDFATableBuilder dfa) { | |
126 | Safe.ArgumentNotNull(dfa,"dfa"); |
|
126 | Safe.ArgumentNotNull(dfa,"dfa"); | |
127 |
|
127 | |||
128 | var states = new MapAlphabet<HashSet<int>>(new CustomEqualityComparer<HashSet<int>>( |
|
128 | var states = new MapAlphabet<HashSet<int>>(new CustomEqualityComparer<HashSet<int>>( | |
@@ -165,7 +165,7 namespace Implab.Automaton.RegularExpres | |||||
165 |
|
165 | |||
166 | queue.Enqueue(next); |
|
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 | using System; |
|
1 | using System; | |
|
2 | using System.Collections.Generic; | |||
|
3 | using System.Linq; | |||
2 |
|
4 | |||
3 | namespace Implab.Automaton.RegularExpressions { |
|
5 | namespace Implab.Automaton.RegularExpressions { | |
4 | public class RegularDFADefinition<TInput, TTag> : DFATable { |
|
6 | public class RegularDFADefinition<TInput, TTag> : DFATable { | |
5 |
|
7 | |||
|
8 | readonly Dictionary<int,TTag[]> m_tags = new Dictionary<int, TTag[]>(); | |||
6 | readonly IAlphabet<TInput> m_alphabet; |
|
9 | readonly IAlphabet<TInput> m_alphabet; | |
7 |
|
10 | |||
8 | public RegularDFADefinition(IAlphabet<TInput> alphabet) { |
|
11 | public RegularDFADefinition(IAlphabet<TInput> alphabet) { | |
@@ -25,16 +28,39 namespace Implab.Automaton.RegularExpres | |||||
25 | return base.ConstructTransitionTable(); |
|
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 | /// <summary> |
|
46 | /// <summary> | |
29 | /// Optimize the specified alphabet. |
|
47 | /// Optimize the specified alphabet. | |
30 | /// </summary> |
|
48 | /// </summary> | |
31 | /// <param name = "dfaTable"></param> |
|
|||
32 | /// <param name="alphabet">Пустой алфавит, который будет зполнен в процессе оптимизации.</param> |
|
49 | /// <param name="alphabet">Пустой алфавит, который будет зполнен в процессе оптимизации.</param> | |
33 |
public |
|
50 | public RegularDFADefinition<TInput,TTag> Optimize(IAlphabetBuilder<TInput> alphabet) { | |
34 | Safe.ArgumentNotNull(alphabet, "alphabet"); |
|
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 | <Compile Include="Automaton\IDFATable.cs" /> |
|
190 | <Compile Include="Automaton\IDFATable.cs" /> | |
191 | <Compile Include="Automaton\IDFATableBuilder.cs" /> |
|
191 | <Compile Include="Automaton\IDFATableBuilder.cs" /> | |
192 | <Compile Include="Automaton\DFATable.cs" /> |
|
192 | <Compile Include="Automaton\DFATable.cs" /> | |
193 | <Compile Include="Automaton\RegularExpressions\IDFATable2.cs" /> |
|
|||
194 | </ItemGroup> |
|
193 | </ItemGroup> | |
195 | <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> |
|
194 | <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> | |
196 | <ItemGroup /> |
|
195 | <ItemGroup /> |
1 | NO CONTENT: file was removed |
|
NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now