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)); }
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"); } }
public PdlLexerRuleTermConcatenation(PdlLexerRuleFactor factor, PdlLexerRuleTerm term) : base(factor) { Term = term; _hashCode = ComputeHashCode(); }
public PdlLexerRuleTerm(PdlLexerRuleFactor factor) { Factor = factor; _hashCode = ComputeHashCode(); }