class Regin::Parser rule
\\[dDsSwW] { [:CCLASS, text] }
\^|\\A { [:L_ANCHOR, text] }
\$|\\Z { [:R_ANCHOR, text] }
<(\w+)> { [:NAME, @ss[1]] }
\( {
@capture_index_stack << @capture_index
@capture_index += 1
@state = :OPTIONS if @ss.peek(1) == '?';
[:LPAREN, text]
}
\) { [:RPAREN, text] }
\[ { @state = :CCLASS; [:LBRACK, text] }
\{ { [:LCURLY, text] }
\} { [:RCURLY, text] }
\| { [:BAR, text] }
\. { [:DOT, text] }
\? { [:QMARK, text] }
\+ { [:PLUS, text] }
\* { [:STAR, text] }
\# {
if @options_stack[-1][:extended]
@state = :COMMENT;
next_token
else
[:CHAR, text]
end
}
\s|\n {
if @options_stack[-1][:extended]
next_token
else
[:CHAR, text]
end
}
\\(.) { [:CHAR, @ss[1]] }
. { [:CHAR, text] }
:CCLASS \[ { [:LBRACK, text] }
:CCLASS \] { @state = nil; [:RBRACK, text] }
:CCLASS \^ { [@ss.string[@ss.pos-2, 1] == '[' ? :NEGATE : :CHAR, text] }
:CCLASS : {
if @ss.string[@ss.pos-2, 1] == '['
@state = :POSIX_CCLASS
[:COLON, text]
else
[:CHAR, text]
end
}
:CCLASS \\- { [:CHAR, text] }
:CCLASS \\[dDsSwW] { [:CHAR, text] }
:CCLASS \\(.) { [:CHAR, @ss[1]] }
:CCLASS . { [:CHAR, text] }
:POSIX_CCLASS \w+ { [text, text] }
:POSIX_CCLASS : { [:COLON, text] }
:POSIX_CCLASS \] { @state = :CCLASS; [:RBRACK, text] }
:OPTIONS \? {
@state = nil unless @ss.peek(1) =~ /-|m|i|x|:/
[:QMARK, text]
}
:OPTIONS \- { [:MINUS, text] }
:OPTIONS m { [:MULTILINE, text] }
:OPTIONS i { [:IGNORECASE, text] }
:OPTIONS x { [:EXTENDED, text] }
:OPTIONS \: {
@capture_index_stack.pop
@capture_index -= 1
@state = nil;
[:COLON, text]
}
:COMMENT \n { @state = nil; next_token }
:COMMENT . { next_token }
end