示例#1
0
文件: Grammar.cs 项目: sdao/LingParse
        private void ParseOnePass(HashQueue work, List<List<ParseNode>> output)
        {
            List<ParseNode> input = work.Dequeue();

            for (int i = 0; i < input.Count; i++)
            {
                ParseNode l = input[i];
                ParseNode r = i + 1 < input.Count ? input[i + 1] : ParseNode.EmptyParseNode();

                foreach (GrammarDefinition rule in Rules)
                {
                    int modify = 0;
                    if (rule.Right == SyntaxCategories.SYNTAX_CATEGORY_EMPTY)
                    {
                        if (rule.Left == l.Type)
                        {
                            modify = 1;
                        }
                    }
                    else
                    {
                        if (rule.Left == l.Type && rule.Right == r.Type)
                        {
                            modify = 2;
                        }
                    }

                    if (modify > 0)
                    {
                        List<ParseNode> modifiedInput = input.GetRange(0, input.Count);
                        modifiedInput.RemoveRange(i, modify);

                        ParseNode parent = new ParseNode(rule.Parent, null, l, modify > 1 ? r : ParseNode.EmptyParseNode());
                        modifiedInput.Insert(i, parent);

                        if (modifiedInput.Count == 1 && modifiedInput[0].Type == SyntaxCategories.SYNTAX_CATEGORY_FULL)
                            output.Add(modifiedInput);
                        else
                            work.Enqueue(modifiedInput);
                    }
                }
            }
        }
示例#2
0
 public static ParseNode EmptyParseNode()
 {
     if (_empty == null)
         _empty = new ParseNode(SyntaxCategories.SYNTAX_CATEGORY_EMPTY, null);
     return _empty;
 }
示例#3
0
文件: Grammar.cs 项目: sdao/LingParse
        private void ParseRecurse(List<ParseNode> input, List<List<ParseNode>> output)
        {
            for (int i = 0; i < input.Count; i++)
            {
                ParseNode l = input[i];
                ParseNode r = i + 1 < input.Count ? input[i + 1] : ParseNode.EmptyParseNode();

                foreach (GrammarDefinition rule in Rules)
                {
                    if (rule.Right == SyntaxCategories.SYNTAX_CATEGORY_EMPTY)
                    {
                        if (rule.Left == l.Type)
                        {
                            List<ParseNode> modifiedInput = input.GetRange(0, input.Count);
                            modifiedInput.RemoveRange(i, 1);

                            ParseNode parent = new ParseNode(rule.Parent, null, l, ParseNode.EmptyParseNode());
                            modifiedInput.Insert(i, parent);

                            ParseRecurse(modifiedInput, output);
                        }
                    }
                    else
                    {
                        if (rule.Left == l.Type && rule.Right == r.Type)
                        {
                            List<ParseNode> modifiedInput = input.GetRange(0, input.Count);
                            modifiedInput.RemoveRange(i, 2);

                            ParseNode parent = new ParseNode(rule.Parent, null, l, r);
                            modifiedInput.Insert(i, parent);

                            ParseRecurse(modifiedInput, output);
                        }
                    }
                }
            }

            if (input.Count == 1 && input[0].Type == SyntaxCategories.SYNTAX_CATEGORY_FULL)
            {
                output.Add(input);
            }
        }
示例#4
0
 public ParseNode(int u, string term, ParseNode l, ParseNode r)
     : this(u, term)
 {
     Left = l;
     Right = r;
 }