Пример #1
0
        public void MarpaParseEngineShouldParseEncapsulatedRepeatingRightRecursiveRule()
        {
            var number       = new NumberLexerRule();
            var openBracket  = new TerminalLexerRule('[');
            var closeBracket = new TerminalLexerRule(']');
            var comma        = new TerminalLexerRule(',');

            ProductionExpression
                A  = "A",
                V  = "V",
                VR = "VR";

            A.Rule  = openBracket + VR + closeBracket;
            VR.Rule = V
                      | V + comma + VR
                      | (Expr)null;
            V.Rule = number;

            var grammar = new GrammarExpression(
                A, new [] { A, V, VR }).ToGrammar();

            var marpaParseEngine = new MarpaParseEngine(grammar);

            var tokens = new []
            {
                new Token("[", 0, openBracket.TokenType),
                new Token("1", 1, number.TokenType),
                new Token(",", 2, comma.TokenType),
                new Token("2", 3, number.TokenType),
                new Token("]", 4, closeBracket.TokenType)
            };

            for (var i = 0; i < tokens.Length; i++)
            {
                var result = marpaParseEngine.Pulse(tokens[i]);
                if (!result)
                {
                    Assert.Fail($"Failure parsing at position {marpaParseEngine.Location}");
                }
            }

            var accepted = marpaParseEngine.IsAccepted();

            if (!accepted)
            {
                Assert.Fail($"Input was not accepted.");
            }
        }
Пример #2
0
        public void DfaLexemeResetShouldResetLexemeValues()
        {
            var numberLexerRule = new NumberLexerRule();

            var          lexeme      = numberLexerRule.CreateLexeme(0);
            const string numberInput = "0123456";

            foreach (var character in numberInput)
            {
                var result = lexeme.Scan(character);
                if (!result)
                {
                    Assert.Fail($"Did not recognize number {character}");
                }
            }
        }
Пример #3
0
        public void DfaLexemeResetShouldResetLexemeValues()
        {
            var numberLexerRule     = new NumberLexerRule();
            var whitespaceLexerRule = new WhitespaceLexerRule();

            var          lexeme      = new DfaLexeme(numberLexerRule, 0);
            const string numberInput = "0123456";

            for (var i = 0; i < numberInput.Length; i++)
            {
                var result = lexeme.Scan(numberInput[i]);
                if (!result)
                {
                    Assert.Fail($"Did not recognize number {numberInput[i]}");
                }
            }

            lexeme.Reset(whitespaceLexerRule, 50);
            Assert.AreEqual(string.Empty, lexeme.Value);
            Assert.AreEqual(50, lexeme.Position);
            Assert.AreEqual(whitespaceLexerRule.LexerRuleType, lexeme.LexerRule.LexerRuleType);
            Assert.AreEqual(whitespaceLexerRule.TokenType, lexeme.TokenType);
        }
Пример #4
0
        static ExpressionGrammar()
        {
            var number = new NumberLexerRule();

            ProductionExpression
                S = nameof(S),
                E = nameof(E),
                T = nameof(T),
                F = nameof(F);

            S.Rule = E;
            E.Rule = E + '+' + T
                     | E + '-' + T
                     | T;
            T.Rule = T + '*' + F
                     | T + '/' + F
                     | F;
            F.Rule = '+' + F
                     | '-' + F
                     | number
                     | '(' + E + ')';

            _grammar = new GrammarExpression(S).ToGrammar();
        }