public void Evaluate_Test(string input, double output)
        {
            var lex = new RegexLexer();

            SuperBasicMathAst.AddMathTokens(lex);
            var tokens = lex.Tokenize(input);
            var t      = tree.Evaluate(tokens);

            t.Should().Be(output);
        }
Example #2
0
        private CharsetGrammar()
        {
            var provider       = new UnicodeCharSetProvider();
            var mapper         = new UnicodeUtf16Mapper(false, false);
            var rx             = RegexLexer.CreateRx(mapper);
            var rxWhitespace   = new RxAccept <char>(RxOfSymbol <char> .Extract(rx, RegexLexer.SymWhitespace), SymWhitespace, 0);
            var rxCharset      = new RxAccept <char>(RxOfSymbol <char> .Extract(rx, RegexLexer.SymCharset), SymCharset, 0);
            var rxRegexCharset = new RxAccept <char>(RxOfSymbol <char> .Extract(rx, RegexLexer.SymRegexCharset), SymRegexCharset, 0);
            var rxUnion        = new RxAccept <char>(RegexMatchSet.FromChars('|', '+').ToInvariant(mapper, provider, true), SymUnion, 0);
            var rxSubtract     = new RxAccept <char>(RegexMatchSet.FromChars('-').ToInvariant(mapper, provider, true), SymSubtract, 0);
            var rxIntersect    = new RxAccept <char>(RegexMatchSet.FromChars('&').ToInvariant(mapper, provider, true), SymIntersect, 0);
            var rxDifference   = new RxAccept <char>(RegexMatchSet.FromChars('^').ToInvariant(mapper, provider, true), SymDifference, 0);
            var rxNegate       = new RxAccept <char>(RegexMatchSet.FromChars('~').ToInvariant(mapper, provider, true), SymNegate, 0);
            var rxParensOpen   = new RxAccept <char>(RegexMatchSet.FromChars('(').ToInvariant(mapper, provider, true), SymParensOpen, 0);
            var rxParensClose  = new RxAccept <char>(RegexMatchSet.FromChars(')').ToInvariant(mapper, provider, true), SymParensClose, 0);
            var alpha          = new AlphabetBuilder <char>(
                new RxAlternation <char>(rxWhitespace,
                                         new RxAlternation <char>(rxCharset,
                                                                  new RxAlternation <char>(rxRegexCharset,
                                                                                           new RxAlternation <char>(rxUnion,
                                                                                                                    new RxAlternation <char>(rxSubtract,
                                                                                                                                             new RxAlternation <char>(rxIntersect,
                                                                                                                                                                      new RxAlternation <char>(rxDifference,
                                                                                                                                                                                               new RxAlternation <char>(rxNegate,
                                                                                                                                                                                                                        new RxAlternation <char>(rxParensOpen, rxParensClose))))))))),
                Utf16Chars.EOF,
                Utf16Chars.ValidBmp);
            var nfa = NfaBuilder <LetterId> .Build(alpha.Expression);

            var dfa = DfaBuilder <LetterId> .Build(nfa, LetterId.Eof);

            if (dfa.StartState.Id != default(Id <DfaState <LetterId> >))
            {
                throw new InvalidOperationException($"Internal error: Unexpected DFA start state {dfa.StartState.Id}");
            }
            this.stateMachine = DfaStateMachineEmitter.CreateExpression(dfa, AlphabetMapperEmitter <char> .CreateExpression(alpha)).Compile();
            this.table        = new LalrTableGenerator(new GrammarBuilder(-2, -1, SymExpression)
            {
                { SymUnionExpression, SymExpression, SymUnion, SymNegateExpression },
                { SymExpression, SymUnionExpression },
                { SymSubtractExpression, SymExpression, SymSubtract, SymNegateExpression },
                { SymExpression, SymSubtractExpression },
                { SymIntersectExpression, SymExpression, SymIntersect, SymNegateExpression },
                { SymExpression, SymIntersectExpression },
                { SymDifferenceExpression, SymExpression, SymDifference, SymNegateExpression },
                { SymExpression, SymDifferenceExpression },
                { SymExpression, SymNegateExpression },
                { SymNegateExpression, SymNegate, SymValueExpression },
                { SymNegateExpression, SymValueExpression },
                { SymValueExpression, SymParensOpen, SymExpression, SymParensClose },
                { SymValueExpression, SymCharset },
                { SymValueExpression, SymRegexCharset }
            })
                                .ComputeTable();
        }
