diff --git a/core/modern/lexer/lexer.factor b/core/modern/lexer/lexer.factor index 39151fd4d6..803ef6d06f 100644 --- a/core/modern/lexer/lexer.factor +++ b/core/modern/lexer/lexer.factor @@ -116,10 +116,17 @@ ERROR: unexpected-end n string ; n' >>n drop n' string' slice ch ; +! rollback only n, other state is not rolled back +:: with-lexer-rollback ( lexer quot -- ) + lexer n>> :> n + lexer quot call lexer n >>n drop ; inline + : merge-lex-til-whitespace ( lexer slice -- slice' ) [ lex-til-whitespace drop 2nip ] dip merge-slices ; +: peek-merge-til-whitespace ( lexer slice -- slice' ) + '[ _ merge-lex-til-whitespace ] with-lexer-rollback ; :: slice-til-eol ( n string -- n'/f string slice/f ch/f ) n [ diff --git a/core/modern/modern.factor b/core/modern/modern.factor index 04c0e4864c..7eca27c0c1 100644 --- a/core/modern/modern.factor +++ b/core/modern/modern.factor @@ -452,7 +452,8 @@ ERROR: mismatched-terminator lexer slice ; ] if ; : gt-terminator ( lexer slice -- slice/f ) - dup top-level-greater-than? [ + 2dup peek-merge-til-whitespace + top-level-greater-than? [ 2dup [ dup peek-tag ] dip delimiters-match? [ nip terminator-literal make-tag-class-literal ] [ diff --git a/core/modern/out/out-tests.factor b/core/modern/out/out-tests.factor index c70dfd550d..a784cc51d0 100644 --- a/core/modern/out/out-tests.factor +++ b/core/modern/out/out-tests.factor @@ -80,4 +80,6 @@ in: modern.out.tests { t } [ "!a" rewrite-same-string ] unit-test { t } [ "->[ ]" rewrite-same-string ] unit-test -{ t } [ "abc>[ ]" rewrite-same-string ] unit-test \ No newline at end of file +{ t } [ "abc>[ ]" rewrite-same-string ] unit-test +{ t } [ "CC>n" rewrite-same-string ] unit-test +{ t } [ "CC>CC" rewrite-same-string ] unit-test