s1 s3 epsilon-transition
s2 s3 ;
-GENERIC: modify-epsilon ( tag -- newtag )
-! Potential off-by-one errors when lookaround nested in lookbehind
-
-M: object modify-epsilon ;
-
-: line-option ( multiline unix-lines default -- option )
- multiline option? [
- drop [ unix-lines option? ] 2dip swap ?
- ] [ 2nip ] if ;
+DEFER: modify-class
-M: $crlf modify-epsilon
- $unix end-of-input line-option ;
-
-M: ^crlf modify-epsilon
- ^unix beginning-of-input line-option ;
+! Potential off-by-one errors when lookaround nested in lookbehind
M: tagged-epsilon nfa-node
- clone [ modify-epsilon ] change-tag add-simple-entry ;
+ clone [ modify-class ] change-tag add-simple-entry ;
M: concatenation nfa-node
[ first>> ] [ second>> ] bi
M: object modify-class ;
+M: concatenation modify-class
+ [ first>> ] [ second>> ] bi [ modify-class ] bi@
+ concatenation boa ;
+
+M: alternation modify-class
+ [ first>> ] [ second>> ] bi [ modify-class ] bi@
+ alternation boa ;
+
+M: lookahead modify-class
+ term>> modify-class lookahead boa ;
+
+M: lookbehind modify-class
+ term>> modify-class lookbehind boa ;
+
+: line-option ( multiline unix-lines default -- option )
+ multiline option? [
+ drop [ unix-lines option? ] 2dip swap ?
+ ] [ 2nip ] if ;
+
+M: $crlf modify-class
+ $unix end-of-input line-option ;
+
+M: ^crlf modify-class
+ ^unix beginning-of-input line-option ;
+
M: integer modify-class
case-insensitive option? [
dup Letter? [
] when
] when ;
-M: integer nfa-node
- modify-class add-simple-entry ;
-
M: primitive-class modify-class
class>> modify-class <primitive-class> ;
{ 3 } [ "caba" "(?<=b)a" <regexp> first-match from>> ] unit-test
+{ "<" } [ "<style>" R/ <(?=STYLE\b)/i first-match >string ] unit-test
+{ "bar" } [ "foobar" R/ (?<=FOO)BAR/i first-match >string ] unit-test
+
{ t } [ "\ra" R/ .^a/ms matches? ] unit-test
{ f } [ "\ra" R/ .^a/mds matches? ] unit-test
{ t } [ "\na" R/ .^a/ms matches? ] unit-test