diff --git a/cpp/ql/test/library-tests/regex/parse.expected b/cpp/ql/test/library-tests/regex/parse.expected index 3df78cdb4fb..13d74f0e561 100644 --- a/cpp/ql/test/library-tests/regex/parse.expected +++ b/cpp/ql/test/library-tests/regex/parse.expected @@ -1,489 +1,487 @@ -regexp.rb: -# 5| [RegExpConstant, RegExpNormalChar] abc +regexp.cpp: +# 18| [RegExpConstant, RegExpNormalChar] abc -# 8| [RegExpConstant, RegExpNormalChar] a +# 21| [RegExpConstant, RegExpNormalChar] a -# 8| [RegExpStar] a* +# 21| [RegExpStar] a* #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 8| [RegExpSequence] a*b+c?d +# 21| [RegExpSequence] a*b+c?d #-----| 0 -> [RegExpStar] a* #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpOpt] c? #-----| 3 -> [RegExpConstant, RegExpNormalChar] d -# 8| [RegExpConstant, RegExpNormalChar] b +# 21| [RegExpConstant, RegExpNormalChar] b -# 8| [RegExpPlus] b+ +# 21| [RegExpPlus] b+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 8| [RegExpConstant, RegExpNormalChar] c +# 21| [RegExpConstant, RegExpNormalChar] c -# 8| [RegExpOpt] c? +# 21| [RegExpOpt] c? #-----| 0 -> [RegExpConstant, RegExpNormalChar] c -# 8| [RegExpConstant, RegExpNormalChar] d +# 21| [RegExpConstant, RegExpNormalChar] d -# 9| [RegExpConstant, RegExpNormalChar] a +# 22| [RegExpConstant, RegExpNormalChar] a -# 9| [RegExpRange] a{4,8} +# 22| [RegExpRange] a{4,8} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 10| [RegExpConstant, RegExpNormalChar] a +# 23| [RegExpConstant, RegExpNormalChar] a -# 10| [RegExpRange] a{,8} +# 23| [RegExpRange] a{,8} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 11| [RegExpConstant, RegExpNormalChar] a +# 24| [RegExpConstant, RegExpNormalChar] a -# 11| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} +# 24| [InfiniteRepetitionQuantifier, RegExpRange] a{3,} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 12| [RegExpConstant, RegExpNormalChar] a +# 25| [RegExpConstant, RegExpNormalChar] a -# 12| [RegExpRange] a{7} +# 25| [RegExpRange] a{7} #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 15| [RegExpConstant, RegExpNormalChar] foo +# 28| [RegExpConstant, RegExpNormalChar] foo -# 15| [RegExpAlt] foo|bar +# 28| [RegExpAlt] foo|bar #-----| 0 -> [RegExpConstant, RegExpNormalChar] foo #-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 15| [RegExpConstant, RegExpNormalChar] bar +# 28| [RegExpConstant, RegExpNormalChar] bar -# 18| [RegExpCharacterClass] [abc] +# 31| [RegExpCharacterClass] [abc] #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b #-----| 2 -> [RegExpConstant, RegExpNormalChar] c -# 18| [RegExpConstant, RegExpNormalChar] a +# 31| [RegExpConstant, RegExpNormalChar] a -# 18| [RegExpConstant, RegExpNormalChar] b +# 31| [RegExpConstant, RegExpNormalChar] b -# 18| [RegExpConstant, RegExpNormalChar] c +# 31| [RegExpConstant, RegExpNormalChar] c -# 19| [RegExpCharacterClass] [a-fA-F0-9_] +# 32| [RegExpCharacterClass] [a-fA-F0-9_] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpCharacterRange] A-F #-----| 2 -> [RegExpCharacterRange] 0-9 #-----| 3 -> [RegExpConstant, RegExpNormalChar] _ -# 19| [RegExpConstant, RegExpNormalChar] a +# 32| [RegExpConstant, RegExpNormalChar] a -# 19| [RegExpCharacterRange] a-f +# 32| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 19| [RegExpConstant, RegExpNormalChar] f +# 32| [RegExpConstant, RegExpNormalChar] f -# 19| [RegExpConstant, RegExpNormalChar] A +# 32| [RegExpConstant, RegExpNormalChar] A -# 19| [RegExpCharacterRange] A-F +# 32| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 19| [RegExpConstant, RegExpNormalChar] F +# 32| [RegExpConstant, RegExpNormalChar] F -# 19| [RegExpConstant, RegExpNormalChar] 0 +# 32| [RegExpConstant, RegExpNormalChar] 0 -# 19| [RegExpCharacterRange] 0-9 +# 32| [RegExpCharacterRange] 0-9 #-----| 0 -> [RegExpConstant, RegExpNormalChar] 0 #-----| 1 -> [RegExpConstant, RegExpNormalChar] 9 -# 19| [RegExpConstant, RegExpNormalChar] 9 +# 32| [RegExpConstant, RegExpNormalChar] 9 -# 19| [RegExpConstant, RegExpNormalChar] _ +# 32| [RegExpConstant, RegExpNormalChar] _ -# 20| [RegExpCaret] \A +# 33| [RegExpCaret] \A -# 20| [RegExpSequence] \A[+-]?\d+ +# 33| [RegExpSequence] \A[+-]?\d+ #-----| 0 -> [RegExpCaret] \A #-----| 1 -> [RegExpOpt] [+-]? #-----| 2 -> [RegExpPlus] \d+ -# 20| [RegExpCharacterClass] [+-] +# 33| [RegExpCharacterClass] [+-] #-----| 0 -> [RegExpConstant, RegExpNormalChar] + #-----| 1 -> [RegExpConstant, RegExpNormalChar] - -# 20| [RegExpOpt] [+-]? +# 33| [RegExpOpt] [+-]? #-----| 0 -> [RegExpCharacterClass] [+-] -# 20| [RegExpConstant, RegExpNormalChar] + +# 33| [RegExpConstant, RegExpNormalChar] + -# 20| [RegExpConstant, RegExpNormalChar] - +# 33| [RegExpConstant, RegExpNormalChar] - -# 20| [RegExpCharacterClassEscape] \d +# 33| [RegExpCharacterClassEscape] \d -# 20| [RegExpPlus] \d+ +# 33| [RegExpPlus] \d+ #-----| 0 -> [RegExpCharacterClassEscape] \d -# 21| [RegExpCharacterClass] [\w] +# 34| [RegExpCharacterClass] [\w] #-----| 0 -> [RegExpCharacterClassEscape] \w -# 21| [RegExpPlus] [\w]+ +# 34| [RegExpPlus] [\w]+ #-----| 0 -> [RegExpCharacterClass] [\w] -# 21| [RegExpCharacterClassEscape] \w +# 34| [RegExpCharacterClassEscape] \w -# 22| [RegExpConstant, RegExpEscape] \[ +# 35| [RegExpConstant, RegExpEscape] \[ -# 22| [RegExpSequence] \[\][123] +# 35| [RegExpSequence] \[\][123] #-----| 0 -> [RegExpConstant, RegExpEscape] \[ #-----| 1 -> [RegExpConstant, RegExpEscape] \] #-----| 2 -> [RegExpCharacterClass] [123] -# 22| [RegExpConstant, RegExpEscape] \] +# 35| [RegExpConstant, RegExpEscape] \] -# 22| [RegExpCharacterClass] [123] +# 35| [RegExpCharacterClass] [123] #-----| 0 -> [RegExpConstant, RegExpNormalChar] 1 #-----| 1 -> [RegExpConstant, RegExpNormalChar] 2 #-----| 2 -> [RegExpConstant, RegExpNormalChar] 3 -# 22| [RegExpConstant, RegExpNormalChar] 1 +# 35| [RegExpConstant, RegExpNormalChar] 1 -# 22| [RegExpConstant, RegExpNormalChar] 2 +# 35| [RegExpConstant, RegExpNormalChar] 2 -# 22| [RegExpConstant, RegExpNormalChar] 3 +# 35| [RegExpConstant, RegExpNormalChar] 3 -# 23| [RegExpCharacterClass] [^A-Z] +# 36| [RegExpCharacterClass] [^A-Z] #-----| 0 -> [RegExpCharacterRange] A-Z -# 23| [RegExpConstant, RegExpNormalChar] A +# 36| [RegExpConstant, RegExpNormalChar] A -# 23| [RegExpCharacterRange] A-Z +# 36| [RegExpCharacterRange] A-Z #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] Z -# 23| [RegExpConstant, RegExpNormalChar] Z +# 36| [RegExpConstant, RegExpNormalChar] Z -# 24| [RegExpCharacterClass] []] +# 37| [RegExpCharacterClass] []] #-----| 0 -> [RegExpConstant, RegExpNormalChar] ] -# 24| [RegExpConstant, RegExpNormalChar] ] +# 37| [RegExpConstant, RegExpNormalChar] ] -# 25| [RegExpCharacterClass] [^]] +# 38| [RegExpCharacterClass] [^]] #-----| 0 -> [RegExpConstant, RegExpNormalChar] ] -# 25| [RegExpConstant, RegExpNormalChar] ] +# 38| [RegExpConstant, RegExpNormalChar] ] -# 26| [RegExpCharacterClass] [^-] +# 39| [RegExpCharacterClass] [^-] #-----| 0 -> [RegExpConstant, RegExpNormalChar] - -# 26| [RegExpConstant, RegExpNormalChar] - +# 39| [RegExpConstant, RegExpNormalChar] - -# 27| [RegExpCharacterClass] [|] +# 40| [RegExpCharacterClass] [|] #-----| 0 -> [RegExpConstant, RegExpNormalChar] | -# 27| [RegExpConstant, RegExpNormalChar] | +# 40| [RegExpConstant, RegExpNormalChar] | -# 30| [RegExpCharacterClass] [[a-f] +# 43| [RegExpCharacterClass] [[a-f] #-----| 0 -> [RegExpConstant, RegExpNormalChar] [ #-----| 1 -> [RegExpCharacterRange] a-f -# 30| [RegExpSequence] [[a-f]A-F] +# 43| [RegExpSequence] [[a-f]A-F] #-----| 0 -> [RegExpCharacterClass] [[a-f] #-----| 1 -> [RegExpConstant, RegExpNormalChar] A-F] -# 30| [RegExpConstant, RegExpNormalChar] [ +# 43| [RegExpConstant, RegExpNormalChar] [ -# 30| [RegExpConstant, RegExpNormalChar] a +# 43| [RegExpConstant, RegExpNormalChar] a -# 30| [RegExpCharacterRange] a-f +# 43| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 30| [RegExpConstant, RegExpNormalChar] f +# 43| [RegExpConstant, RegExpNormalChar] f -# 30| [RegExpConstant, RegExpNormalChar] A-F] +# 43| [RegExpConstant, RegExpNormalChar] A-F] -# 33| [RegExpDot] . +# 46| [RegExpDot] . -# 33| [RegExpStar] .* +# 46| [RegExpStar] .* #-----| 0 -> [RegExpDot] . -# 34| [RegExpDot] . +# 47| [RegExpDot] . -# 34| [RegExpStar] .* +# 47| [RegExpStar] .* #-----| 0 -> [RegExpDot] . -# 35| [RegExpCharacterClassEscape] \w +# 48| [RegExpCharacterClassEscape] \w -# 35| [RegExpPlus] \w+ +# 48| [RegExpPlus] \w+ #-----| 0 -> [RegExpCharacterClassEscape] \w -# 35| [RegExpSequence] \w+\W +# 48| [RegExpSequence] \w+\W #-----| 0 -> [RegExpPlus] \w+ #-----| 1 -> [RegExpCharacterClassEscape] \W -# 35| [RegExpCharacterClassEscape] \W +# 48| [RegExpCharacterClassEscape] \W -# 36| [RegExpCharacterClassEscape] \s +# 49| [RegExpCharacterClassEscape] \s -# 36| [RegExpSequence] \s\S +# 49| [RegExpSequence] \s\S #-----| 0 -> [RegExpCharacterClassEscape] \s #-----| 1 -> [RegExpCharacterClassEscape] \S -# 36| [RegExpCharacterClassEscape] \S +# 49| [RegExpCharacterClassEscape] \S -# 37| [RegExpCharacterClassEscape] \d +# 50| [RegExpCharacterClassEscape] \d -# 37| [RegExpSequence] \d\D +# 50| [RegExpSequence] \d\D #-----| 0 -> [RegExpCharacterClassEscape] \d #-----| 1 -> [RegExpCharacterClassEscape] \D -# 37| [RegExpCharacterClassEscape] \D +# 50| [RegExpCharacterClassEscape] \D -# 38| [RegExpCharacterClassEscape] \h +# 51| [RegExpCharacterClassEscape] \h -# 38| [RegExpSequence] \h\H +# 51| [RegExpSequence] \h\H #-----| 0 -> [RegExpCharacterClassEscape] \h #-----| 1 -> [RegExpCharacterClassEscape] \H -# 38| [RegExpCharacterClassEscape] \H +# 51| [RegExpCharacterClassEscape] \H -# 39| [RegExpConstant, RegExpEscape] \n +# 52| [RegExpConstant, RegExpEscape] \n -# 39| [RegExpSequence] \n\r\t +# 52| [RegExpSequence] \n\r\t #-----| 0 -> [RegExpConstant, RegExpEscape] \n #-----| 1 -> [RegExpConstant, RegExpEscape] \r #-----| 2 -> [RegExpConstant, RegExpEscape] \t -# 39| [RegExpConstant, RegExpEscape] \r +# 52| [RegExpConstant, RegExpEscape] \r -# 39| [RegExpConstant, RegExpEscape] \t +# 52| [RegExpConstant, RegExpEscape] \t -# 42| [RegExpSpecialChar] \G +# 55| [RegExpSpecialChar] \G -# 42| [RegExpSequence] \Gabc +# 55| [RegExpSequence] \Gabc #-----| 0 -> [RegExpSpecialChar] \G #-----| 1 -> [RegExpConstant, RegExpNormalChar] abc -# 42| [RegExpConstant, RegExpNormalChar] abc +# 55| [RegExpConstant, RegExpNormalChar] abc -# 43| [RegExpSpecialChar] \b +# 56| [RegExpSpecialChar] \b -# 43| [RegExpSequence] \b!a\B +# 56| [RegExpSequence] \b!a\B #-----| 0 -> [RegExpSpecialChar] \b #-----| 1 -> [RegExpConstant, RegExpNormalChar] !a #-----| 2 -> [RegExpNonWordBoundary] \B -# 43| [RegExpConstant, RegExpNormalChar] !a +# 56| [RegExpConstant, RegExpNormalChar] !a -# 43| [RegExpNonWordBoundary] \B +# 56| [RegExpNonWordBoundary] \B -# 46| [RegExpGroup] (foo) +# 59| [RegExpGroup] (foo) #-----| 0 -> [RegExpConstant, RegExpNormalChar] foo -# 46| [RegExpStar] (foo)* +# 59| [RegExpStar] (foo)* #-----| 0 -> [RegExpGroup] (foo) -# 46| [RegExpSequence] (foo)*bar +# 59| [RegExpSequence] (foo)*bar #-----| 0 -> [RegExpStar] (foo)* #-----| 1 -> [RegExpConstant, RegExpNormalChar] bar -# 46| [RegExpConstant, RegExpNormalChar] foo +# 59| [RegExpConstant, RegExpNormalChar] foo -# 46| [RegExpConstant, RegExpNormalChar] bar +# 59| [RegExpConstant, RegExpNormalChar] bar -# 47| [RegExpConstant, RegExpNormalChar] fo +# 60| [RegExpConstant, RegExpNormalChar] fo -# 47| [RegExpSequence] fo(o|b)ar +# 60| [RegExpSequence] fo(o|b)ar #-----| 0 -> [RegExpConstant, RegExpNormalChar] fo #-----| 1 -> [RegExpGroup] (o|b) #-----| 2 -> [RegExpConstant, RegExpNormalChar] ar -# 47| [RegExpGroup] (o|b) +# 60| [RegExpGroup] (o|b) #-----| 0 -> [RegExpAlt] o|b -# 47| [RegExpConstant, RegExpNormalChar] o +# 60| [RegExpConstant, RegExpNormalChar] o -# 47| [RegExpAlt] o|b +# 60| [RegExpAlt] o|b #-----| 0 -> [RegExpConstant, RegExpNormalChar] o #-----| 1 -> [RegExpConstant, RegExpNormalChar] b -# 47| [RegExpConstant, RegExpNormalChar] b +# 60| [RegExpConstant, RegExpNormalChar] b -# 47| [RegExpConstant, RegExpNormalChar] ar +# 60| [RegExpConstant, RegExpNormalChar] ar -# 48| [RegExpGroup] (a|b|cd) +# 61| [RegExpGroup] (a|b|cd) #-----| 0 -> [RegExpAlt] a|b|cd -# 48| [RegExpSequence] (a|b|cd)e +# 61| [RegExpSequence] (a|b|cd)e #-----| 0 -> [RegExpGroup] (a|b|cd) #-----| 1 -> [RegExpConstant, RegExpNormalChar] e -# 48| [RegExpConstant, RegExpNormalChar] a +# 61| [RegExpConstant, RegExpNormalChar] a -# 48| [RegExpAlt] a|b|cd +# 61| [RegExpAlt] a|b|cd #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] b #-----| 2 -> [RegExpConstant, RegExpNormalChar] cd -# 48| [RegExpConstant, RegExpNormalChar] b +# 61| [RegExpConstant, RegExpNormalChar] b -# 48| [RegExpConstant, RegExpNormalChar] cd +# 61| [RegExpConstant, RegExpNormalChar] cd -# 48| [RegExpConstant, RegExpNormalChar] e +# 61| [RegExpConstant, RegExpNormalChar] e -# 49| [RegExpGroup] (?::+) +# 62| [RegExpGroup] (?::+) #-----| 0 -> [RegExpPlus] :+ -# 49| [RegExpSequence] (?::+)\w +# 62| [RegExpSequence] (?::+)\w #-----| 0 -> [RegExpGroup] (?::+) #-----| 1 -> [RegExpCharacterClassEscape] \w -# 49| [RegExpConstant, RegExpNormalChar] : +# 62| [RegExpConstant, RegExpNormalChar] : -# 49| [RegExpPlus] :+ +# 62| [RegExpPlus] :+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] : -# 49| [RegExpCharacterClassEscape] \w +# 62| [RegExpCharacterClassEscape] \w -# 52| [RegExpGroup] (?\w+) +# 65| [RegExpGroup] (?\w+) #-----| 0 -> [RegExpPlus] \w+ -# 52| [RegExpCharacterClassEscape] \w +# 65| [RegExpCharacterClassEscape] \w -# 52| [RegExpPlus] \w+ +# 65| [RegExpPlus] \w+ #-----| 0 -> [RegExpCharacterClassEscape] \w -# 53| [RegExpGroup] (?'foo'fo+) +# 66| [RegExpGroup] (?'foo'fo+) #-----| 0 -> [RegExpSequence] fo+ -# 53| [RegExpConstant, RegExpNormalChar] f +# 66| [RegExpConstant, RegExpNormalChar] f -# 53| [RegExpSequence] fo+ +# 66| [RegExpSequence] fo+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] f #-----| 1 -> [RegExpPlus] o+ -# 53| [RegExpConstant, RegExpNormalChar] o +# 66| [RegExpConstant, RegExpNormalChar] o -# 53| [RegExpPlus] o+ +# 66| [RegExpPlus] o+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] o -# 56| [RegExpGroup] (a+) +# 69| [RegExpGroup] (a+) #-----| 0 -> [RegExpPlus] a+ -# 56| [RegExpSequence] (a+)b+\1 +# 69| [RegExpSequence] (a+)b+\1 #-----| 0 -> [RegExpGroup] (a+) #-----| 1 -> [RegExpPlus] b+ #-----| 2 -> [RegExpBackRef] \1 -# 56| [RegExpConstant, RegExpNormalChar] a +# 69| [RegExpConstant, RegExpNormalChar] a -# 56| [RegExpPlus] a+ +# 69| [RegExpPlus] a+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] a -# 56| [RegExpConstant, RegExpNormalChar] b +# 69| [RegExpConstant, RegExpNormalChar] b -# 56| [RegExpPlus] b+ +# 69| [RegExpPlus] b+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] b -# 56| [RegExpBackRef] \1 +# 69| [RegExpBackRef] \1 -# 57| [RegExpGroup] (?q+) +# 70| [RegExpGroup] (?q+) #-----| 0 -> [RegExpPlus] q+ -# 57| [RegExpSequence] (?q+)\s+\k+ +# 70| [RegExpSequence] (?q+)\s+\k+ #-----| 0 -> [RegExpGroup] (?q+) #-----| 1 -> [RegExpPlus] \s+ #-----| 2 -> [RegExpPlus] \k+ -# 57| [RegExpConstant, RegExpNormalChar] q +# 70| [RegExpConstant, RegExpNormalChar] q -# 57| [RegExpPlus] q+ +# 70| [RegExpPlus] q+ #-----| 0 -> [RegExpConstant, RegExpNormalChar] q -# 57| [RegExpCharacterClassEscape] \s +# 70| [RegExpCharacterClassEscape] \s -# 57| [RegExpPlus] \s+ +# 70| [RegExpPlus] \s+ #-----| 0 -> [RegExpCharacterClassEscape] \s -# 57| [RegExpBackRef] \k +# 70| [RegExpBackRef] \k -# 57| [RegExpPlus] \k+ +# 70| [RegExpPlus] \k+ #-----| 0 -> [RegExpBackRef] \k -# 60| [RegExpNamedCharacterProperty] \p{Word} +# 73| [RegExpNamedCharacterProperty] \p{Word} -# 60| [RegExpStar] \p{Word}* +# 73| [RegExpStar] \p{Word}* #-----| 0 -> [RegExpNamedCharacterProperty] \p{Word} -# 61| [RegExpNamedCharacterProperty] \P{Digit} +# 74| [RegExpNamedCharacterProperty] \P{Digit} -# 61| [RegExpPlus] \P{Digit}+ +# 74| [RegExpPlus] \P{Digit}+ #-----| 0 -> [RegExpNamedCharacterProperty] \P{Digit} -# 62| [RegExpNamedCharacterProperty] \p{^Alnum} +# 75| [RegExpNamedCharacterProperty] \p{^Alnum} -# 62| [RegExpRange] \p{^Alnum}{2,3} +# 75| [RegExpRange] \p{^Alnum}{2,3} #-----| 0 -> [RegExpNamedCharacterProperty] \p{^Alnum} -# 63| [RegExpCharacterClass] [a-f\p{Digit}] +# 76| [RegExpCharacterClass] [a-f\p{Digit}] #-----| 0 -> [RegExpCharacterRange] a-f #-----| 1 -> [RegExpNamedCharacterProperty] \p{Digit} -# 63| [RegExpPlus] [a-f\p{Digit}]+ +# 76| [RegExpPlus] [a-f\p{Digit}]+ #-----| 0 -> [RegExpCharacterClass] [a-f\p{Digit}] -# 63| [RegExpConstant, RegExpNormalChar] a +# 76| [RegExpConstant, RegExpNormalChar] a -# 63| [RegExpCharacterRange] a-f +# 76| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 63| [RegExpConstant, RegExpNormalChar] f +# 76| [RegExpConstant, RegExpNormalChar] f -# 63| [RegExpNamedCharacterProperty] \p{Digit} +# 76| [RegExpNamedCharacterProperty] \p{Digit} -# 66| [RegExpCharacterClass] [[:alpha:]] +# 79| [RegExpCharacterClass] [[:alpha:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] -# 66| [RegExpSequence] [[:alpha:]][[:digit:]] +# 79| [RegExpSequence] [[:alpha:]][[:digit:]] #-----| 0 -> [RegExpCharacterClass] [[:alpha:]] #-----| 1 -> [RegExpCharacterClass] [[:digit:]] -# 66| [RegExpNamedCharacterProperty] [:alpha:] +# 79| [RegExpNamedCharacterProperty] [:alpha:] -# 66| [RegExpCharacterClass] [[:digit:]] +# 79| [RegExpCharacterClass] [[:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:digit:] -# 66| [RegExpNamedCharacterProperty] [:digit:] +# 79| [RegExpNamedCharacterProperty] [:digit:] -# 69| [RegExpCharacterClass] [[:alpha:][:digit:]] +# 82| [RegExpCharacterClass] [[:alpha:][:digit:]] #-----| 0 -> [RegExpNamedCharacterProperty] [:alpha:] #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] -# 69| [RegExpNamedCharacterProperty] [:alpha:] +# 82| [RegExpNamedCharacterProperty] [:alpha:] -# 69| [RegExpNamedCharacterProperty] [:digit:] +# 82| [RegExpNamedCharacterProperty] [:digit:] -# 72| [RegExpCharacterClass] [A-F[:digit:]a-f] +# 85| [RegExpCharacterClass] [A-F[:digit:]a-f] #-----| 0 -> [RegExpCharacterRange] A-F #-----| 1 -> [RegExpNamedCharacterProperty] [:digit:] #-----| 2 -> [RegExpCharacterRange] a-f -# 72| [RegExpConstant, RegExpNormalChar] A +# 85| [RegExpConstant, RegExpNormalChar] A -# 72| [RegExpCharacterRange] A-F +# 85| [RegExpCharacterRange] A-F #-----| 0 -> [RegExpConstant, RegExpNormalChar] A #-----| 1 -> [RegExpConstant, RegExpNormalChar] F -# 72| [RegExpConstant, RegExpNormalChar] F +# 85| [RegExpConstant, RegExpNormalChar] F -# 72| [RegExpNamedCharacterProperty] [:digit:] +# 85| [RegExpNamedCharacterProperty] [:digit:] -# 72| [RegExpConstant, RegExpNormalChar] a +# 85| [RegExpConstant, RegExpNormalChar] a -# 72| [RegExpCharacterRange] a-f +# 85| [RegExpCharacterRange] a-f #-----| 0 -> [RegExpConstant, RegExpNormalChar] a #-----| 1 -> [RegExpConstant, RegExpNormalChar] f -# 72| [RegExpConstant, RegExpNormalChar] f +# 85| [RegExpConstant, RegExpNormalChar] f -# 75| [RegExpNamedCharacterProperty] [:digit:] +# 88| [RegExpNamedCharacterProperty] [:digit:] -# 79| [RegExpConstant, RegExpNormalChar] abc - -# 82| [RegExpConstant, RegExpEscape] \u{987 +# 91| [RegExpConstant, RegExpEscape] \u{987 diff --git a/cpp/ql/test/library-tests/regex/parse.ql b/cpp/ql/test/library-tests/regex/parse.ql index ba9a04ab9bd..2e9debf3784 100644 --- a/cpp/ql/test/library-tests/regex/parse.ql +++ b/cpp/ql/test/library-tests/regex/parse.ql @@ -2,8 +2,14 @@ * @kind graph */ +import semmle.code.cpp.regex.internal.ParseRegExp import semmle.code.cpp.regex.RegexTreeView +// Stop gap for missing flow configs +class RegExpTest extends RegExp { + RegExpTest() { any() } +} + query predicate nodes(RegExpTerm n, string attr, string val) { attr = "semmle.label" and val = "[" + concat(n.getAPrimaryQlClass(), ", ") + "] " + n.toString() diff --git a/cpp/ql/test/library-tests/regex/regexp.cpp b/cpp/ql/test/library-tests/regex/regexp.cpp index a68c4878094..d0ba8099db5 100644 --- a/cpp/ql/test/library-tests/regex/regexp.cpp +++ b/cpp/ql/test/library-tests/regex/regexp.cpp @@ -1,82 +1,91 @@ -# Empty -// +// semmle-extractor-options: -std=c++17 -# Basic sequence -/abc/ +namespace std { + template + class basic_regex { + public: + basic_regex(const char *s) {} + basic_regex(const char *s, int flags) {} + basic_regex &assign(const char *s) { return *this; } + }; + typedef basic_regex regex; +} // namespace std -# Repetition -/a*b+c?d/ -/a{4,8}/ -/a{,8}/ -/a{3,}/ -/a{7}/ +// Empty +std::regex r_empty(""); -# Alternation -/foo|bar/ +// Basic sequence +std::regex r_abc("abc"); -# Character classes -/[abc]/ -/[a-fA-F0-9_]/ -/\A[+-]?\d+/ -/[\w]+/ -/\[\][123]/ -/[^A-Z]/ -/[]]/ # MRI gives a warning, but accepts this as matching ']' -/[^]]/ # MRI gives a warning, but accepts this as matching anything except ']' -/[^-]/ -/[|]/ +// Repetition +std::regex r_rep1("a*b+c?d"); +std::regex r_rep2("a{4,8}"); +std::regex r_rep3("a{,8}"); +std::regex r_rep4("a{3,}"); +std::regex r_rep5("a{7}"); -# Nested character classes -/[[a-f]A-F]/ # BAD - not parsed correctly +// Alternation +std::regex r_alt("foo|bar"); -# Meta-character classes -/.*/ -/.*/m -/\w+\W/ -/\s\S/ -/\d\D/ -/\h\H/ -/\n\r\t/ +// Character classes +std::regex r_cc1("[abc]"); +std::regex r_cc2("[a-fA-F0-9_]"); +std::regex r_cc3("\\A[+-]?\\d+"); +std::regex r_cc4("[\\w]+"); +std::regex r_cc5("\\[\\][123]"); +std::regex r_cc6("[^A-Z]"); +std::regex r_cc7("[]]"); // MRI gives a warning, but accepts this as matching ']' +std::regex r_cc8("[^]]"); // MRI gives a warning, but accepts this as matching anything except ']' +std::regex r_cc9("[^-]"); +std::regex r_cc10("[|]"); -# Anchors -/\Gabc/ -/\b!a\B/ +// Nested character classes (BAD - not parsed correctly) +std::regex r_nested("[[a-f]A-F]"); -# Groups -/(foo)*bar/ -/fo(o|b)ar/ -/(a|b|cd)e/ -/(?::+)\w/ # Non-capturing group matching colons +// Meta-character classes +std::regex r_meta1(".*"); +std::regex r_meta1m(".*"); // /.*/m mode variant — mode flags are constructor args in C++ +std::regex r_meta2("\\w+\\W"); +std::regex r_meta3("\\s\\S"); +std::regex r_meta4("\\d\\D"); +std::regex r_meta5("\\h\\H"); +std::regex r_meta6("\\n\\r\\t"); -# Named groups -/(?\w+)/ -/(?'foo'fo+)/ +// Anchors +std::regex r_anc1("\\Gabc"); +std::regex r_anc2("\\b!a\\B"); -# Backreferences -/(a+)b+\1/ -/(?q+)\s+\k+/ +// Groups +std::regex r_grp1("(foo)*bar"); +std::regex r_grp2("fo(o|b)ar"); +std::regex r_grp3("(a|b|cd)e"); +std::regex r_grp4("(?::+)\\w"); // Non-capturing group matching colons -# Named character properties using the p-style syntax -/\p{Word}*/ -/\P{Digit}+/ -/\p{^Alnum}{2,3}/ -/[a-f\p{Digit}]+/ # Also valid inside character classes +// Named groups +std::regex r_ng1("(?\\w+)"); +std::regex r_ng2("(?'foo'fo+)"); // single-quote named-group form -# Two separate character classes, each containing a single POSIX bracket expression -/[[:alpha:]][[:digit:]]/ +// Backreferences +std::regex r_bref1("(a+)b+\\1"); +std::regex r_bref2("(?q+)\\s+\\k+"); -# A single character class containing two POSIX bracket expressions -/[[:alpha:][:digit:]]/ +// Named character properties using the p-style syntax +std::regex r_prop1("\\p{Word}*"); +std::regex r_prop2("\\P{Digit}+"); +std::regex r_prop3("\\p{^Alnum}{2,3}"); +std::regex r_prop4("[a-f\\p{Digit}]+"); // Also valid inside character classes -# A single character class containing two ranges and one POSIX bracket expression -/[A-F[:digit:]a-f]/ +// Two separate character classes, each containing a single POSIX bracket expression +std::regex r_posix1("[[:alpha:]][[:digit:]]"); -# *Not* a POSIX bracket expression; just a regular character class. -/[:digit:]/ +// A single character class containing two POSIX bracket expressions +std::regex r_posix2("[[:alpha:][:digit:]]"); -# Simple constant interpolation -A = "a" -/#{A}bc/ +// A single character class containing two ranges and one POSIX bracket expression +std::regex r_posix3("[A-F[:digit:]a-f]"); -# unicode -/\u{9879}/ \ No newline at end of file +// *Not* a POSIX bracket expression; just a regular character class. +std::regex r_posix4("[:digit:]"); + +// unicode +std::regex r_uni("\\u{9879}"); diff --git a/cpp/ql/test/library-tests/regex/regexp.expected b/cpp/ql/test/library-tests/regex/regexp.expected index e464b5ce5ea..6b2409e7c7c 100644 --- a/cpp/ql/test/library-tests/regex/regexp.expected +++ b/cpp/ql/test/library-tests/regex/regexp.expected @@ -1,270 +1,268 @@ groupName -| regexp.rb:52:2:52:11 | (?\\w+) | id | -| regexp.rb:53:2:53:12 | (?'foo'fo+) | foo | -| regexp.rb:57:2:57:11 | (?q+) | qux | +| regexp.cpp:65:19:65:28 | (?\\w+) | id | +| regexp.cpp:66:19:66:29 | (?'foo'fo+) | foo | +| regexp.cpp:70:21:70:30 | (?q+) | qux | groupNumber -| regexp.rb:46:2:46:6 | (foo) | 1 | -| regexp.rb:47:4:47:8 | (o\|b) | 1 | -| regexp.rb:48:2:48:9 | (a\|b\|cd) | 1 | -| regexp.rb:53:2:53:12 | (?'foo'fo+) | 1 | -| regexp.rb:56:2:56:5 | (a+) | 1 | +| regexp.cpp:59:20:59:24 | (foo) | 1 | +| regexp.cpp:60:22:60:26 | (o\|b) | 1 | +| regexp.cpp:61:20:61:27 | (a\|b\|cd) | 1 | +| regexp.cpp:66:19:66:29 | (?'foo'fo+) | 1 | +| regexp.cpp:69:21:69:24 | (a+) | 1 | term -| regexp.rb:5:2:5:4 | abc | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:2:8:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:2:8:3 | a* | RegExpStar | -| regexp.rb:8:2:8:8 | a*b+c?d | RegExpSequence | -| regexp.rb:8:4:8:4 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:4:8:5 | b+ | RegExpPlus | -| regexp.rb:8:6:8:6 | c | RegExpConstant,RegExpNormalChar | -| regexp.rb:8:6:8:7 | c? | RegExpOpt | -| regexp.rb:8:8:8:8 | d | RegExpConstant,RegExpNormalChar | -| regexp.rb:9:2:9:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:9:2:9:7 | a{4,8} | RegExpRange | -| regexp.rb:10:2:10:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:10:2:10:6 | a{,8} | RegExpRange | -| regexp.rb:11:2:11:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:11:2:11:6 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | -| regexp.rb:12:2:12:2 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:12:2:12:5 | a{7} | RegExpRange | -| regexp.rb:15:2:15:4 | foo | RegExpConstant,RegExpNormalChar | -| regexp.rb:15:2:15:8 | foo\|bar | RegExpAlt | -| regexp.rb:15:6:15:8 | bar | RegExpConstant,RegExpNormalChar | -| regexp.rb:18:2:18:6 | [abc] | RegExpCharacterClass | -| regexp.rb:18:3:18:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:18:4:18:4 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:18:5:18:5 | c | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:2:19:13 | [a-fA-F0-9_] | RegExpCharacterClass | -| regexp.rb:19:3:19:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:3:19:5 | a-f | RegExpCharacterRange | -| regexp.rb:19:5:19:5 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:6:19:6 | A | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:6:19:8 | A-F | RegExpCharacterRange | -| regexp.rb:19:8:19:8 | F | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:9:19:9 | 0 | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:9:19:11 | 0-9 | RegExpCharacterRange | -| regexp.rb:19:11:19:11 | 9 | RegExpConstant,RegExpNormalChar | -| regexp.rb:19:12:19:12 | _ | RegExpConstant,RegExpNormalChar | -| regexp.rb:20:2:20:3 | \\A | RegExpCaret | -| regexp.rb:20:2:20:11 | \\A[+-]?\\d+ | RegExpSequence | -| regexp.rb:20:4:20:7 | [+-] | RegExpCharacterClass | -| regexp.rb:20:4:20:8 | [+-]? | RegExpOpt | -| regexp.rb:20:5:20:5 | + | RegExpConstant,RegExpNormalChar | -| regexp.rb:20:6:20:6 | - | RegExpConstant,RegExpNormalChar | -| regexp.rb:20:9:20:10 | \\d | RegExpCharacterClassEscape | -| regexp.rb:20:9:20:11 | \\d+ | RegExpPlus | -| regexp.rb:21:2:21:5 | [\\w] | RegExpCharacterClass | -| regexp.rb:21:2:21:6 | [\\w]+ | RegExpPlus | -| regexp.rb:21:3:21:4 | \\w | RegExpCharacterClassEscape | -| regexp.rb:22:2:22:3 | \\[ | RegExpConstant,RegExpEscape | -| regexp.rb:22:2:22:10 | \\[\\][123] | RegExpSequence | -| regexp.rb:22:4:22:5 | \\] | RegExpConstant,RegExpEscape | -| regexp.rb:22:6:22:10 | [123] | RegExpCharacterClass | -| regexp.rb:22:7:22:7 | 1 | RegExpConstant,RegExpNormalChar | -| regexp.rb:22:8:22:8 | 2 | RegExpConstant,RegExpNormalChar | -| regexp.rb:22:9:22:9 | 3 | RegExpConstant,RegExpNormalChar | -| regexp.rb:23:2:23:7 | [^A-Z] | RegExpCharacterClass | -| regexp.rb:23:4:23:4 | A | RegExpConstant,RegExpNormalChar | -| regexp.rb:23:4:23:6 | A-Z | RegExpCharacterRange | -| regexp.rb:23:6:23:6 | Z | RegExpConstant,RegExpNormalChar | -| regexp.rb:24:2:24:4 | []] | RegExpCharacterClass | -| regexp.rb:24:3:24:3 | ] | RegExpConstant,RegExpNormalChar | -| regexp.rb:25:2:25:5 | [^]] | RegExpCharacterClass | -| regexp.rb:25:4:25:4 | ] | RegExpConstant,RegExpNormalChar | -| regexp.rb:26:2:26:5 | [^-] | RegExpCharacterClass | -| regexp.rb:26:4:26:4 | - | RegExpConstant,RegExpNormalChar | -| regexp.rb:27:2:27:4 | [\|] | RegExpCharacterClass | -| regexp.rb:27:3:27:3 | \| | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:2:30:7 | [[a-f] | RegExpCharacterClass | -| regexp.rb:30:2:30:11 | [[a-f]A-F] | RegExpSequence | -| regexp.rb:30:3:30:3 | [ | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:4:30:4 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:4:30:6 | a-f | RegExpCharacterRange | -| regexp.rb:30:6:30:6 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:30:8:30:11 | A-F] | RegExpConstant,RegExpNormalChar | -| regexp.rb:33:2:33:2 | . | RegExpDot | -| regexp.rb:33:2:33:3 | .* | RegExpStar | -| regexp.rb:34:2:34:2 | . | RegExpDot | -| regexp.rb:34:2:34:3 | .* | RegExpStar | -| regexp.rb:35:2:35:3 | \\w | RegExpCharacterClassEscape | -| regexp.rb:35:2:35:4 | \\w+ | RegExpPlus | -| regexp.rb:35:2:35:6 | \\w+\\W | RegExpSequence | -| regexp.rb:35:5:35:6 | \\W | RegExpCharacterClassEscape | -| regexp.rb:36:2:36:3 | \\s | RegExpCharacterClassEscape | -| regexp.rb:36:2:36:5 | \\s\\S | RegExpSequence | -| regexp.rb:36:4:36:5 | \\S | RegExpCharacterClassEscape | -| regexp.rb:37:2:37:3 | \\d | RegExpCharacterClassEscape | -| regexp.rb:37:2:37:5 | \\d\\D | RegExpSequence | -| regexp.rb:37:4:37:5 | \\D | RegExpCharacterClassEscape | -| regexp.rb:38:2:38:3 | \\h | RegExpCharacterClassEscape | -| regexp.rb:38:2:38:5 | \\h\\H | RegExpSequence | -| regexp.rb:38:4:38:5 | \\H | RegExpCharacterClassEscape | -| regexp.rb:39:2:39:3 | \\n | RegExpConstant,RegExpEscape | -| regexp.rb:39:2:39:7 | \\n\\r\\t | RegExpSequence | -| regexp.rb:39:4:39:5 | \\r | RegExpConstant,RegExpEscape | -| regexp.rb:39:6:39:7 | \\t | RegExpConstant,RegExpEscape | -| regexp.rb:42:2:42:3 | \\G | RegExpSpecialChar | -| regexp.rb:42:2:42:6 | \\Gabc | RegExpSequence | -| regexp.rb:42:4:42:6 | abc | RegExpConstant,RegExpNormalChar | -| regexp.rb:43:2:43:3 | \\b | RegExpSpecialChar | -| regexp.rb:43:2:43:7 | \\b!a\\B | RegExpSequence | -| regexp.rb:43:4:43:5 | !a | RegExpConstant,RegExpNormalChar | -| regexp.rb:43:6:43:7 | \\B | RegExpNonWordBoundary | -| regexp.rb:46:2:46:6 | (foo) | RegExpGroup | -| regexp.rb:46:2:46:7 | (foo)* | RegExpStar | -| regexp.rb:46:2:46:10 | (foo)*bar | RegExpSequence | -| regexp.rb:46:3:46:5 | foo | RegExpConstant,RegExpNormalChar | -| regexp.rb:46:8:46:10 | bar | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:2:47:3 | fo | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:2:47:10 | fo(o\|b)ar | RegExpSequence | -| regexp.rb:47:4:47:8 | (o\|b) | RegExpGroup | -| regexp.rb:47:5:47:5 | o | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:5:47:7 | o\|b | RegExpAlt | -| regexp.rb:47:7:47:7 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:47:9:47:10 | ar | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:2:48:9 | (a\|b\|cd) | RegExpGroup | -| regexp.rb:48:2:48:10 | (a\|b\|cd)e | RegExpSequence | -| regexp.rb:48:3:48:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:3:48:8 | a\|b\|cd | RegExpAlt | -| regexp.rb:48:5:48:5 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:7:48:8 | cd | RegExpConstant,RegExpNormalChar | -| regexp.rb:48:10:48:10 | e | RegExpConstant,RegExpNormalChar | -| regexp.rb:49:2:49:7 | (?::+) | RegExpGroup | -| regexp.rb:49:2:49:9 | (?::+)\\w | RegExpSequence | -| regexp.rb:49:5:49:5 | : | RegExpConstant,RegExpNormalChar | -| regexp.rb:49:5:49:6 | :+ | RegExpPlus | -| regexp.rb:49:8:49:9 | \\w | RegExpCharacterClassEscape | -| regexp.rb:52:2:52:11 | (?\\w+) | RegExpGroup | -| regexp.rb:52:8:52:9 | \\w | RegExpCharacterClassEscape | -| regexp.rb:52:8:52:10 | \\w+ | RegExpPlus | -| regexp.rb:53:2:53:12 | (?'foo'fo+) | RegExpGroup | -| regexp.rb:53:9:53:9 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:53:9:53:11 | fo+ | RegExpSequence | -| regexp.rb:53:10:53:10 | o | RegExpConstant,RegExpNormalChar | -| regexp.rb:53:10:53:11 | o+ | RegExpPlus | -| regexp.rb:56:2:56:5 | (a+) | RegExpGroup | -| regexp.rb:56:2:56:9 | (a+)b+\\1 | RegExpSequence | -| regexp.rb:56:3:56:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:56:3:56:4 | a+ | RegExpPlus | -| regexp.rb:56:6:56:6 | b | RegExpConstant,RegExpNormalChar | -| regexp.rb:56:6:56:7 | b+ | RegExpPlus | -| regexp.rb:56:8:56:9 | \\1 | RegExpBackRef | -| regexp.rb:57:2:57:11 | (?q+) | RegExpGroup | -| regexp.rb:57:2:57:22 | (?q+)\\s+\\k+ | RegExpSequence | -| regexp.rb:57:9:57:9 | q | RegExpConstant,RegExpNormalChar | -| regexp.rb:57:9:57:10 | q+ | RegExpPlus | -| regexp.rb:57:12:57:13 | \\s | RegExpCharacterClassEscape | -| regexp.rb:57:12:57:14 | \\s+ | RegExpPlus | -| regexp.rb:57:15:57:21 | \\k | RegExpBackRef | -| regexp.rb:57:15:57:22 | \\k+ | RegExpPlus | -| regexp.rb:60:2:60:9 | \\p{Word} | RegExpNamedCharacterProperty | -| regexp.rb:60:2:60:10 | \\p{Word}* | RegExpStar | -| regexp.rb:61:2:61:10 | \\P{Digit} | RegExpNamedCharacterProperty | -| regexp.rb:61:2:61:11 | \\P{Digit}+ | RegExpPlus | -| regexp.rb:62:2:62:11 | \\p{^Alnum} | RegExpNamedCharacterProperty | -| regexp.rb:62:2:62:16 | \\p{^Alnum}{2,3} | RegExpRange | -| regexp.rb:63:2:63:15 | [a-f\\p{Digit}] | RegExpCharacterClass | -| regexp.rb:63:2:63:16 | [a-f\\p{Digit}]+ | RegExpPlus | -| regexp.rb:63:3:63:3 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:63:3:63:5 | a-f | RegExpCharacterRange | -| regexp.rb:63:5:63:5 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:63:6:63:14 | \\p{Digit} | RegExpNamedCharacterProperty | -| regexp.rb:66:2:66:12 | [[:alpha:]] | RegExpCharacterClass | -| regexp.rb:66:2:66:23 | [[:alpha:]][[:digit:]] | RegExpSequence | -| regexp.rb:66:3:66:11 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.rb:66:13:66:23 | [[:digit:]] | RegExpCharacterClass | -| regexp.rb:66:14:66:22 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:69:2:69:21 | [[:alpha:][:digit:]] | RegExpCharacterClass | -| regexp.rb:69:3:69:11 | [:alpha:] | RegExpNamedCharacterProperty | -| regexp.rb:69:12:69:20 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:72:2:72:18 | [A-F[:digit:]a-f] | RegExpCharacterClass | -| regexp.rb:72:3:72:3 | A | RegExpConstant,RegExpNormalChar | -| regexp.rb:72:3:72:5 | A-F | RegExpCharacterRange | -| regexp.rb:72:5:72:5 | F | RegExpConstant,RegExpNormalChar | -| regexp.rb:72:6:72:14 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:72:15:72:15 | a | RegExpConstant,RegExpNormalChar | -| regexp.rb:72:15:72:17 | a-f | RegExpCharacterRange | -| regexp.rb:72:17:72:17 | f | RegExpConstant,RegExpNormalChar | -| regexp.rb:75:2:75:10 | [:digit:] | RegExpNamedCharacterProperty | -| regexp.rb:79:2:79:4 | abc | RegExpConstant,RegExpNormalChar | -| regexp.rb:82:2:82:7 | \\u{987 | RegExpConstant,RegExpEscape | +| regexp.cpp:18:19:18:21 | abc | RegExpConstant,RegExpNormalChar | +| regexp.cpp:21:20:21:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:21:20:21:21 | a* | RegExpStar | +| regexp.cpp:21:20:21:26 | a*b+c?d | RegExpSequence | +| regexp.cpp:21:22:21:22 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:21:22:21:23 | b+ | RegExpPlus | +| regexp.cpp:21:24:21:24 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:21:24:21:25 | c? | RegExpOpt | +| regexp.cpp:21:26:21:26 | d | RegExpConstant,RegExpNormalChar | +| regexp.cpp:22:20:22:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:22:20:22:25 | a{4,8} | RegExpRange | +| regexp.cpp:23:20:23:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:23:20:23:24 | a{,8} | RegExpRange | +| regexp.cpp:24:20:24:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:24:20:24:24 | a{3,} | InfiniteRepetitionQuantifier,RegExpRange | +| regexp.cpp:25:20:25:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:25:20:25:23 | a{7} | RegExpRange | +| regexp.cpp:28:19:28:21 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:28:19:28:25 | foo\|bar | RegExpAlt | +| regexp.cpp:28:23:28:25 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:19:31:23 | [abc] | RegExpCharacterClass | +| regexp.cpp:31:20:31:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:21:31:21 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:31:22:31:22 | c | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:19:32:30 | [a-fA-F0-9_] | RegExpCharacterClass | +| regexp.cpp:32:20:32:20 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:20:32:22 | a-f | RegExpCharacterRange | +| regexp.cpp:32:22:32:22 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:23:32:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:23:32:25 | A-F | RegExpCharacterRange | +| regexp.cpp:32:25:32:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:26:32:26 | 0 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:26:32:28 | 0-9 | RegExpCharacterRange | +| regexp.cpp:32:28:32:28 | 9 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:32:29:32:29 | _ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:33:19:33:20 | \\A | RegExpCaret | +| regexp.cpp:33:19:33:28 | \\A[+-]?\\d+ | RegExpSequence | +| regexp.cpp:33:21:33:24 | [+-] | RegExpCharacterClass | +| regexp.cpp:33:21:33:25 | [+-]? | RegExpOpt | +| regexp.cpp:33:22:33:22 | + | RegExpConstant,RegExpNormalChar | +| regexp.cpp:33:23:33:23 | - | RegExpConstant,RegExpNormalChar | +| regexp.cpp:33:26:33:27 | \\d | RegExpCharacterClassEscape | +| regexp.cpp:33:26:33:28 | \\d+ | RegExpPlus | +| regexp.cpp:34:19:34:22 | [\\w] | RegExpCharacterClass | +| regexp.cpp:34:19:34:23 | [\\w]+ | RegExpPlus | +| regexp.cpp:34:20:34:21 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:35:19:35:20 | \\[ | RegExpConstant,RegExpEscape | +| regexp.cpp:35:19:35:27 | \\[\\][123] | RegExpSequence | +| regexp.cpp:35:21:35:22 | \\] | RegExpConstant,RegExpEscape | +| regexp.cpp:35:23:35:27 | [123] | RegExpCharacterClass | +| regexp.cpp:35:24:35:24 | 1 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:35:25:35:25 | 2 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:35:26:35:26 | 3 | RegExpConstant,RegExpNormalChar | +| regexp.cpp:36:19:36:24 | [^A-Z] | RegExpCharacterClass | +| regexp.cpp:36:21:36:21 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:36:21:36:23 | A-Z | RegExpCharacterRange | +| regexp.cpp:36:23:36:23 | Z | RegExpConstant,RegExpNormalChar | +| regexp.cpp:37:19:37:21 | []] | RegExpCharacterClass | +| regexp.cpp:37:20:37:20 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:38:19:38:22 | [^]] | RegExpCharacterClass | +| regexp.cpp:38:21:38:21 | ] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:39:19:39:22 | [^-] | RegExpCharacterClass | +| regexp.cpp:39:21:39:21 | - | RegExpConstant,RegExpNormalChar | +| regexp.cpp:40:20:40:22 | [\|] | RegExpCharacterClass | +| regexp.cpp:40:21:40:21 | \| | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:22:43:27 | [[a-f] | RegExpCharacterClass | +| regexp.cpp:43:22:43:31 | [[a-f]A-F] | RegExpSequence | +| regexp.cpp:43:23:43:23 | [ | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:24:43:24 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:24:43:26 | a-f | RegExpCharacterRange | +| regexp.cpp:43:26:43:26 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:43:28:43:31 | A-F] | RegExpConstant,RegExpNormalChar | +| regexp.cpp:46:21:46:21 | . | RegExpDot | +| regexp.cpp:46:21:46:22 | .* | RegExpStar | +| regexp.cpp:47:22:47:22 | . | RegExpDot | +| regexp.cpp:47:22:47:23 | .* | RegExpStar | +| regexp.cpp:48:21:48:22 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:48:21:48:23 | \\w+ | RegExpPlus | +| regexp.cpp:48:21:48:25 | \\w+\\W | RegExpSequence | +| regexp.cpp:48:24:48:25 | \\W | RegExpCharacterClassEscape | +| regexp.cpp:49:21:49:22 | \\s | RegExpCharacterClassEscape | +| regexp.cpp:49:21:49:24 | \\s\\S | RegExpSequence | +| regexp.cpp:49:23:49:24 | \\S | RegExpCharacterClassEscape | +| regexp.cpp:50:21:50:22 | \\d | RegExpCharacterClassEscape | +| regexp.cpp:50:21:50:24 | \\d\\D | RegExpSequence | +| regexp.cpp:50:23:50:24 | \\D | RegExpCharacterClassEscape | +| regexp.cpp:51:21:51:22 | \\h | RegExpCharacterClassEscape | +| regexp.cpp:51:21:51:24 | \\h\\H | RegExpSequence | +| regexp.cpp:51:23:51:24 | \\H | RegExpCharacterClassEscape | +| regexp.cpp:52:21:52:22 | \\n | RegExpConstant,RegExpEscape | +| regexp.cpp:52:21:52:26 | \\n\\r\\t | RegExpSequence | +| regexp.cpp:52:23:52:24 | \\r | RegExpConstant,RegExpEscape | +| regexp.cpp:52:25:52:26 | \\t | RegExpConstant,RegExpEscape | +| regexp.cpp:55:20:55:21 | \\G | RegExpSpecialChar | +| regexp.cpp:55:20:55:24 | \\Gabc | RegExpSequence | +| regexp.cpp:55:22:55:24 | abc | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:20:56:21 | \\b | RegExpSpecialChar | +| regexp.cpp:56:20:56:25 | \\b!a\\B | RegExpSequence | +| regexp.cpp:56:22:56:23 | !a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:56:24:56:25 | \\B | RegExpNonWordBoundary | +| regexp.cpp:59:20:59:24 | (foo) | RegExpGroup | +| regexp.cpp:59:20:59:25 | (foo)* | RegExpStar | +| regexp.cpp:59:20:59:28 | (foo)*bar | RegExpSequence | +| regexp.cpp:59:21:59:23 | foo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:59:26:59:28 | bar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:20:60:21 | fo | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:20:60:28 | fo(o\|b)ar | RegExpSequence | +| regexp.cpp:60:22:60:26 | (o\|b) | RegExpGroup | +| regexp.cpp:60:23:60:23 | o | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:23:60:25 | o\|b | RegExpAlt | +| regexp.cpp:60:25:60:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:60:27:60:28 | ar | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:20:61:27 | (a\|b\|cd) | RegExpGroup | +| regexp.cpp:61:20:61:28 | (a\|b\|cd)e | RegExpSequence | +| regexp.cpp:61:21:61:21 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:21:61:26 | a\|b\|cd | RegExpAlt | +| regexp.cpp:61:23:61:23 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:25:61:26 | cd | RegExpConstant,RegExpNormalChar | +| regexp.cpp:61:28:61:28 | e | RegExpConstant,RegExpNormalChar | +| regexp.cpp:62:20:62:25 | (?::+) | RegExpGroup | +| regexp.cpp:62:20:62:27 | (?::+)\\w | RegExpSequence | +| regexp.cpp:62:23:62:23 | : | RegExpConstant,RegExpNormalChar | +| regexp.cpp:62:23:62:24 | :+ | RegExpPlus | +| regexp.cpp:62:26:62:27 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:65:19:65:28 | (?\\w+) | RegExpGroup | +| regexp.cpp:65:25:65:26 | \\w | RegExpCharacterClassEscape | +| regexp.cpp:65:25:65:27 | \\w+ | RegExpPlus | +| regexp.cpp:66:19:66:29 | (?'foo'fo+) | RegExpGroup | +| regexp.cpp:66:26:66:26 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:66:26:66:28 | fo+ | RegExpSequence | +| regexp.cpp:66:27:66:27 | o | RegExpConstant,RegExpNormalChar | +| regexp.cpp:66:27:66:28 | o+ | RegExpPlus | +| regexp.cpp:69:21:69:24 | (a+) | RegExpGroup | +| regexp.cpp:69:21:69:28 | (a+)b+\\1 | RegExpSequence | +| regexp.cpp:69:22:69:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:69:22:69:23 | a+ | RegExpPlus | +| regexp.cpp:69:25:69:25 | b | RegExpConstant,RegExpNormalChar | +| regexp.cpp:69:25:69:26 | b+ | RegExpPlus | +| regexp.cpp:69:27:69:28 | \\1 | RegExpBackRef | +| regexp.cpp:70:21:70:30 | (?q+) | RegExpGroup | +| regexp.cpp:70:21:70:41 | (?q+)\\s+\\k+ | RegExpSequence | +| regexp.cpp:70:28:70:28 | q | RegExpConstant,RegExpNormalChar | +| regexp.cpp:70:28:70:29 | q+ | RegExpPlus | +| regexp.cpp:70:31:70:32 | \\s | RegExpCharacterClassEscape | +| regexp.cpp:70:31:70:33 | \\s+ | RegExpPlus | +| regexp.cpp:70:34:70:40 | \\k | RegExpBackRef | +| regexp.cpp:70:34:70:41 | \\k+ | RegExpPlus | +| regexp.cpp:73:21:73:28 | \\p{Word} | RegExpNamedCharacterProperty | +| regexp.cpp:73:21:73:29 | \\p{Word}* | RegExpStar | +| regexp.cpp:74:21:74:29 | \\P{Digit} | RegExpNamedCharacterProperty | +| regexp.cpp:74:21:74:30 | \\P{Digit}+ | RegExpPlus | +| regexp.cpp:75:21:75:30 | \\p{^Alnum} | RegExpNamedCharacterProperty | +| regexp.cpp:75:21:75:35 | \\p{^Alnum}{2,3} | RegExpRange | +| regexp.cpp:76:21:76:34 | [a-f\\p{Digit}] | RegExpCharacterClass | +| regexp.cpp:76:21:76:35 | [a-f\\p{Digit}]+ | RegExpPlus | +| regexp.cpp:76:22:76:22 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:76:22:76:24 | a-f | RegExpCharacterRange | +| regexp.cpp:76:24:76:24 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:76:25:76:33 | \\p{Digit} | RegExpNamedCharacterProperty | +| regexp.cpp:79:22:79:32 | [[:alpha:]] | RegExpCharacterClass | +| regexp.cpp:79:22:79:43 | [[:alpha:]][[:digit:]] | RegExpSequence | +| regexp.cpp:79:23:79:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:79:33:79:43 | [[:digit:]] | RegExpCharacterClass | +| regexp.cpp:79:34:79:42 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:82:22:82:41 | [[:alpha:][:digit:]] | RegExpCharacterClass | +| regexp.cpp:82:23:82:31 | [:alpha:] | RegExpNamedCharacterProperty | +| regexp.cpp:82:32:82:40 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:85:22:85:38 | [A-F[:digit:]a-f] | RegExpCharacterClass | +| regexp.cpp:85:23:85:23 | A | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:23:85:25 | A-F | RegExpCharacterRange | +| regexp.cpp:85:25:85:25 | F | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:26:85:34 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:85:35:85:35 | a | RegExpConstant,RegExpNormalChar | +| regexp.cpp:85:35:85:37 | a-f | RegExpCharacterRange | +| regexp.cpp:85:37:85:37 | f | RegExpConstant,RegExpNormalChar | +| regexp.cpp:88:22:88:30 | [:digit:] | RegExpNamedCharacterProperty | +| regexp.cpp:91:19:91:24 | \\u{987 | RegExpConstant,RegExpEscape | regExpNormalCharValue -| regexp.rb:5:2:5:4 | abc | abc | -| regexp.rb:8:2:8:2 | a | a | -| regexp.rb:8:4:8:4 | b | b | -| regexp.rb:8:6:8:6 | c | c | -| regexp.rb:8:8:8:8 | d | d | -| regexp.rb:9:2:9:2 | a | a | -| regexp.rb:10:2:10:2 | a | a | -| regexp.rb:11:2:11:2 | a | a | -| regexp.rb:12:2:12:2 | a | a | -| regexp.rb:15:2:15:4 | foo | foo | -| regexp.rb:15:6:15:8 | bar | bar | -| regexp.rb:18:3:18:3 | a | a | -| regexp.rb:18:4:18:4 | b | b | -| regexp.rb:18:5:18:5 | c | c | -| regexp.rb:19:3:19:3 | a | a | -| regexp.rb:19:5:19:5 | f | f | -| regexp.rb:19:6:19:6 | A | A | -| regexp.rb:19:8:19:8 | F | F | -| regexp.rb:19:9:19:9 | 0 | 0 | -| regexp.rb:19:11:19:11 | 9 | 9 | -| regexp.rb:19:12:19:12 | _ | _ | -| regexp.rb:20:5:20:5 | + | + | -| regexp.rb:20:6:20:6 | - | - | -| regexp.rb:20:9:20:10 | \\d | d | -| regexp.rb:21:3:21:4 | \\w | w | -| regexp.rb:22:2:22:3 | \\[ | [ | -| regexp.rb:22:4:22:5 | \\] | ] | -| regexp.rb:22:7:22:7 | 1 | 1 | -| regexp.rb:22:8:22:8 | 2 | 2 | -| regexp.rb:22:9:22:9 | 3 | 3 | -| regexp.rb:23:4:23:4 | A | A | -| regexp.rb:23:6:23:6 | Z | Z | -| regexp.rb:24:3:24:3 | ] | ] | -| regexp.rb:25:4:25:4 | ] | ] | -| regexp.rb:26:4:26:4 | - | - | -| regexp.rb:27:3:27:3 | \| | \| | -| regexp.rb:30:3:30:3 | [ | [ | -| regexp.rb:30:4:30:4 | a | a | -| regexp.rb:30:6:30:6 | f | f | -| regexp.rb:30:8:30:11 | A-F] | A-F] | -| regexp.rb:35:2:35:3 | \\w | w | -| regexp.rb:35:5:35:6 | \\W | W | -| regexp.rb:36:2:36:3 | \\s | s | -| regexp.rb:36:4:36:5 | \\S | S | -| regexp.rb:37:2:37:3 | \\d | d | -| regexp.rb:37:4:37:5 | \\D | D | -| regexp.rb:38:2:38:3 | \\h | h | -| regexp.rb:38:4:38:5 | \\H | H | -| regexp.rb:39:2:39:3 | \\n | \n | -| regexp.rb:39:4:39:5 | \\r | \r | -| regexp.rb:39:6:39:7 | \\t | \t | -| regexp.rb:42:4:42:6 | abc | abc | -| regexp.rb:43:4:43:5 | !a | !a | -| regexp.rb:46:3:46:5 | foo | foo | -| regexp.rb:46:8:46:10 | bar | bar | -| regexp.rb:47:2:47:3 | fo | fo | -| regexp.rb:47:5:47:5 | o | o | -| regexp.rb:47:7:47:7 | b | b | -| regexp.rb:47:9:47:10 | ar | ar | -| regexp.rb:48:3:48:3 | a | a | -| regexp.rb:48:5:48:5 | b | b | -| regexp.rb:48:7:48:8 | cd | cd | -| regexp.rb:48:10:48:10 | e | e | -| regexp.rb:49:5:49:5 | : | : | -| regexp.rb:49:8:49:9 | \\w | w | -| regexp.rb:52:8:52:9 | \\w | w | -| regexp.rb:53:9:53:9 | f | f | -| regexp.rb:53:10:53:10 | o | o | -| regexp.rb:56:3:56:3 | a | a | -| regexp.rb:56:6:56:6 | b | b | -| regexp.rb:57:9:57:9 | q | q | -| regexp.rb:57:12:57:13 | \\s | s | -| regexp.rb:63:3:63:3 | a | a | -| regexp.rb:63:5:63:5 | f | f | -| regexp.rb:72:3:72:3 | A | A | -| regexp.rb:72:5:72:5 | F | F | -| regexp.rb:72:15:72:15 | a | a | -| regexp.rb:72:17:72:17 | f | f | -| regexp.rb:79:2:79:4 | abc | abc | -| regexp.rb:82:2:82:7 | \\u{987 | \u0987 | +| regexp.cpp:18:19:18:21 | abc | abc | +| regexp.cpp:21:20:21:20 | a | a | +| regexp.cpp:21:22:21:22 | b | b | +| regexp.cpp:21:24:21:24 | c | c | +| regexp.cpp:21:26:21:26 | d | d | +| regexp.cpp:22:20:22:20 | a | a | +| regexp.cpp:23:20:23:20 | a | a | +| regexp.cpp:24:20:24:20 | a | a | +| regexp.cpp:25:20:25:20 | a | a | +| regexp.cpp:28:19:28:21 | foo | foo | +| regexp.cpp:28:23:28:25 | bar | bar | +| regexp.cpp:31:20:31:20 | a | a | +| regexp.cpp:31:21:31:21 | b | b | +| regexp.cpp:31:22:31:22 | c | c | +| regexp.cpp:32:20:32:20 | a | a | +| regexp.cpp:32:22:32:22 | f | f | +| regexp.cpp:32:23:32:23 | A | A | +| regexp.cpp:32:25:32:25 | F | F | +| regexp.cpp:32:26:32:26 | 0 | 0 | +| regexp.cpp:32:28:32:28 | 9 | 9 | +| regexp.cpp:32:29:32:29 | _ | _ | +| regexp.cpp:33:22:33:22 | + | + | +| regexp.cpp:33:23:33:23 | - | - | +| regexp.cpp:33:26:33:27 | \\d | d | +| regexp.cpp:34:20:34:21 | \\w | w | +| regexp.cpp:35:19:35:20 | \\[ | [ | +| regexp.cpp:35:21:35:22 | \\] | ] | +| regexp.cpp:35:24:35:24 | 1 | 1 | +| regexp.cpp:35:25:35:25 | 2 | 2 | +| regexp.cpp:35:26:35:26 | 3 | 3 | +| regexp.cpp:36:21:36:21 | A | A | +| regexp.cpp:36:23:36:23 | Z | Z | +| regexp.cpp:37:20:37:20 | ] | ] | +| regexp.cpp:38:21:38:21 | ] | ] | +| regexp.cpp:39:21:39:21 | - | - | +| regexp.cpp:40:21:40:21 | \| | \| | +| regexp.cpp:43:23:43:23 | [ | [ | +| regexp.cpp:43:24:43:24 | a | a | +| regexp.cpp:43:26:43:26 | f | f | +| regexp.cpp:43:28:43:31 | A-F] | A-F] | +| regexp.cpp:48:21:48:22 | \\w | w | +| regexp.cpp:48:24:48:25 | \\W | W | +| regexp.cpp:49:21:49:22 | \\s | s | +| regexp.cpp:49:23:49:24 | \\S | S | +| regexp.cpp:50:21:50:22 | \\d | d | +| regexp.cpp:50:23:50:24 | \\D | D | +| regexp.cpp:51:21:51:22 | \\h | h | +| regexp.cpp:51:23:51:24 | \\H | H | +| regexp.cpp:52:21:52:22 | \\n | \n | +| regexp.cpp:52:23:52:24 | \\r | \r | +| regexp.cpp:52:25:52:26 | \\t | \t | +| regexp.cpp:55:22:55:24 | abc | abc | +| regexp.cpp:56:22:56:23 | !a | !a | +| regexp.cpp:59:21:59:23 | foo | foo | +| regexp.cpp:59:26:59:28 | bar | bar | +| regexp.cpp:60:20:60:21 | fo | fo | +| regexp.cpp:60:23:60:23 | o | o | +| regexp.cpp:60:25:60:25 | b | b | +| regexp.cpp:60:27:60:28 | ar | ar | +| regexp.cpp:61:21:61:21 | a | a | +| regexp.cpp:61:23:61:23 | b | b | +| regexp.cpp:61:25:61:26 | cd | cd | +| regexp.cpp:61:28:61:28 | e | e | +| regexp.cpp:62:23:62:23 | : | : | +| regexp.cpp:62:26:62:27 | \\w | w | +| regexp.cpp:65:25:65:26 | \\w | w | +| regexp.cpp:66:26:66:26 | f | f | +| regexp.cpp:66:27:66:27 | o | o | +| regexp.cpp:69:22:69:22 | a | a | +| regexp.cpp:69:25:69:25 | b | b | +| regexp.cpp:70:28:70:28 | q | q | +| regexp.cpp:70:31:70:32 | \\s | s | +| regexp.cpp:76:22:76:22 | a | a | +| regexp.cpp:76:24:76:24 | f | f | +| regexp.cpp:85:23:85:23 | A | A | +| regexp.cpp:85:25:85:25 | F | F | +| regexp.cpp:85:35:85:35 | a | a | +| regexp.cpp:85:37:85:37 | f | f | +| regexp.cpp:91:19:91:24 | \\u{987 | \u0987 | diff --git a/cpp/ql/test/library-tests/regex/regexp.ql b/cpp/ql/test/library-tests/regex/regexp.ql index e167cb1a7bb..a29717199e2 100644 --- a/cpp/ql/test/library-tests/regex/regexp.ql +++ b/cpp/ql/test/library-tests/regex/regexp.ql @@ -1,5 +1,11 @@ +import semmle.code.cpp.regex.internal.ParseRegExp import semmle.code.cpp.regex.RegexTreeView +// Stop gap for missing flow configs +class RegExpTest extends RegExp { + RegExpTest() { any() } +} + query predicate groupName(RegExpGroup g, string name) { name = g.getName() } query predicate groupNumber(RegExpGroup g, int number) { number = g.getNumber() }