forked from jasder/antlr
Fix DFA edge maps
This commit is contained in:
parent
4eb4194f5f
commit
00b8db4e2b
|
@ -27,6 +27,7 @@
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Antlr4.Runtime.Dfa;
|
using Antlr4.Runtime.Dfa;
|
||||||
using Sharpen;
|
using Sharpen;
|
||||||
|
@ -51,24 +52,46 @@ namespace Antlr4.Runtime.Dfa
|
||||||
|
|
||||||
public abstract Antlr4.Runtime.Dfa.AbstractEdgeMap<T> Put(int key, T value);
|
public abstract Antlr4.Runtime.Dfa.AbstractEdgeMap<T> Put(int key, T value);
|
||||||
|
|
||||||
public virtual Antlr4.Runtime.Dfa.AbstractEdgeMap<T> PutAll<_T0>(IEdgeMap<_T0> m)
|
IEdgeMap<T> IEdgeMap<T>.Put(int key, T value)
|
||||||
where _T0:T
|
{
|
||||||
|
return Put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Antlr4.Runtime.Dfa.AbstractEdgeMap<T> PutAll(IEdgeMap<T> m)
|
||||||
{
|
{
|
||||||
Antlr4.Runtime.Dfa.AbstractEdgeMap<T> result = this;
|
Antlr4.Runtime.Dfa.AbstractEdgeMap<T> result = this;
|
||||||
foreach (KeyValuePair<int, _T0> entry in m.EntrySet())
|
foreach (KeyValuePair<int, T> entry in m)
|
||||||
{
|
{
|
||||||
result = result.Put(entry.Key, entry.Value);
|
result = result.Put(entry.Key, entry.Value);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEdgeMap<T> IEdgeMap<T>.PutAll(IEdgeMap<T> m)
|
||||||
|
{
|
||||||
|
return PutAll(m);
|
||||||
|
}
|
||||||
|
|
||||||
public abstract Antlr4.Runtime.Dfa.AbstractEdgeMap<T> Clear();
|
public abstract Antlr4.Runtime.Dfa.AbstractEdgeMap<T> Clear();
|
||||||
|
|
||||||
|
IEdgeMap<T> IEdgeMap<T>.Clear()
|
||||||
|
{
|
||||||
|
return Clear();
|
||||||
|
}
|
||||||
|
|
||||||
public abstract Antlr4.Runtime.Dfa.AbstractEdgeMap<T> Remove(int key);
|
public abstract Antlr4.Runtime.Dfa.AbstractEdgeMap<T> Remove(int key);
|
||||||
|
|
||||||
|
IEdgeMap<T> IEdgeMap<T>.Remove(int key)
|
||||||
|
{
|
||||||
|
return Remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
public abstract bool ContainsKey(int arg1);
|
public abstract bool ContainsKey(int arg1);
|
||||||
|
|
||||||
public abstract T Get(int arg1);
|
public abstract T this[int arg1]
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract bool IsEmpty
|
public abstract bool IsEmpty
|
||||||
{
|
{
|
||||||
|
@ -80,7 +103,7 @@ namespace Antlr4.Runtime.Dfa
|
||||||
get;
|
get;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract IDictionary<int, T> ToMap();
|
public abstract IReadOnlyDictionary<int, T> ToMap();
|
||||||
|
|
||||||
public virtual IEnumerator<KeyValuePair<int, T>> GetEnumerator()
|
public virtual IEnumerator<KeyValuePair<int, T>> GetEnumerator()
|
||||||
{
|
{
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
using Antlr4.Runtime.Dfa;
|
using Antlr4.Runtime.Dfa;
|
||||||
using Sharpen;
|
using Sharpen;
|
||||||
|
|
||||||
|
@ -106,7 +107,7 @@ namespace Antlr4.Runtime.Dfa
|
||||||
return ((Antlr4.Runtime.Dfa.ArrayEdgeMap<T>)Put(key, null));
|
return ((Antlr4.Runtime.Dfa.ArrayEdgeMap<T>)Put(key, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
public override AbstractEdgeMap<T> PutAll<_T0>(IEdgeMap<_T0> m)
|
public override AbstractEdgeMap<T> PutAll(IEdgeMap<T> m)
|
||||||
{
|
{
|
||||||
if (m.IsEmpty)
|
if (m.IsEmpty)
|
||||||
{
|
{
|
||||||
|
@ -167,7 +168,7 @@ namespace Antlr4.Runtime.Dfa
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IDictionary<int, T> ToMap()
|
public override IReadOnlyDictionary<int, T> ToMap()
|
||||||
{
|
{
|
||||||
if (IsEmpty)
|
if (IsEmpty)
|
||||||
{
|
{
|
||||||
|
@ -182,7 +183,7 @@ namespace Antlr4.Runtime.Dfa
|
||||||
}
|
}
|
||||||
result[i + minIndex] = arrayData[i];
|
result[i + minIndex] = arrayData[i];
|
||||||
}
|
}
|
||||||
return result;
|
return new ReadOnlyDictionary<int, T>(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,8 @@
|
||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Antlr4.Runtime.Atn;
|
using Antlr4.Runtime.Atn;
|
||||||
using Antlr4.Runtime.Dfa;
|
using Antlr4.Runtime.Dfa;
|
||||||
|
@ -216,7 +218,7 @@ namespace Antlr4.Runtime.Dfa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual IDictionary<int, DFAState> EdgeMap
|
public virtual IReadOnlyDictionary<int, DFAState> EdgeMap
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -257,7 +259,7 @@ namespace Antlr4.Runtime.Dfa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual IDictionary<int, DFAState> ContextEdgeMap
|
public virtual IReadOnlyDictionary<int, DFAState> ContextEdgeMap
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -265,26 +267,19 @@ namespace Antlr4.Runtime.Dfa
|
||||||
{
|
{
|
||||||
return Sharpen.Collections.EmptyMap<int, DFAState>();
|
return Sharpen.Collections.EmptyMap<int, DFAState>();
|
||||||
}
|
}
|
||||||
IDictionary<int, DFAState> map = contextEdges.ToMap();
|
IReadOnlyDictionary<int, DFAState> map = contextEdges.ToMap();
|
||||||
if (map.ContainsKey(-1))
|
if (map.ContainsKey(-1))
|
||||||
{
|
{
|
||||||
if (map.Count == 1)
|
if (map.Count == 1)
|
||||||
{
|
{
|
||||||
return Sharpen.Collections.SingletonMap(PredictionContext.EmptyFullStateKey, map.
|
return Sharpen.Collections.SingletonMap(PredictionContext.EmptyFullStateKey, map[-1]);
|
||||||
Get(-1));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
try
|
Dictionary<int, DFAState> result = map.ToDictionary(i => i.Key, i => i.Value);
|
||||||
{
|
result.Add(PredictionContext.EmptyFullStateKey, result[-1]);
|
||||||
map.Put(PredictionContext.EmptyFullStateKey, Sharpen.Collections.Remove(map, -1));
|
result.Remove(-1);
|
||||||
}
|
map = new ReadOnlyDictionary<int, DFAState>(new SortedDictionary<int, DFAState>(result));
|
||||||
catch (NotSupportedException)
|
|
||||||
{
|
|
||||||
// handles read only, non-singleton maps
|
|
||||||
map = new SortedDictionary<int, DFAState>(map);
|
|
||||||
map.Put(PredictionContext.EmptyFullStateKey, Sharpen.Collections.Remove(map, -1));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
|
|
|
@ -61,12 +61,12 @@ namespace Antlr4.Runtime.Dfa
|
||||||
IEdgeMap<T> Remove(int key);
|
IEdgeMap<T> Remove(int key);
|
||||||
|
|
||||||
[return: NotNull]
|
[return: NotNull]
|
||||||
IEdgeMap<T> PutAll<_T0>(IEdgeMap<_T0> m) where _T0:T;
|
IEdgeMap<T> PutAll(IEdgeMap<T> m);
|
||||||
|
|
||||||
[return: NotNull]
|
[return: NotNull]
|
||||||
IEdgeMap<T> Clear();
|
IEdgeMap<T> Clear();
|
||||||
|
|
||||||
[return: NotNull]
|
[return: NotNull]
|
||||||
IDictionary<int, T> ToMap();
|
IReadOnlyDictionary<int, T> ToMap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,7 +149,7 @@ namespace Antlr4.Runtime.Dfa
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IDictionary<int, T> ToMap()
|
public override IReadOnlyDictionary<int, T> ToMap()
|
||||||
{
|
{
|
||||||
if (IsEmpty)
|
if (IsEmpty)
|
||||||
{
|
{
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
*/
|
*/
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
using Antlr4.Runtime.Dfa;
|
using Antlr4.Runtime.Dfa;
|
||||||
using Sharpen;
|
using Sharpen;
|
||||||
|
|
||||||
|
@ -200,7 +201,7 @@ namespace Antlr4.Runtime.Dfa
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IDictionary<int, T> ToMap()
|
public override IReadOnlyDictionary<int, T> ToMap()
|
||||||
{
|
{
|
||||||
if (IsEmpty)
|
if (IsEmpty)
|
||||||
{
|
{
|
||||||
|
@ -211,7 +212,7 @@ namespace Antlr4.Runtime.Dfa
|
||||||
{
|
{
|
||||||
result[keys[i]] = values[i];
|
result[keys[i]] = values[i];
|
||||||
}
|
}
|
||||||
return result;
|
return new ReadOnlyDictionary<int, T>(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue