Example #1
0
        private bool DoParse(bool useParallelTasks = true)
        {
            // put this in for debugging so we aren't running parallel "tasks"
            //sentences.RemoveRange(0, 2);
            //sentences.RemoveRange(1, sentences.Count-1);

            try
            {
                if (useParallelTasks)
                {
                    Parallel.For(0, sentences.Count, new ParallelOptions()
                    {
                        MaxDegreeOfParallelism = -1
                    }, i =>
                    {
                        var goal1     = new Goal(new Symbol("Sentence"), 0, sentences[i].Count);
                        var ruleTree  = new TFTree <Rule>();
                        ruleTree.Root =
                            new TFTreeNode <Rule>(
                                ruleCollection.Rules.ElementAt(0).Value as Rule);
                        var ruleRangeStack    = new Stack <RuleRange>();
                        var goalStack         = new Stack <Goal>();
                        var ruleInputMapStack = new Stack <RuleInputMap>();
                        var parseTreeTopNode  =
                            new TFTreeNode <ParseTreeNodeData>(new ParseTreeNodeData(goal1, null));
                        var parseTree = new TFTree <ParseTreeNodeData>()
                        {
                            Root     = parseTreeTopNode,
                            XSLTFile = @"file:///D:/Temp/XMLPrettyPrint.xsl"
                        };
                        if (goal1.NewProcess(sentences[i], 0, goalStack, ruleRangeStack,
                                             ruleInputMapStack, parseTreeTopNode,
                                             ruleTree.Root,
                                             null, ruleCollection))
                        {
                            parseTrees[i] = parseTree;

#if DEBUG_PARSER
                            textBox1.AppendText(
                                " \n---- rule input map stack ----------------------\n");
                            foreach (RuleInputMap ruleInputMap in ruleInputMapStack)
                            {
                                textBox1.AppendText(ruleInputMap.ToString(sentence) +
                                                    Environment.NewLine);
                            }

                            textBox1.AppendText(
                                " \n---- rule range stack ----------------------\n");
                            foreach (RuleRange ruleRange in ruleRangeStack)
                            {
                                textBox1.AppendText(ruleRange.TheRule + " (" +
                                                    String.Join(", ",
                                                                sentence.GetRange(
                                                                    ruleRange.InputPos,
                                                                    ruleRange.Length)) +
                                                    ")" + Environment.NewLine);
                            }

                            textBox1.AppendText(" \n---- goal stack ----------------------\n");
                            foreach (Goal goal in goalStack)
                            {
                                textBox1.AppendText(goal.Symbol.TheSymbol + " (" +
                                                    String.Join(", ",
                                                                sentence.GetRange(
                                                                    goal.InputPos, goal.Length)) +
                                                    ")" +
                                                    Environment.NewLine);
                            }

                            textBox1.AppendText(" \n--------------------------\n");
                            long endTime = Stopwatch.GetTimestamp();
                            //var numNodes = parseTreeTopNode.GetDepthFirstEnumerable(TreeTraversalDirection.TopDown).Count();
                            //textBox1.AppendText(String.Format("Elapsed Time: {0}ms, # Nodes: {1}", 1000*(endTime-startTime)/Stopwatch.Frequency, numNodes));
                            //textBox1.Text = topNode.ToString(true);
#endif
                        }
                        else
                        {
                            DebugAndTraceHelper.WriteTraceLine(String.Format("Could not parse {0}", String.Join(" ", sentences[i].Select(n => n.Lexeme.ToString()))));
                            DebugAndTraceHelper.WriteTraceLine(String.Format("                {0}", String.Join(" ", sentences[i].Select(n => n.ToString()))));
                        }
                    });
                }
                else  // do a serial parsing
                {
                    int sentenceCount = 0;
                    foreach (List <Token> sentence in sentences)
                    {
                        var goal1    = new Goal(new Symbol("Sentence"), 0, sentences[sentenceCount].Count);
                        var ruleTree = new TFTree <Rule>();
                        ruleTree.Root =
                            new TFTreeNode <Rule>(
                                ruleCollection.Rules.ElementAt(0).Value as Rule);
                        var ruleRangeStack    = new Stack <RuleRange>();
                        var goalStack         = new Stack <Goal>();
                        var ruleInputMapStack = new Stack <RuleInputMap>();
                        var parseTreeTopNode  =
                            new TFTreeNode <ParseTreeNodeData>(new ParseTreeNodeData(goal1, null));
                        var parseTree = new TFTree <ParseTreeNodeData>()
                        {
                            Root     = parseTreeTopNode,
                            XSLTFile = @"file:///D:/Temp/XMLPrettyPrint.xsl"
                        };
                        if (goal1.NewProcess(sentences[sentenceCount], 0, goalStack, ruleRangeStack,
                                             ruleInputMapStack, parseTreeTopNode,
                                             ruleTree.Root,
                                             null, ruleCollection))
                        {
                            parseTrees[sentenceCount] = parseTree;
                        }

                        sentenceCount++;
                    }
                }

                return(true);
            }
            catch (Exception)
            {
                throw;
            }
        }