public virtual string AsString()
{
if (start == null)
return null;
marked = new HashSet<ATNState>();
work = new List<ATNState>();
work.Add(start);
StringBuilder buf = new StringBuilder();
ATNState s;
while (work.Count > 0)
{
s = work[0];
work.RemoveAt(0);
if (marked.Contains(s))
continue;
int n = s.NumberOfTransitions;
//System.Console.WriteLine("visit " + s + "; edges=" + n);
marked.Add(s);
for (int i = 0; i < n; i++)
{
Transition t = s.Transition(i);
if (!(s is RuleStopState))
{ // don't add follow states to work
if (t is RuleTransition)
work.Add(((RuleTransition)t).followState);
else
work.Add(t.target);
}
buf.Append(GetStateString(s));
if (t is EpsilonTransition)
{
buf.Append("->").Append(GetStateString(t.target)).Append('\n');
}
else if (t is RuleTransition)
{
buf.Append("-").Append(g.GetRule(((RuleTransition)t).ruleIndex).name).Append("->").Append(GetStateString(t.target)).Append('\n');
}
else if (t is ActionTransition)
{
ActionTransition a = (ActionTransition)t;
buf.Append("-").Append(a.ToString()).Append("->").Append(GetStateString(t.target)).Append('\n');
}
else if (t is SetTransition)
{
SetTransition st = (SetTransition)t;
bool not = st is NotSetTransition;
if (g.IsLexer())
{
buf.Append("-").Append(not ? "~" : "").Append(st.ToString()).Append("->").Append(GetStateString(t.target)).Append('\n');
}
else
{
buf.Append("-").Append(not ? "~" : "").Append(st.Label.ToString(g.GetVocabulary())).Append("->").Append(GetStateString(t.target)).Append('\n');
}
}
else if (t is AtomTransition)
{
AtomTransition a = (AtomTransition)t;
string label = g.GetTokenDisplayName(a.label);
buf.Append("-").Append(label).Append("->").Append(GetStateString(t.target)).Append('\n');
}
else
{
buf.Append("-").Append(t.ToString()).Append("->").Append(GetStateString(t.target)).Append('\n');
}
}
}
return buf.ToString();
}