コード例 #1
0
        public void FullPattern_Terminal(string grammarName, string patternName, string terminalName)
        {
            RGG rGG = new RGG(grammarName);

            rGG.BuildPattern(patternName).Terminal(terminalName).PatternEnd();
            rGG.BuildGraph(1);
            RGGNode startPatternNode = rGG.GetPatternStart(patternName);

            Assert.Equal(1, startPatternNode.TransitionCount);
            // Pattern Start
            RGGTransition candidateTransition = startPatternNode.Transitions.First();

            Assert.Equal(TransitionType.PatternStart, candidateTransition.TransitionType);
            RGGNode candidateNode = candidateTransition.To;

            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(1, candidateNode.TransitionCount);
            // Terminal
            candidateTransition = candidateNode.Transitions.First();
            Assert.Equal(TransitionType.Terminal, candidateTransition.TransitionType);
            Assert.Equal(terminalName, candidateTransition.Terminal.ToString());
            candidateNode = candidateTransition.To;
            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(1, candidateNode.TransitionCount);
            // Pattern End
            candidateTransition = candidateNode.Transitions.First();
            Assert.Equal(TransitionType.PatternEnd, candidateTransition.TransitionType);
            candidateNode = candidateTransition.To;
            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(0, candidateNode.TransitionCount);
        }
