コード例 #1
0
        private Node BuildTree(EarleyRule rule, int stateIdx)
        {
            if (rule == null)
            {
                throw new SyntaxException($"Attempt to complete an empty rule in #{stateIdx} state");
            }

            var node = new Node {
                Symbol = rule.Name
            };
            int matchedIdx = rule.Dot - 1;

            while (matchedIdx >= 0)
            {
                var matchedTerm = rule[matchedIdx] as NonTerminal;
                if (matchedTerm != null)
                {
                    int idx         = matchedIdx;
                    var derivatives = _chart[stateIdx]
                                      .FinalRules(matchedTerm)
                                      .Where(r => _chart[r.Start].Contains(rule.WithDot(idx)));

                    var rules = derivatives as IList <EarleyRule> ?? derivatives.ToList();
                    var child = BuildTree(rules.First(), stateIdx);
                    node.Add(child);
                    foreach (var deriv in rules.Skip(1))
                    {
                        child.Next = BuildTree(deriv, stateIdx);
                        child      = child.Next;
                    }

                    stateIdx = rules[0].Start;
                }
                else
                {
                    node.Add(new Node {
                        Symbol = rule[matchedIdx]
                    });
                    stateIdx--;
                }
                matchedIdx--;
            }
            return(node);
        }
コード例 #2
0
ファイル: EarleyParser.cs プロジェクト: surenkov/UCP
        private Node BuildTree(EarleyRule rule, int stateIdx)
        {
            if (rule == null)
                throw new SyntaxException($"Attempt to complete an empty rule in #{stateIdx} state");

            var node = new Node { Symbol = rule.Name };
            int matchedIdx = rule.Dot - 1;

            while (matchedIdx >= 0)
            {
                var matchedTerm = rule[matchedIdx] as NonTerminal;
                if (matchedTerm != null)
                {
                    int idx = matchedIdx;
                    var derivatives = _chart[stateIdx]
                        .FinalRules(matchedTerm)
                        .Where(r => _chart[r.Start].Contains(rule.WithDot(idx)));

                    var rules = derivatives as IList<EarleyRule> ?? derivatives.ToList();
                    var child = BuildTree(rules.First(), stateIdx);
                    node.Add(child);
                    foreach (var deriv in rules.Skip(1))
                    {
                        child.Next = BuildTree(deriv, stateIdx);
                        child = child.Next;
                    }

                    stateIdx = rules[0].Start;
                }
                else
                {
                    node.Add(new Node { Symbol = rule[matchedIdx] });
                    stateIdx--;
                }
                matchedIdx--;
            }
            return node;
        }