private static RegexCharacterUnitRange VisitCharacterRangeNode(IInternalTreeNode internalNode) { RegexCharacterClassCharacter start = null; RegexCharacterClassCharacter end = 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.CharacterClassCharacter == childInternalNodeSymbolValue) { if (start is null) { start = VisitCharacterClassCharacterNode(childInternalNode); } else { end = VisitCharacterClassCharacterNode(childInternalNode); } } } if (end != null) { return(new RegexCharacterRange(start, end)); } return(new RegexCharacterUnitRange(start)); }
public RegexCharacterRange( RegexCharacterClassCharacter startCharacter, RegexCharacterClassCharacter endCharacter) : base(startCharacter) { EndCharacter = endCharacter; _hashCode = ComputeHashCode(); }
private static INfa Character(RegexCharacterClassCharacter character, bool negate) { var start = new NfaState(); var end = new NfaState(); var terminal = CreateTerminalForCharacter(character.Value, character.IsEscaped, negate); var transition = new TerminalNfaTransition( terminal: terminal, target: end); start.AddTransistion(transition); return(new Nfa(start, end)); }
public RegexCharacterUnitRange(RegexCharacterClassCharacter startCharacter) { StartCharacter = startCharacter; _hashCode = ComputeHashCode(); }