コード例 #2
0
        public bool Recognize(string inputToRecognizeOrReject)
        {
            List <TerminalPattern> terminalPatterns = new List <TerminalPattern>();

            foreach (char input in inputToRecognizeOrReject.ToCharArray())
            {
                terminalPatterns.Add(new TerminalPattern(input.ToString()));
            }
            bool            recognized       = false;
            bool            consumeCharacter = false;
            RGGNode         currentNode      = RecursiveGrammarGraph.GetNode("Start"); //To Recognition path: one for each pattern start from start
            RGGTransition   tempTransition;
            Stack <RGGNode> nodeStack = new Stack <RGGNode>();                         //To Recognition path. Later replace with GSS

            foreach (TerminalPattern terminalPattern in terminalPatterns)
            {
                consumeCharacter = false;
                while (!consumeCharacter)
                {
                    if (currentNode.PushTransition(terminalPattern, out tempTransition))
                    {
                        // TODO push to stack
                        currentNode      = tempTransition.To;
                        consumeCharacter = true;
                    }
                    else
                    {
                        if ((nodeStack.Count() > 0) && (currentNode.PopTransition(nodeStack.Peek().Name, out tempTransition)))
                        {
                            nodeStack.Pop();
                            currentNode = tempTransition.To;
                        }
                        else
                        {
                            foreach (RGGTransition transition in currentNode.NonPushTransitions)
                            {
                                switch (transition.TransitionType)
                                {
                                case TransitionType.PatternStart:
                                    currentNode = transition.To;
                                    break;

                                case TransitionType.PatternEnd:
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            // TODO check that stack is empty and last transition is PatternEnd for start
            return(recognized);
        }
コード例 #3
0
        public void FullPattern_RepeatPrevious_GroupStart_Terminal(string grammarName, string patternName, string terminalName)
        {
            RGG rGG = new RGG(grammarName);

            rGG.BuildPattern(patternName).GroupStart.Terminal(terminalName).GroupEnd.RepeatPrevious(0, 3).PatternEnd();
            rGG.BuildGraph(1);
            RGGNode startPatternNode = rGG.GetPatternStart(patternName);

            Assert.Equal(1, startPatternNode.TransitionCount);
            // Pattern Start
            RGGTransition candidateTransition = startPatternNode.Transitions.First();

            Assert.Equal(TransitionType.PatternStart, candidateTransition.TransitionType);
            RGGNode candidateNode = candidateTransition.To;

            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(1, candidateNode.TransitionCount);
            // GroupStart
            candidateTransition = candidateNode.Transitions.First();
            Assert.Equal(TransitionType.GroupStart, candidateTransition.TransitionType);
            Assert.Equal(Constants.UnnamedGroupStart, candidateTransition.Internal);
            candidateNode = candidateTransition.To;
            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(1, candidateNode.TransitionCount);
            // Terminal
            candidateTransition = candidateNode.Transitions.First();
            Assert.Equal(TransitionType.Terminal, candidateTransition.TransitionType);
            Assert.Equal(terminalName, candidateTransition.Terminal.ToString());
            candidateNode = candidateTransition.To;
            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(1, candidateNode.TransitionCount);
            // GroupEnd
            candidateTransition = candidateNode.Transitions.First();
            Assert.Equal(TransitionType.GroupEnd, candidateTransition.TransitionType);
            Assert.Equal(string.Format(Constants.EndPattern, Constants.UnnamedGroupStart), candidateTransition.Internal);
            candidateNode = candidateTransition.To;
            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(1, candidateNode.TransitionCount);
            // Pattern End
            candidateTransition = candidateNode.Transitions.First();
            Assert.Equal(TransitionType.PatternEnd, candidateTransition.TransitionType);
            candidateNode = candidateTransition.To;
            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(0, candidateNode.TransitionCount);
        }
コード例 #4
0
        public void FullPattern_Or(string grammarName, string patternName, string terminalName1, string terminalName2)
        {
            RGG rGG = new RGG(grammarName);

            rGG.BuildPattern(patternName).Terminal(terminalName1).Or.Terminal(terminalName2).PatternEnd();
            rGG.BuildGraph(1);
            RGGNode startPatternNode = rGG.GetPatternStart(patternName);

            Assert.Equal(2, startPatternNode.TransitionCount);
            int counter = 0;

            foreach (RGGTransition startTransition in startPatternNode.Transitions)
            {
                // Pattern Start
                RGGTransition candidateTransition = startTransition;
                Assert.Equal(TransitionType.PatternStart, candidateTransition.TransitionType);
                RGGNode candidateNode = candidateTransition.To;
                Assert.True(candidateNode.Name.StartsWith(patternName));
                Assert.Equal(1, candidateNode.TransitionCount);
                // Terminal
                candidateTransition = candidateNode.Transitions.First();
                Assert.Equal(TransitionType.Terminal, candidateTransition.TransitionType);
                Assert.Equal(counter == 0?terminalName1:terminalName2, candidateTransition.Terminal.ToString());
                candidateNode = candidateTransition.To;
                Assert.True(candidateNode.Name.StartsWith(patternName));
                Assert.Equal(1, candidateNode.TransitionCount);
                // Pattern End
                candidateTransition = candidateNode.Transitions.First();
                Assert.Equal(TransitionType.PatternEnd, candidateTransition.TransitionType);
                candidateNode = candidateTransition.To;
                Assert.True(candidateNode.Name.StartsWith(patternName));
                Assert.Equal(0, candidateNode.TransitionCount);

                counter += 1;
            }
        }
コード例 #5
0
        public void FullPattern_NamedGroupStart_Or2(string grammarName, string patternName, string groupName, string terminalName1, string terminalName2, string terminalName3, string terminalName4)
        {
            RGG rGG = new RGG(grammarName);

            rGG.BuildPattern(patternName).NamedGroupStart(groupName).Terminal(terminalName1).Terminal(terminalName2).Or.Terminal(terminalName3).Terminal(terminalName4).GroupEnd.PatternEnd();
            rGG.BuildGraph(1);
            RGGNode startPatternNode = rGG.GetPatternStart(patternName);

            Assert.Equal(1, startPatternNode.TransitionCount);
            // Pattern Start
            RGGTransition candidateTransition = startPatternNode.Transitions.First();

            Assert.Equal(TransitionType.PatternStart, candidateTransition.TransitionType);
            RGGNode candidateNode = candidateTransition.To;

            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(1, candidateNode.TransitionCount);
            // NamedGroupStart
            candidateTransition = candidateNode.Transitions.First();
            Assert.Equal(TransitionType.GroupStart, candidateTransition.TransitionType);
            Assert.Equal(groupName, candidateTransition.Internal);
            candidateNode = candidateTransition.To;
            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(2, candidateNode.TransitionCount);
            int    counter  = 0;
            string nextName = string.Empty;

            foreach (RGGTransition groupStartTransition in candidateNode.Transitions)
            {
                // Terminal
                candidateTransition = groupStartTransition;
                Assert.Equal(TransitionType.Terminal, candidateTransition.TransitionType);
                Assert.Equal(counter == 0 ? terminalName1 : terminalName3, candidateTransition.Terminal.ToString());
                candidateNode = candidateTransition.To;
                Assert.True(candidateNode.Name.StartsWith(patternName));
                Assert.Equal(1, candidateNode.TransitionCount);
                // Terminal
                candidateTransition = candidateNode.Transitions.First();;
                Assert.Equal(TransitionType.Terminal, candidateTransition.TransitionType);
                Assert.Equal(counter == 0 ? terminalName2 : terminalName4, candidateTransition.Terminal.ToString());
                candidateNode = candidateTransition.To;
                Assert.True(candidateNode.Name.StartsWith(patternName));
                Assert.Equal(1, candidateNode.TransitionCount);
                if (nextName == string.Empty)
                {
                    nextName = candidateNode.Name;
                }
                else
                {
                    Assert.Equal(nextName, candidateNode.Name);
                }

                counter += 1;
            }
            // GroupEnd
            candidateTransition = candidateNode.Transitions.First();
            Assert.Equal(TransitionType.GroupEnd, candidateTransition.TransitionType);
            Assert.Equal(string.Format(Constants.EndPattern, groupName), candidateTransition.Internal);
            candidateNode = candidateTransition.To;
            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(1, candidateNode.TransitionCount);
            // Pattern End
            candidateTransition = candidateNode.Transitions.First();
            Assert.Equal(TransitionType.PatternEnd, candidateTransition.TransitionType);
            candidateNode = candidateTransition.To;
            Assert.True(candidateNode.Name.StartsWith(patternName));
            Assert.Equal(0, candidateNode.TransitionCount);
        }