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);
        }
Exemplo n.º 3
0
 public IClause <IN> AlternateClause(ChoiceClause <IN> choices)
 {
     choices.IsDiscarded = false;
     return(choices);
 }
Exemplo n.º 4
0
 public IClause <IN> AlternateDiscardedClause(ChoiceClause <IN> choices, Token <EbnfTokenGeneric> discarded)
 {
     choices.IsDiscarded = true;
     return(choices);
 }
Exemplo n.º 5
0
 public IClause <IN> ChoiceOptional(ChoiceClause <IN> choices, Token <EbnfTokenGeneric> discardOption)
 {
     return(new OptionClause <IN>(choices));
 }
Exemplo n.º 6
0
 public IClause <IN> ChoiceZeroOrMore(ChoiceClause <IN> choices, Token <EbnfTokenGeneric> discardZeroOrMore)
 {
     return(new ZeroOrMoreClause <IN>(choices));
 }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
0
 public GroupClause <IN> GroupChoiceClause(ChoiceClause <IN> choices)
 {
     return(new GroupClause <IN>(choices));
 }