public IEnumerable <RuleResult> ToCoroutine(CurrentTokenCallback t) { RuleResult result; do { result = this.FeedToken(t()); yield return(result); }while (result.status == RuleStatus.GoodSoFar); }
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)); }
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())); } }