Пример #1
0
        private PdlLexerRuleTerm VisitLexerRuleTermNode(IInternalTreeNode node)
        {
            PdlLexerRuleFactor factor = null;
            PdlLexerRuleTerm   term   = null;

            for (int c = 0; c < node.Children.Count; c++)
            {
                var child = node.Children[c];
                if (child.NodeType != TreeNodeType.Internal)
                {
                    continue;
                }
                var internalNode = child as IInternalTreeNode;
                var symbolValue  = internalNode.Symbol.Value;
                if (PdlGrammar.LexerRuleFactor == symbolValue)
                {
                    factor = VisitLexerRuleFactorNode(internalNode);
                }
                if (PdlGrammar.LexerRuleTerm == symbolValue)
                {
                    term = VisitLexerRuleTermNode(internalNode);
                }
            }

            if (term is null)
            {
                return(new PdlLexerRuleTerm(factor));
            }

            return(new PdlLexerRuleTermConcatenation(factor, term));
        }
Пример #2
0
        INfa LexerRuleFactor(PdlLexerRuleFactor factor)
        {
            switch (factor.NodeType)
            {
            case PdlNodeType.PdlLexerRuleFactorLiteral:
                return(LexerRuleFactorLiteral(factor as PdlLexerRuleFactorLiteral));

            case PdlNodeType.PdlLexerRuleFactorRegex:
                return(LexerRuleFactorRegex(factor as PdlLexerRuleFactorRegex));


            default:
                throw new InvalidOperationException(
                          $"Invalid PdlLexerRuleFactor node type detected. Found {Enum.GetName(typeof(PdlNodeType), factor.NodeType)}, expected PdlLexerRuleFactorLiteral or PdlLexerRuleFactorRegex");
            }
        }
Пример #3
0
 public PdlLexerRuleTermConcatenation(PdlLexerRuleFactor factor, PdlLexerRuleTerm term)
     : base(factor)
 {
     Term      = term;
     _hashCode = ComputeHashCode();
 }
Пример #4
0
 public PdlLexerRuleTerm(PdlLexerRuleFactor factor)
 {
     Factor    = factor;
     _hashCode = ComputeHashCode();
 }