the last character on a multiline string cannot be a backslash

db4
Doug Coleman 2009-09-20 14:18:19 -05:00
parent de5731fa91
commit e3ff59c303
2 changed files with 33 additions and 8 deletions

View File

@ -1,4 +1,5 @@
USING: strings.parser tools.test ;
USING: accessors eval strings.parser strings.parser.private
tools.test ;
IN: strings.parser.tests
[ "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
""" """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

View File

@ -91,11 +91,26 @@ name>char-hook [
: rest-of-line ( -- seq )
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 -- )
lexer-advance % CHAR: \ ,
lexer get
[ [ 2 + ] change-column drop ]
[ [ column>> 1 - ] [ line-text>> ] bi nth , ] bi ;
[ advance-char ]
[ next-char , ] bi ;
: next-string-line ( obj -- )
drop rest-of-line %
@ -135,15 +150,18 @@ DEFER: (parse-long-string)
unexpected-eof
] if ;
PRIVATE>
: 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 )
rest-of-line "\"\"" head? [
lexer get [ 2 + ] change-column drop
"\"\"\"" parse-long-string
"\"\"\"" parse-long-string-escaped
] [
"\"" parse-long-string
"\"" parse-long-string-escaped
] if ;