private ail.net.parser.EarleyParser.Item AddItem(ail.net.parser.EarleyParser.CoreItem xi_core_item, // core_item ail.net.parser.EarleyParser.Chart xi_orig_chart, // original chart recognition started ail.net.parser.EarleyParser.Chart xi_master_chart, // chart to add to ail.net.parser.EarleyParser.Item xi_lptr_item, // l-ptr ail.net.parser.EarleyParser.EFlags xi_action, // action introduced this item int xi_error_cost, // error cost bool xi_check_existence) { // no args assertion!!! ItemKey key; key.CoreItem = xi_core_item; key.OriginalChart = xi_orig_chart; key.Lptr = xi_lptr_item; ail.net.parser.EarleyParser.Item result = xi_check_existence ? (ail.net.parser.EarleyParser.Item)xi_master_chart.Items[key] : null; if (result == (object)null) { result = new ail.net.parser.EarleyParser.Item(); #if PRINT_STATS result.Id = xi_master_chart.Items.Count; #endif result.CoreItem = xi_core_item; result.OriginalChart = xi_orig_chart; result.MasterChart = xi_master_chart; result.Lptr = xi_lptr_item; result.Rptrs = new Hashtable(); result.Flags = (uint)xi_action; xi_master_chart.Items.Add(key, result); // update optimization lists if (result.CoreItem.Dot == result.CoreItem.Rule.Rhs.Count || ((ail.net.parser.GrammarSymbol)result.CoreItem.Rule.Rhs[0]).Id == (int)ail.net.parser.Token.EType.eEpsilon) { result.MasterChart.CompleterItems.Add(result); ExecuteCompleter = (xi_action & ail.net.parser.EarleyParser.EFlags.ePredictor) != 0 || (xi_action & ail.net.parser.EarleyParser.EFlags.eScanner) != 0; } else // if(result.CoreItem.Dot < result.CoreItem.Rule.Rhs.Count) { if (((ail.net.parser.GrammarSymbol)result.CoreItem.Rule.Rhs[result.CoreItem.Dot]).IsNonTerminal()) { if (!PredictedNonTerminals[((ail.net.parser.GrammarSymbol)result.CoreItem.Rule.Rhs[result.CoreItem.Dot]).Id]) { result.MasterChart.PredictorItems.Add(result); } ExecutePredictor = (xi_action & ail.net.parser.EarleyParser.EFlags.eCompleter) != 0 || (xi_action & ail.net.parser.EarleyParser.EFlags.eScanner) != 0; } else { result.MasterChart.ScannerItems.Add(result); } } } ail.net.framework.Assert.NonNullReference(result, "result"); return(result); }
private void PopulateCoreItemTable() { // allocate CoreItemTableAttr = new ArrayList(Grammar.CalculateGrammarSize()); // populate ail.net.parser.EarleyParser.CoreItem core_item = null; int index = 0; foreach (ail.net.parser.GrammarRule rule in Grammar.Rules) { int i = 0; // special case for empty rule, we always assume the dot is at the end if (rule.Rhs.Count == 1 && ((ail.net.parser.GrammarSymbol)rule.Rhs[0]).Id == (int)ail.net.parser.Token.EType.eEpsilon) { core_item = new ail.net.parser.EarleyParser.CoreItem(); core_item.Id = index++; core_item.Rule = rule; core_item.Dot = rule.Rhs.Count; CoreItemTableAttr.Add(core_item); } else { for (; i < rule.Rhs.Count; i++) { core_item = new ail.net.parser.EarleyParser.CoreItem(); core_item.Id = index++; core_item.Rule = rule; core_item.Dot = i; CoreItemTable.Add(core_item); } // one extra for completed item core_item = new ail.net.parser.EarleyParser.CoreItem(); core_item.Id = index++; core_item.Rule = rule; core_item.Dot = i; CoreItemTable.Add(core_item); } } }