@@ -37,33 +37,56 @@ describe("parser", function() {
37
37
} ) ;
38
38
39
39
it ( "quoted symbols can contain escapes" , function ( ) {
40
- assert . deepStrictEqual ( parser ( `"\\"" -> .` ) , { productions : [ [ `\\"` ] ] } ) ;
41
- assert . deepStrictEqual ( parser ( `"\\'" -> .` ) , { productions : [ [ `\\'` ] ] } ) ;
42
- assert . deepStrictEqual ( parser ( `'\\'' -> .` ) , { productions : [ [ `\\'` ] ] } ) ;
43
- assert . deepStrictEqual ( parser ( `'\\"' -> .` ) , { productions : [ [ `\\"` ] ] } ) ;
44
- assert . deepStrictEqual ( parser ( `"\\\\" -> .` ) , { productions : [ [ `\\\\` ] ] } ) ;
45
-
46
- assert . deepStrictEqual ( parser ( `"\\b" -> .` ) , { productions : [ [ `\\b` ] ] } ) ;
47
- assert . deepStrictEqual ( parser ( `"\\f" -> .` ) , { productions : [ [ `\\f` ] ] } ) ;
48
- assert . deepStrictEqual ( parser ( `"\\n" -> .` ) , { productions : [ [ `\\n` ] ] } ) ;
49
- assert . deepStrictEqual ( parser ( `"\\r" -> .` ) , { productions : [ [ `\\r` ] ] } ) ;
50
- assert . deepStrictEqual ( parser ( `"\\t" -> .` ) , { productions : [ [ `\\t` ] ] } ) ;
51
- assert . deepStrictEqual ( parser ( `"\\v" -> .` ) , { productions : [ [ `\\v` ] ] } ) ;
52
- assert . deepStrictEqual ( parser ( `"\\0" -> .` ) , { productions : [ [ `\\0` ] ] } ) ;
53
-
54
- assert . deepStrictEqual ( parser ( `"\\\n" -> .` ) , { productions : [ [ `\\\n` ] ] } ) ;
40
+ // QUOTATION MARK and APOSTROPHE
41
+ assert . deepStrictEqual ( parser ( `"\\"" -> .` ) , { productions : [ [ `"` ] ] } ) ;
42
+ assert . deepStrictEqual ( parser ( `"\\'" -> .` ) , { productions : [ [ `'` ] ] } ) ;
43
+ assert . deepStrictEqual ( parser ( `'\\'' -> .` ) , { productions : [ [ `'` ] ] } ) ;
44
+ assert . deepStrictEqual ( parser ( `'\\"' -> .` ) , { productions : [ [ `"` ] ] } ) ;
45
+ assert . deepStrictEqual ( parser ( `"\\\\" -> .` ) , { productions : [ [ `\\` ] ] } ) ;
46
+
47
+ // C-style escapes
48
+ assert . deepStrictEqual ( parser ( `"\\b" -> .` ) , { productions : [ [ `\b` ] ] } ) ;
49
+ assert . deepStrictEqual ( parser ( `"\\f" -> .` ) , { productions : [ [ `\f` ] ] } ) ;
50
+ assert . deepStrictEqual ( parser ( `"\\n" -> .` ) , { productions : [ [ `\n` ] ] } ) ;
51
+ assert . deepStrictEqual ( parser ( `"\\r" -> .` ) , { productions : [ [ `\r` ] ] } ) ;
52
+ assert . deepStrictEqual ( parser ( `"\\t" -> .` ) , { productions : [ [ `\t` ] ] } ) ;
53
+ assert . deepStrictEqual ( parser ( `"\\v" -> .` ) , { productions : [ [ `\v` ] ] } ) ;
54
+ assert . deepStrictEqual ( parser ( `"\\0" -> .` ) , { productions : [ [ `\0` ] ] } ) ;
55
+
56
+ // Identity escapes
57
+ assert . deepStrictEqual ( parser ( `"\\z" -> .` ) , { productions : [ [ `z` ] ] } ) ;
58
+
59
+ // Escaped line terminator
60
+ assert . deepStrictEqual ( parser ( `"\\\n" -> .` ) , { productions : [ [ `\n` ] ] } ) ;
61
+ assert . deepStrictEqual ( parser ( `"\\\r" -> .` ) , { productions : [ [ `\r` ] ] } ) ;
55
62
56
63
// COPYRIGHT SIGN
57
- assert . deepStrictEqual ( parser ( `"\\xA9" -> .` ) , { productions : [ [ `\\xA9` ] ] } ) ;
58
- assert . deepStrictEqual ( parser ( `"\\xa9" -> .` ) , { productions : [ [ `\\xa9` ] ] } ) ;
59
- assert . deepStrictEqual ( parser ( `"\\u00A9" -> .` ) , { productions : [ [ `\\u00A9` ] ] } ) ;
60
- assert . deepStrictEqual ( parser ( `"\\u00a9" -> .` ) , { productions : [ [ `\\u00a9` ] ] } ) ;
64
+ assert . deepStrictEqual ( parser ( `"\\xA9" -> .` ) , { productions : [ [ `\xA9` ] ] } ) ;
65
+ assert . deepStrictEqual ( parser ( `"\\xa9" -> .` ) , { productions : [ [ `\xa9` ] ] } ) ;
66
+ assert . deepStrictEqual ( parser ( `"\\u00A9" -> .` ) , { productions : [ [ `\u00A9` ] ] } ) ;
67
+ assert . deepStrictEqual ( parser ( `"\\u00a9" -> .` ) , { productions : [ [ `\u00a9` ] ] } ) ;
68
+ assert . deepStrictEqual ( parser ( `"\\u00a9" -> .` ) , { productions : [ [ `\u{00A9}` ] ] } ) ;
69
+ assert . deepStrictEqual ( parser ( `"\\u00a9" -> .` ) , { productions : [ [ `\u{00a9}` ] ] } ) ;
61
70
62
71
// BLACK HEART SUIT
63
- assert . deepStrictEqual ( parser ( `"\\u2665" -> .` ) , { productions : [ [ "\\u2665" ] ] } ) ;
72
+ assert . deepStrictEqual ( parser ( `"\\u2665" -> .` ) , { productions : [ [ `\u2665` ] ] } ) ;
73
+ assert . deepStrictEqual ( parser ( `"\\u{2665}" -> .` ) , { productions : [ [ `\u{2665}` ] ] } ) ;
64
74
65
75
// TETRAGRAM FOR CENTRE
66
- assert . deepStrictEqual ( parser ( `"\\u{1D306}" -> .` ) , { productions : [ [ "\\u{1D306}" ] ] } ) ;
76
+ assert . deepStrictEqual ( parser ( `"\\u{1D306}" -> .` ) , { productions : [ [ `\u{1D306}` ] ] } ) ;
77
+
78
+ // AMPERSAND (\x and two hex digits)
79
+ assert . deepStrictEqual ( parser ( `"\\x2665" -> .` ) , { productions : [ [ `\x2665` ] ] } ) ;
80
+
81
+ // MODIFIER LETTER CAPITAL D (\u without braces)
82
+ assert . deepStrictEqual ( parser ( `"\\u1D306" -> .` ) , { productions : [ [ `\u1D306` ] ] } ) ;
83
+ } ) ;
84
+
85
+ it ( "quoted symbols can contain multiple escapes" , function ( ) {
86
+ assert . deepStrictEqual (
87
+ parser ( `"\\" \\0 \\xA9 \\u00A9 \\u{2665}" -> .` ) ,
88
+ { productions : [ [ `" \0 \xA9 \u00A9 \u{2665}` ] ] }
89
+ ) ;
67
90
} ) ;
68
91
69
92
it ( "nonterminals don't need to be capitalized" , function ( ) {
0 commit comments