Example #3
0
 public static void AddMathTokens(RegexLexer lex)
 {
     lex.Ignore(" ");
     lex.Add(PascalTerms.LParinth, @"\(");
     lex.Add(PascalTerms.RParinth, @"\)");
     lex.Add(PascalTerms.IntegerConst, @"\d+");
     lex.Add(PascalTerms.Add, @"\+");
     lex.Add(PascalTerms.Sub, @"-");
     lex.Add(PascalTerms.Multi, @"\*");
     lex.Add(PascalTerms.FloatDiv, @"/");
 }
Example #4
0
        public void AddAndSubtract_Should_HaveSubAtTopOfTree()
        {
            var input = "1+2-3";

            var lex = new RegexLexer();

            SuperBasicMathAst.AddMathTokens(lex);
            var tree = new SuperBasicMathAst(lex.Tokenize(input));

            var t = tree.Evaluate().Should().BeOfType <BinaryOperator>().Which;

            t.Name.Should().Be(PascalTerms.Sub);
        }
Example #5
0
        public void UnaryOperation()
        {
            var input = "-2";

            var lex = new RegexLexer();

            SuperBasicMathAst.AddMathTokens(lex);
            var tree = new SuperBasicMathAst(lex.Tokenize(input));

            var node = tree.Evaluate();

            node.Should().BeOfType <UnaryOperator>().Which.Name.Should().Be(PascalTerms.Sub);
        }
        public void SimpleExample_ShouldParseToExpectedTokens()
        {
            // Arrange
            var lexer = new RegexLexer <TokenType>(new Dictionary <string, TokenType>
            {
                ["0"] = TokenType.Zero,
                ["1"] = TokenType.One,
            });

            // Act
            var tokens = (IEnumerable <Token <TokenType> >)lexer.Lex(new StringReader("010"));

            // Assert
            Assert.Equal(new []
Example #7
0
        public void Evaluate_Test(string input, double output)
        {
            var lex = new RegexLexer();

            SuperBasicMathAst.AddMathTokens(lex);
            var tree = new SuperBasicMathAst(lex.Tokenize(input));
            var t    = tree.Evaluate();

            var inter = new PascalInterpreter();

            var r = inter.VisitNode(t);

            r.Should().Be(output);
        }
Example #8
0
        public void LispTest(string input, string output)
        {
            var lex = new RegexLexer();

            SuperBasicMathAst.AddMathTokens(lex);
            var tree = new SuperBasicMathAst(lex.Tokenize(input));

            var t = tree.Evaluate();

            var inter = new SuperBasicMathLispInterpreter();

            var result = inter.Evaluate(t);

            result.Should().Be(output);
        }
Example #9
0
        public void RpnTest()
        {
            var input = "(5 + 3) * 12 / 3";
            var lex   = new RegexLexer();

            SuperBasicMathAst.AddMathTokens(lex);
            var tree = new SuperBasicMathAst(lex.Tokenize(input));

            var t = tree.Evaluate();

            var inter = new SuperBasicRpnMathInterpreter();

            var result = inter.Evaluate(t);

            result.Should().Be("5 3 + 12 * 3 /");
        }
Example #10
0
        public void BasicAst_Should_Subtract()
        {
            var input = "1-2";
            var lex   = new RegexLexer();

            SuperBasicMathAst.AddMathTokens(lex);
            var tree = new SuperBasicMathAst(lex.Tokenize(input));
            var t    = tree.Evaluate().Should().BeOfType <BinaryOperator>().Which;

            t.TokenItem.Token.Name.Should().Be(PascalTerms.Sub);

            var left  = t.Left.Should().BeOfType <IntegerNode>().Which;
            var right = t.Right.Should().BeOfType <IntegerNode>().Which;

            left.TokenItem.Token.Name.Should().Be(PascalTerms.IntegerConst);
            left.TokenItem.Value.Should().Be("1");
            right.TokenItem.Token.Name.Should().Be(PascalTerms.IntegerConst);
            right.TokenItem.Value.Should().Be("2");
        }
Example #11
0
 public void Setup()
 {
     _regexLexer = new RegexLexer();
 }