private RegexCharacterClass VisitCharacterClassNode(IInternalTreeNode internalNode) { RegexCharacterUnitRange characterRange = null; RegexCharacterClass characterClass = null; for (var c = 0; c < internalNode.Children.Count; c++) { var child = internalNode.Children[c]; if (child.NodeType != TreeNodeType.Internal) { continue; } var childInternalNode = child as IInternalTreeNode; var childInternalNodeSymbolValue = childInternalNode.Symbol.Value; if (RegexGrammar.CharacterRange == childInternalNodeSymbolValue) { characterRange = VisitCharacterRangeNode(childInternalNode); } else if (RegexGrammar.CharacterClass == childInternalNodeSymbolValue) { characterClass = VisitCharacterClassNode(childInternalNode); } } if (characterClass != null) { return(new RegexCharacterClassAlteration( characterRange, characterClass)); } return(new RegexCharacterClass(characterRange)); }
public RegexCharacterClassAlteration( RegexCharacterUnitRange characterRange, RegexCharacterClass characterClass) : base(characterRange) { CharacterClass = characterClass; _hashCode = ComputeHashCode(); }
private static INfa CharacterClass(RegexCharacterClass characterClass, bool negate) { switch (characterClass.NodeType) { case RegexNodeType.RegexCharacterClass: return(UnitRange(characterClass.CharacterRange, negate)); case RegexNodeType.RegexCharacterClassAlteration: var alteration = characterClass as RegexCharacterClassAlteration; return(Union( UnitRange(alteration.CharacterRange, negate), CharacterClass(alteration.CharacterClass, negate))); } throw new InvalidOperationException("Unreachable code detected."); }
public RegexSet(bool negate, RegexCharacterClass characterClass) { Negate = negate; CharacterClass = characterClass; _hashCode = ComputeHashCode(); }