(&mut self)
| 141 | } |
| 142 | |
| 143 | fn group(&mut self) -> Result<Node, ParseError> { |
| 144 | self.bump(); // open paren |
| 145 | if self.peek() != Some('?') { |
| 146 | self.group_count += 1; |
| 147 | let index = self.group_count; |
| 148 | let node = self.alternation()?; |
| 149 | self.expect(')')?; |
| 150 | return Ok(Node::Group { index, name: None, node: Box::new(node) }); |
| 151 | } |
| 152 | self.bump(); // question mark |
| 153 | match self.peek() { |
| 154 | Some(':') => { self.bump(); let n = self.alternation()?; self.expect(')')?; Ok(Node::NonCap(Box::new(n))) } |
| 155 | Some('=') => { self.bump(); self.look(false, false) } |
| 156 | Some('!') => { self.bump(); self.look(false, true) } |
| 157 | Some('<') => { |
| 158 | self.bump(); |
| 159 | match self.peek() { |
| 160 | Some('=') => { self.bump(); self.look(true, false) } |
| 161 | Some('!') => { self.bump(); self.look(true, true) } |
| 162 | _ => { let name = self.read_name('>')?; self.named_group(name) } |
| 163 | } |
| 164 | } |
| 165 | Some('P') => { |
| 166 | self.bump(); |
| 167 | match self.peek() { |
| 168 | Some('<') => { self.bump(); let name = self.read_name('>')?; self.named_group(name) } |
| 169 | Some('=') => { self.bump(); let name = self.read_name(')')?; self.named_backref(&name) } |
| 170 | _ => Err(self.err("unknown extension")), |
| 171 | } |
| 172 | } |
| 173 | Some('#') => { |
| 174 | while let Some(c) = self.peek() { if c == ')' { break; } self.bump(); } |
| 175 | self.expect(')')?; |
| 176 | Ok(Node::Empty) |
| 177 | } |
| 178 | Some(c) if is_flag_char(c) => { self.read_flags()?; self.expect(')')?; Ok(Node::Empty) } |
| 179 | _ => Err(self.err("unknown extension")), |
| 180 | } |
| 181 | } |
| 182 | |
| 183 | fn look(&mut self, behind: bool, negative: bool) -> Result<Node, ParseError> { |
| 184 | let node = self.alternation()?; |
no test coverage detected