コード例 #1
0
ファイル: RuleRefTest.cs プロジェクト: lord-executor/Pegatron
        public void Grab_UnresolvedRuleRef_ThrowsException()
        {
            var ruleRef = new RuleRef <string>();
            var index   = new TokenStreamIndex(new TokenStream(StaticLexer.FromWords()), 0);

            ruleRef.Invoking(r => index.OperationsMock().Evaluate(r)).Should().Throw <InvalidOperationException>();
        }
コード例 #2
0
ファイル: RuleContext.cs プロジェクト: lord-executor/Pegatron
        public RuleOperation Call(IRuleRef rule, TokenStreamIndex index, out CoroutineResult <RuleResult> result)
        {
            var operation = _operations.Call(rule, index, out result);

            // accumulate step counts of called child rules
            result.OnResolve += value => { stepCount += value.StepCount; };
            return(operation);
        }
コード例 #3
0
        public void InvalidRangeSpan_WithValidStream_ThrowsIndexOutOfRangeException(int start, int end)
        {
            var stream = CreateStream();
            var span   = new TokenStreamIndex(stream, start).Until(new TokenStreamIndex(stream, end));

            Action action = () => span.ToList();

            action.Should().Throw <IndexOutOfRangeException>();
        }
コード例 #4
0
        public void AndANotB_GivenParseTextAndStart_BehaveCorrectlyAndInverse(string text, bool expectedSuccess)
        {
            var stream  = new TokenStream(new CharacterLexer(text));
            var index   = new TokenStreamIndex(stream, 0);
            var ruleAnd = CreateAndARule();
            var ruleNot = CreateNotARule();

            AssertLookahead(ruleAnd, index, expectedSuccess);
            AssertLookahead(ruleNot, index, !expectedSuccess);
        }
コード例 #5
0
ファイル: RuleRefTest.cs プロジェクト: lord-executor/Pegatron
        public void RuleRef_GrabWithRule_GrabsTargetRule()
        {
            var mockRule = new MockRule(nameof(MockRule));
            var ruleRef  = new RuleRef <string>(mockRule);

            var index = new TokenStreamIndex(new TokenStream(StaticLexer.FromWords()), 0);

            index.OperationsMock().Evaluate(ruleRef);

            mockRule.DidGrab.Should().BeTrue();
        }
コード例 #6
0
        private void AssertLookahead(IRule rule, TokenStreamIndex index, bool expectedSuccess)
        {
            var opsMock = index.OperationsMock().Evaluate(rule);

            opsMock.Result.IsSuccess.Should().Be(expectedSuccess);
            opsMock.Result.Index.Index.Should().Be(0);
            if (expectedSuccess && rule is And)
            {
                opsMock.ConcatTokens().Should().Be("A");
            }
        }
コード例 #7
0
ファイル: Parser.cs プロジェクト: lord-executor/Pegatron
            public RuleOperation Call(IRuleRef rule, TokenStreamIndex index, out CoroutineResult <RuleResult> result)
            {
                var state = new RuleState <TNode>(rule, index, this, _parser._ruleStack.Peek());

                result = state.Result;

                return(() =>
                {
                    DebugHooks.OnBeforeCall(state, rule, index);
                    _parser._ruleStack.Push(state);
                });
            }
コード例 #8
0
ファイル: RepeatTest.cs プロジェクト: lord-executor/Pegatron
        public void ARepeated3to5_GivenParseTextAndStart_BehavesCorrectly(string text, bool expectedSuccess, string expectedMatch)
        {
            var stream = new TokenStream(new CharacterLexer(text));
            var index  = new TokenStreamIndex(stream, 0);
            var rule   = CreateARepeatedRule(3, 5);

            var opsMock = index.OperationsMock().Evaluate(rule);

            opsMock.Result.IsSuccess.Should().Be(expectedSuccess);
            opsMock.Result.Index.Index.Should().Be(expectedSuccess ? expectedMatch.Length : 0);
            opsMock.ConcatTokens().Should().Be(expectedMatch);
        }
コード例 #9
0
        public RuleOperation Call(IRuleRef rule, TokenStreamIndex index, out CoroutineResult <RuleResult> result)
        {
            // Make sure that each "nested" call gets its own result
            result = new CoroutineResult <RuleResult>();
            _results.Push(result);

            var context = new RuleContext(rule, index, this);

            rule.Grab(context).ToList();

            return(_noOpRuleOperation);
        }
