/// <summary> /// Handles the actual parsing. /// </summary> /// <param name="work">The work item to parse.</param> /// <returns>A new <see cref="ParserResult" />.</returns> private ParserResult HandleParsing(ParserWorkItem work) { var errorListener = new TestingErrorListener(); var analyzer = new Analyzer(); var options = work.Options; var trace = options.HasFlag(ParseOption.Trace); if (trace) { options ^= ParseOption.Trace; } var parser = analyzer.BuildParserWithOptions(work.Grammar, work.Text, options); GuiTraceListener parseTreeListener = null; if (trace) { parseTreeListener = new GuiTraceListener(parser); parser.AddParseListener(parseTreeListener); } parser.RemoveErrorListeners(); parser.AddErrorListener(errorListener); analyzer.ExecuteParsing(parser, work.ParserRuleName); return(new ParserResult(analyzer.SyntaxTokens, analyzer.ParserContext, work.ParserRuleName, errorListener.Errors, trace ? parseTreeListener.Events : new List <TraceEvent>())); }
/// <inheritdoc /> public void Parse(GrammarReference grammar, string parserRuleName, string text, ParseOption options) { lock (_Padlock) { var nextRun = CalculateNextRunTime(_PreviousNodeQty, 50, 5, 1000); var work = new ParserWorkItem(grammar, parserRuleName, text, options, nextRun); QueuedWork.Enqueue(work); _LastQueuedTime = DateTime.Now; if (ParserTask.IsCompleted) { ParserTask = new Task(ParserWorkLoop); } if (ParserTask.Status != TaskStatus.Running) { ParserTask.Start(); } } }