the last character on a multiline string cannot be a backslash
parent
de5731fa91
commit
e3ff59c303
|
@ -1,4 +1,5 @@
|
||||||
USING: strings.parser tools.test ;
|
USING: accessors eval strings.parser strings.parser.private
|
||||||
|
tools.test ;
|
||||||
IN: strings.parser.tests
|
IN: strings.parser.tests
|
||||||
|
|
||||||
[ "Hello\n\rworld" ] [ "Hello\\n\\rworld" unescape-string ] unit-test
|
[ "Hello\n\rworld" ] [ "Hello\\n\\rworld" unescape-string ] unit-test
|
||||||
|
@ -12,3 +13,9 @@ IN: strings.parser.tests
|
||||||
[ "Hello\n\rworld\n" "hi" ] [ """Hello\n\rworld
|
[ "Hello\n\rworld\n" "hi" ] [ """Hello\n\rworld
|
||||||
""" """hi""" ] unit-test
|
""" """hi""" ] unit-test
|
||||||
[ "Hello\n\rworld\"" "hi" ] [ """Hello\n\rworld\"""" """hi""" ] unit-test
|
[ "Hello\n\rworld\"" "hi" ] [ """Hello\n\rworld\"""" """hi""" ] unit-test
|
||||||
|
|
||||||
|
[
|
||||||
|
"\"\"\"Hello\n\rworld\\\n\"\"\"" eval( -- obj )
|
||||||
|
] [
|
||||||
|
error>> escaped-char-expected?
|
||||||
|
] must-fail-with
|
||||||
|
|
|
@ -91,11 +91,26 @@ name>char-hook [
|
||||||
: rest-of-line ( -- seq )
|
: rest-of-line ( -- seq )
|
||||||
lexer get [ line-text>> ] [ column>> ] bi tail-slice ;
|
lexer get [ line-text>> ] [ column>> ] bi tail-slice ;
|
||||||
|
|
||||||
|
: current-char ( lexer -- ch )
|
||||||
|
[ column>> ] [ line-text>> ] bi nth ;
|
||||||
|
|
||||||
|
: advance-char ( lexer -- )
|
||||||
|
[ 1 + ] change-column drop ;
|
||||||
|
|
||||||
|
ERROR: escaped-char-expected ;
|
||||||
|
|
||||||
|
: next-char ( lexer -- ch )
|
||||||
|
dup still-parsing-line? [
|
||||||
|
[ current-char ] [ advance-char ] bi
|
||||||
|
] [
|
||||||
|
escaped-char-expected
|
||||||
|
] if ;
|
||||||
|
|
||||||
: parse-escape ( i -- )
|
: parse-escape ( i -- )
|
||||||
lexer-advance % CHAR: \ ,
|
lexer-advance % CHAR: \ ,
|
||||||
lexer get
|
lexer get
|
||||||
[ [ 2 + ] change-column drop ]
|
[ advance-char ]
|
||||||
[ [ column>> 1 - ] [ line-text>> ] bi nth , ] bi ;
|
[ next-char , ] bi ;
|
||||||
|
|
||||||
: next-string-line ( obj -- )
|
: next-string-line ( obj -- )
|
||||||
drop rest-of-line %
|
drop rest-of-line %
|
||||||
|
@ -135,15 +150,18 @@ DEFER: (parse-long-string)
|
||||||
unexpected-eof
|
unexpected-eof
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
PRIVATE>
|
|
||||||
|
|
||||||
: parse-long-string ( string -- string' )
|
: parse-long-string ( string -- string' )
|
||||||
[ (parse-long-string) ] "" make unescape-string ;
|
[ (parse-long-string) ] "" make ;
|
||||||
|
|
||||||
|
: parse-long-string-escaped ( string -- string' )
|
||||||
|
parse-long-string unescape-string ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
: parse-multiline-string ( -- string )
|
: parse-multiline-string ( -- string )
|
||||||
rest-of-line "\"\"" head? [
|
rest-of-line "\"\"" head? [
|
||||||
lexer get [ 2 + ] change-column drop
|
lexer get [ 2 + ] change-column drop
|
||||||
"\"\"\"" parse-long-string
|
"\"\"\"" parse-long-string-escaped
|
||||||
] [
|
] [
|
||||||
"\"" parse-long-string
|
"\"" parse-long-string-escaped
|
||||||
] if ;
|
] if ;
|
||||||
|
|
Loading…
Reference in New Issue