Example #1
0
        private IEnumerable <RuleResult> ImplCoroutine(CurrentTokenCallback t)
        {
            while (_shouldKeepLooping(t()))
            {
                _rules.Reset();

                // Keep feeding tokens until one of the rules completes, or
                // until there's an error.
                RuleResult result = RuleResult.GoodSoFar();
                while (result.status == RuleStatus.GoodSoFar)
                {
                    result = _rules.FeedToken(t());

                    if (result.status == RuleStatus.GoodSoFar)
                    {
                        yield return(result);
                    }
                }

                switch (result.status)
                {
                case RuleStatus.Complete:
                    yield return(RuleResult.GoodSoFar());

                    continue;

                case RuleStatus.Failed:
                    IsFinished = true;
                    yield return(result);

                    yield break;

                default:
                    IsFinished = true;
                    yield return(RuleResult.Failed(t().Position, "Unexpected rule result " + result.status));

                    yield break;
                }
            }

            IsFinished = true;
            yield return(RuleResult.Complete(_node));
        }
Example #2
0
        private static RuleResult SpecificToken(
            Token t,
            TokenType type,
            string content,
            object node = null
            )
        {
            if (t.Type != type || t.Content != content)
            {
                string msg = $@"Expected the {type} ""{content}"", but got the {t.Type} ""{t.Content}"" instead.";
                return(RuleResult.Failed(t.Position, msg));
            }

            // If a node was provided, return a Completed result instead of GoodSoFar
            if (node != null)
            {
                return(RuleResult.Complete(node));
            }

            return(RuleResult.GoodSoFar());
        }