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; } }