public static ParserInterpreter DeriveTempParserInterpreter(Grammar g, Parser originalParser, ITokenStream tokens)
{
ParserInterpreter parser;
if (originalParser is ParserInterpreter)
{
Type c = originalParser.GetType();
try
{
parser = (ParserInterpreter)Activator.CreateInstance(originalParser.GetType(), g, originalParser.Atn, originalParser.InputStream);
}
catch (Exception e)
{
throw new ArgumentException("can't create parser to match incoming " + c.Name, e);
}
}
else
{
// must've been a generated parser
char[] serializedAtn = ATNSerializer.GetSerializedAsChars(originalParser.Atn, originalParser.RuleNames);
ATN deserialized = new ATNDeserializer().Deserialize(serializedAtn);
parser = new ParserInterpreter(originalParser.GrammarFileName,
originalParser.Vocabulary,
originalParser.RuleNames,
deserialized,
tokens);
}
parser.SetInputStream(tokens);
// Make sure that we don't get any error messages from using this temporary parser
parser.ErrorHandler = new BailErrorStrategy();
parser.RemoveErrorListeners();
parser.RemoveParseListeners();
parser.Interpreter.PredictionMode = PredictionMode.LlExactAmbigDetection;
return parser;
}