示例#1
0
        public IEnumerable <RuleResult> ToCoroutine(CurrentTokenCallback t)
        {
            RuleResult result;

            do
            {
                result = this.FeedToken(t());
                yield return(result);
            }while (result.status == RuleStatus.GoodSoFar);
        }
示例#2
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));
        }
        public static IEnumerable <RuleResult> ParseFunction(CurrentTokenCallback t)
        {
            var node = new FunctionDefinition();

            node.Statements = new List <IStatement>();

            yield return(Expect.Keyword(t(), "function"));

            yield return(Extract.Word(t(), name => node.Name = name));

            yield return(Expect.Symbol(t(), "("));

            // TODO: Parse the parameters
            yield return(Expect.Symbol(t(), ")"));

            yield return(Expect.Symbol(t(), "{"));

            // TODO: Parse the statements
            yield return(Expect.Symbol(t(), "}", node));
        }
示例#4
0
        public static IEnumerable <RuleResult> ParseClass(CurrentTokenCallback t)
        {
            var node = new ClassDefinition();

            node.Functions = new List <FunctionDefinition>();

            yield return(Expect.Keyword(t(), "class"));

            yield return(Extract.Word(t(), name => node.Name = name));

            yield return(Expect.Symbol(t(), "{"));

            var rules = new WhileParser(t => !t.IsSymbol("}"))
                        .Or <FunctionDefinition>(ParseFunction, f => node.Functions.Add(f))
                        .YieldsNode(node);

            while (!rules.IsFinished)
            {
                yield return(rules.FeedToken(t()));
            }
        }