コード例 #10
0
        public void AbbaSequence_GivenParseTextAndStart_BehavesCorrectly(string text, int start, string expectedMatch)
        {
            var stream = new TokenStream(new CharacterLexer(text));
            var index  = new TokenStreamIndex(stream, start);
            var rule   = CreateAbbaRule();

            var opsMock = index.OperationsMock().Evaluate(rule);

            opsMock.Result.IsSuccess.Should().Be(expectedMatch.Length == 4);
            opsMock.Result.Index.Index.Should().Be(opsMock.Result.IsSuccess ? start + expectedMatch.Length : start);
            opsMock.ConcatTokens().Should().Be(expectedMatch);
        }
コード例 #11
0
ファイル: RepeatTest.cs プロジェクト: lord-executor/Pegatron
        public void ARepeated_GivenArbitraryNumberOfAs_BehavesCorrectly(int count, string text)
        {
            var stream = new TokenStream(new CharacterLexer(text));
            var index  = new TokenStreamIndex(stream, 0);
            var rule   = CreateARepeatedRule();

            var opsMock = index.OperationsMock().Evaluate(rule);

            opsMock.Result.IsSuccess.Should().BeTrue();
            opsMock.Result.Index.Index.Should().Be(count);
            opsMock.Tokens.Count.Should().Be(count);
            opsMock.Tokens.All(t => t.Value == "A").Should().BeTrue();
        }
コード例 #12
0
        public void AnySpan_OfTokenStream_MatchesRangeInOriginalSource()
        {
            var stream = CreateStream();

            for (var start = 0; start < _words.Count; start++)
            {
                for (var end = start + 1; end < _words.Count + 1; end++)
                {
                    var span = new TokenStreamIndex(stream, start).Until(new TokenStreamIndex(stream, end));
                    span.Select(t => t.Value).Should().BeEquivalentTo(_words.Skip(start).Take(end - start));
                }
            }
        }
コード例 #13
0
        public void AnyTerminal_WithAnyCharacter_Succeeds(string text)
        {
            var stream = new TokenStream(new CharacterLexer(text));
            var rule   = new AnyTerminal("TEST");
            TokenStreamIndex   index;
            RuleOperationsMock opsMock;

            for (int i = 0; i < text.Length; i++)
            {
                index   = new TokenStreamIndex(stream, i);
                opsMock = index.OperationsMock().Evaluate(rule);

                opsMock.Result.IsSuccess.Should().BeTrue();
                opsMock.Result.Index.Index.Should().Be(i + 1);
                opsMock.ConcatTokens().Should().Be(text.Substring(i, 1));
            }

            index   = new TokenStreamIndex(stream, text.Length);
            opsMock = index.OperationsMock().Evaluate(rule);

            opsMock.Result.IsSuccess.Should().BeFalse();
            opsMock.Result.Index.Index.Should().Be(index.Index);
            opsMock.ConcatTokens().Should().Be(String.Empty);
        }
コード例 #14
0
ファイル: RuleContext.cs プロジェクト: lord-executor/Pegatron
 public RuleContext(IRuleRef rule, TokenStreamIndex index, IRuleOperations operations)
 {
     _rule       = rule;
     Index       = index;
     _operations = operations;
 }
コード例 #15
0
 public RuleOperationsMock(TokenStreamIndex index)
 {
     _index = index;
 }
コード例 #16
0
ファイル: IDebugHooks.cs プロジェクト: lord-executor/Pegatron
 public Task OnAfterCall(RuleState <TNode> state, IRuleRef rule, TokenStreamIndex idx, RuleResult res)
 {
     return(Task.CompletedTask);
 }
コード例 #17
0
ファイル: IDebugHooks.cs プロジェクト: lord-executor/Pegatron
 public Task OnBeforeCall(RuleState <TNode> state, IRuleRef rule, TokenStreamIndex idx)
 {
     return(Task.CompletedTask);
 }
コード例 #18
0
ファイル: RuleContext.cs プロジェクト: lord-executor/Pegatron
 public RuleOperation Success(TokenStreamIndex idx)
 {
     return(_operations.Complete(_rule, new RuleResult(true, idx, stepCount + 1, Index.Until(idx))));
 }
コード例 #19
0
 public static RuleOperationsMock OperationsMock(this TokenStreamIndex index)
 {
     return(new RuleOperationsMock(index));
 }