Example #1
0
        /// <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>()));
        }
Example #2
0
 /// <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();
         }
     }
 }