Example #1
0
        private Nfa LexerRuleFactor(IEbnfLexerRuleFactor factor)
        {
            switch (factor)
            {
            case EbnfLexerRuleFactorLiteral literal:
                return(LexerRuleFactorLiteral(literal));

            case EbnfLexerRuleFactorRegex regex:
                return(LexerRuleFactorRegex(regex));

            default:
                throw new InvalidOperationException(
                          $"Invalid IEbnfLexerRuleFactor node type detected. Found {factor.GetType().Name}, expected EbnfLexerRuleFactorLiteral or EbnfLexerRuleFactorRegex");
            }
        }
Example #2
0
        private IEbnfLexerRuleTerm VisitLexerRuleTermNode(IInternalTreeNode node)
        {
            IEbnfLexerRuleFactor factor = null;
            IEbnfLexerRuleTerm   term   = null;

            foreach (var internalNode in node.Children.OfType <IInternalTreeNode>())
            {
                if (internalNode.Is(EbnfGrammar.LexerRuleFactor))
                {
                    factor = VisitLexerRuleFactorNode(internalNode);
                }
                else if (internalNode.Is(EbnfGrammar.LexerRuleTerm))
                {
                    term = VisitLexerRuleTermNode(internalNode);
                }
            }

            if (term == null)
            {
                return(new EbnfLexerRuleTermSimple(factor));
            }

            return(new EbnfLexerRuleTermConcatenation(factor, term));
        }
Example #3
0
 public EbnfLexerRuleTermConcatenation(IEbnfLexerRuleFactor factor, IEbnfLexerRuleTerm term)
 {
     Factor = factor;
     Term   = term;
 }
Example #4
0
 public EbnfLexerRuleTermSimple(IEbnfLexerRuleFactor factor)
 {
     Factor = factor;
 }