using System;
using System.Collections.Generic;
using Antlr4.Runtime.Atn;
using Antlr4.Runtime.Sharpen;
namespace Antlr4.Runtime.Dfa
{
public class DFA
{
public Dictionary<DFAState, DFAState> states = new Dictionary<DFAState, DFAState>();
public DFAState s0;
public int decision;
public DecisionState atnStartState;
private bool precedenceDfa;
public DFA(DecisionState atnStartState)
: this(atnStartState, 0)
{
}
public DFA(DecisionState atnStartState, int decision)
{
this.atnStartState = atnStartState;
this.decision = decision;
this.precedenceDfa = false;
if (atnStartState is StarLoopEntryState && ((StarLoopEntryState)atnStartState).isPrecedenceDecision)
{
this.precedenceDfa = true;
DFAState precedenceState = new DFAState(new ATNConfigSet());
precedenceState.edges = Collections.EmptyList<DFAState>();
precedenceState.isAcceptState = false;
precedenceState.requiresFullContext = false;
this.s0 = precedenceState;
}
}
public bool IsPrecedenceDfa
{
get
{
return precedenceDfa;
}
}
public DFAState GetPrecedenceStartState(int precedence)
{
if (!IsPrecedenceDfa)
{
throw new Exception("Only precedence DFAs may contain a precedence start state.");
}
if (precedence < 0 || precedence >= s0.edges.Length)
{
return null;
}
return s0.edges[precedence];
}
public void SetPrecedenceStartState(int precedence, DFAState startState)
{
if (!IsPrecedenceDfa)
{
throw new Exception("Only precedence DFAs may contain a precedence start state.");
}
if (precedence < 0)
{
return;
}
lock (s0)
{
if (precedence >= s0.edges.Length)
{
s0.edges = Arrays.CopyOf(s0.edges, precedence + 1);
}
s0.edges[precedence] = startState;
}
}
public List<DFAState> GetStates()
{
List<DFAState> result = new List<DFAState>(states.Keys);
result.Sort((x, y) => x.stateNumber - y.stateNumber);
return result;
}
public override String ToString() { return ToString(Vocabulary.EmptyVocabulary); }
public String ToString(IVocabulary vocabulary)
{
if (s0 == null)
{
return "";
}
DFASerializer serializer = new DFASerializer(this, vocabulary);
return serializer.ToString();
}
public String ToLexerString()
{
if (s0 == null)
return "";
DFASerializer serializer = new LexerDFASerializer(this);
return serializer.ToString();
}
}
}