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 == null) { start = VisitCharacterClassCharacterNode(childInternalNode); } else { end = VisitCharacterClassCharacterNode(childInternalNode); } } } if (end != null) { return(new RegexCharacterRange(start, end)); } return(new RegexCharacterUnitRange(start)); }
private static RegexCharacters VisitCharacterRangeNode(IInternalTreeNode node) { RegexCharacterClassCharacter start = null; RegexCharacterClassCharacter end = null; foreach (var internalNode in node.Children.OfType <IInternalTreeNode>()) { if (internalNode.Is(RegexGrammar.CharacterClassCharacter)) { if (start == null) { start = VisitCharacterClassCharacterNode(internalNode); } else { end = VisitCharacterClassCharacterNode(internalNode); } } } if (end == null) { return(new RegexCharactersUnit(start)); } return(new RegexCharactersRange(start, end)); }
public RegexCharacterRange( RegexCharacterClassCharacter startCharacter, RegexCharacterClassCharacter endCharacter) : base(startCharacter) { EndCharacter = endCharacter; _hashCode = ComputeHashCode(); }
private static Nfa Character(RegexCharacterClassCharacter character, bool negate) { var start = new NfaState(); var end = new NfaState(); var terminal = CreateTerminalForCharacter(character.Value, character.IsEscaped, negate); start.AddTransition(terminal, end); return(new Nfa(start, end)); }
private static INfa Character(RegexCharacterClassCharacter character, bool negate) { var start = new NfaState(); var end = new NfaState(); ITerminal terminal = new CharacterTerminal(character.Value); if (negate) terminal = new NegationTerminal(terminal); var transition = new TerminalNfaTransition( terminal: terminal, target: end); start.AddTransistion(transition); return new Nfa(start, end); }
private static INfa Character(RegexCharacterClassCharacter character, bool negate) { var start = new NfaState(); var end = new NfaState(); ITerminal terminal = null; if (!character.IsEscaped) { terminal = new CharacterTerminal(character.Value); } else { switch (character.Value) { case 's': terminal = new WhitespaceTerminal(); break; case 'd': terminal = new DigitTerminal(); break; case 'w': terminal = new WordTerminal(); break; case 'D': terminal = new DigitTerminal(); negate = !negate; break; case 'S': terminal = new WhitespaceTerminal(); negate = !negate; break; case 'W': terminal = new WordTerminal(); negate = !negate; break; default: terminal = new CharacterTerminal(character.Value); break; } } if (negate) { terminal = new NegationTerminal(terminal); } var transition = new TerminalNfaTransition( terminal: terminal, target: end); start.AddTransistion(transition); return(new Nfa(start, end)); }
public RegexCharacterUnitRange(RegexCharacterClassCharacter startCharacter) { StartCharacter = startCharacter; _hashCode = ComputeHashCode(); }