Esempio n. 1
0
        public void StartWith_GrammarWithUnresovedRules_ThrowsException()
        {
            var grammar = new AdHocGrammar();

            grammar.Sequence("start", grammar.Ref("item"));

            grammar.Invoking(g => g.StartWith("start")).Should().Throw <GrammarException>().Where(e => e.Id == GrammarExceptionId.GrammarContainsUnresolvedRule);
        }
        public void Definitions_WithMinMaxVariants_GetCorrectMinMaxValues()
        {
            var grammar = new AdHocGrammar();

            grammar.DefineRule("rule1 := 'A'{3}").ToDisplayText(DisplayMode.Definition).Should().Be("rule1 := T<'A'>{3,3}");
            grammar.DefineRule("rule2 := 'A'{3,3}").ToDisplayText(DisplayMode.Definition).Should().Be("rule2 := T<'A'>{3,3}");
            grammar.DefineRule("rule3 := 'A'{3,}").ToDisplayText(DisplayMode.Definition).Should().Be("rule3 := T<'A'>{3,}");
        }
Esempio n. 3
0
        public void Grammar_RefAs_SetsRefNameOnRuleRef()
        {
            var grammar = new AdHocGrammar();
            var ruleRef = grammar.Ref("test").As("handle");

            ruleRef.RefName.Should().Be("handle");
            ((RuleRef <CstNode>)ruleRef).IsResolved.Should().BeFalse();
        }
Esempio n. 4
0
        public void Grammar_ReferencingUndefinedRule_ReturnsUnresolvedRef()
        {
            var grammar = new AdHocGrammar();
            var ruleRef = grammar.Ref("test");

            ruleRef.Name.Should().BeNull();
            ((RuleRef <CstNode>)ruleRef).IsResolved.Should().BeFalse();
        }
Esempio n. 5
0
        public void Grammar_WithoutStartRule_ThrowsExceptionOnStart()
        {
            var grammar = new AdHocGrammar();

            grammar.TerminalType("A", "start");

            grammar.Invoking(g => g.Start()).Should().Throw <GrammarException>().Where(e => e.Id == GrammarExceptionId.StartRuleNotDefined);
        }
Esempio n. 6
0
        public void Grammar_RefReduceWith_SetsReducerOnRuleRef()
        {
            var grammar = new AdHocGrammar();
            Reducer <CstNode> reducer = (IRule rule, INodeContext <CstNode> page) => EnumSequence.Of(new CstNode("Dummy", "Dummy"));
            var ruleRef = grammar.Ref("test").ReduceWith(reducer);

            ruleRef.Reducer.Should().Be(reducer);
            ((RuleRef <CstNode>)ruleRef).IsResolved.Should().BeFalse();
        }
        private Parser <CstNode> CreateParser(params string[] ruleDefinitions)
        {
            var grammar = new AdHocGrammar();

            foreach (var ruleDefinition in ruleDefinitions)
            {
                grammar.DefineRule(ruleDefinition);
            }
            return(new Parser <CstNode>(grammar));
        }
Esempio n. 8
0
        public void Grammar_WithStartRule_ReturnsStartRefOnStart()
        {
            var grammar = new AdHocGrammar();

            grammar.TerminalType("A", "start");
            grammar.StartWith("start");

            var ruleRef = grammar.Start();

            ruleRef.Should().NotBeNull();
            ruleRef.RefName.Should().Be("start");
            ruleRef.Name.Should().Be("start");
        }
Esempio n. 9
0
        public void EvaluatingGrammar_WithMockRule_RunsMockRule()
        {
            var mockRule = new MockRule("mock", MockRuleBehavior.Success);
            var grammar  = new AdHocGrammar();

            grammar.DefineRule("start", mockRule);
            grammar.StartWith("start");
            var lexer   = StaticLexer.FromWords();
            var opsMock = new RuleOperationsMock(new TokenStream(lexer).Start());

            var ruleRef = grammar.Start();
            var result  = opsMock.Evaluate(ruleRef).Result;

            result.IsSuccess.Should().BeTrue();
            mockRule.DidGrab.Should().BeTrue();
            result.Index.Index.Should().Be(0);
        }
Esempio n. 10
0
        private static IGrammar <CstNode> SimpleGrammar()
        {
            var grammar = new AdHocGrammar();

            // main   := A choose R{2,5} .
            // choose := U | V
            grammar.Sequence("main",
                             grammar.TerminalType("A"),
                             grammar.Choice("choose",
                                            grammar.TerminalValue("U"),
                                            grammar.TerminalValue("V")
                                            ),
                             grammar.Repeat(null, grammar.TerminalType("R"), 2, 5),
                             grammar.Any(null)
                             );

            grammar.StartWith("main");

            return(grammar);
        }