1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
String literals may be enclosed in single or double quotes.
Embedded escape sequences are started with a backslash, followed
by either a hexadecimal, an octal or a single character escape sequence.
-- Expect stdout --
Single quoted string
Double quoted string
Unicode escape sequence: ☀💩
Escaped double quote (") character
Escaped single quote (') character
Hexadecimal escape: XYZ xyz
Octal escape: ABC xyz
{ "Single char escape": "\u0007\b\u001b\f\r\t\u000b\\\n" }
-- End --
-- Testcase --
{{ 'Single quoted string' }}
{{ "Double quoted string" }}
{{ "Unicode escape sequence: \u2600\uD83D\uDCA9" }}
{{ "Escaped double quote (\") character" }}
{{ 'Escaped single quote (\') character' }}
{{ "Hexadecimal escape: \x58\x59\x5A \x78\x79\x7a" }}
{{ "Octal escape: \101\102\103 \170\171\172" }}
{{ { "Single char escape": "\a\b\e\f\r\t\v\\\n" } }}
-- End --
Testing various parsing corner cases.
-- Expect stdout --
[ "\t", "\n", "y", "\u0001", "\n", "\u0001\u0002", "\u0001\u0002", "\u0001\u0002", "\u0001a", "\na" ]
-- End --
-- Testcase --
{%
print([
"\ ", // properly handle escaped tab
"\
", // properly handle escaped newline
"\y", // substitute unrecognized escape with escaped char
"\1", // handle short octal sequence at end of string
"\12", // handle short octal sequence at end of string
"\1\2", // handle subsequent short octal sequences
"\001\2", // handle short sequence after long one
"\1\002", // handle long sequence after short one
"\1a", // handle short octal sequence terminated by non-octal char
"\12a" // handle short octal sequence terminated by non-octal char
], "\n");
%}
-- End --
|