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