private void InitStartingTokensWithChoice(Rule <IN> rule, ChoiceClause <IN> choice, Dictionary <string, NonTerminal <IN> > nonTerminals) { foreach (var alternate in choice.Choices) { if (alternate is TerminalClause <IN> term) { InitStartingTokensWithTerminal(rule, term); } else if (alternate is NonTerminalClause <IN> nonTerminal) { InitStartingTokensWithNonTerminal(rule, nonTerminal, nonTerminals); } } }
public SyntaxParseResult <IN> ParseChoice(IList <Token <IN> > tokens, ChoiceClause <IN> choice, int position) { var currentPosition = position; SyntaxParseResult <IN> result = new SyntaxParseResult <IN>() { IsError = true, IsEnded = false, EndingPosition = currentPosition }; foreach (var alternate in choice.Choices) { if (alternate is TerminalClause <IN> terminalAlternate) { result = ParseTerminal(tokens, terminalAlternate, currentPosition); } else if (alternate is NonTerminalClause <IN> nonTerminalAlternate) { result = ParseNonTerminal(tokens, nonTerminalAlternate, currentPosition); } else { throw new InvalidOperationException("unable to apply repeater inside " + choice.GetType().Name); } if (result.IsOk) { if (choice.IsTerminalChoice && choice.IsDiscarded && result.Root is SyntaxLeaf <IN> leaf) { var discardedToken = new SyntaxLeaf <IN>(leaf.Token, true); result.Root = discardedToken; } return(result); } } if (result.IsError && choice.IsTerminalChoice) { var terminalAlternates = choice.Choices.Cast <TerminalClause <IN> >(); var expected = terminalAlternates.Select(x => x.ExpectedToken).ToList(); result.Errors.Add(new UnexpectedTokenSyntaxError <IN>(tokens[currentPosition], expected.ToArray())); } return(result); }
public IClause <IN> AlternateClause(ChoiceClause <IN> choices) { choices.IsDiscarded = false; return(choices); }
public IClause <IN> AlternateDiscardedClause(ChoiceClause <IN> choices, Token <EbnfTokenGeneric> discarded) { choices.IsDiscarded = true; return(choices); }
public IClause <IN> ChoiceOptional(ChoiceClause <IN> choices, Token <EbnfTokenGeneric> discardOption) { return(new OptionClause <IN>(choices)); }
public IClause <IN> ChoiceZeroOrMore(ChoiceClause <IN> choices, Token <EbnfTokenGeneric> discardZeroOrMore) { return(new ZeroOrMoreClause <IN>(choices)); }
public IClause <IN> ChoicesMany(Token <EbnfTokenGeneric> head, Token <EbnfTokenGeneric> discardOr, ChoiceClause <IN> tail) { var headClause = BuildTerminalOrNonTerimal(head.Value); return(new ChoiceClause <IN>(headClause, tail.Choices)); }
public GroupClause <IN> GroupChoiceClause(ChoiceClause <IN> choices) { return(new GroupClause <IN>(choices)); }