1
1
# http://www.json.org/
2
2
# http://www.asciitable.com/
3
+ @{%
4
+ // const moo = typeof module === 'object' && module.exports ? require('moo') : moo
5
+ const moo = require (' ../moo' )
6
+
7
+ let lexer = moo .compile ({
8
+ SPACE : {match: / \s + / , lineBreaks: true },
9
+ NUMBER : / -? (?:[0-9 ] | [1-9 ][0-9 ] + )(?:\. [0-9 ] + )? (?:[eE][-+] ? [0-9 ] + )? \b / ,
10
+ STRING : / "(?:\\ ["bfnrt\/\\ ] | \\ u[a-fA-F0-9 ] {4} | [^ "\\ ] )* "/ ,
11
+ ' {' : ' {' ,
12
+ ' }' : ' }' ,
13
+ ' [' : ' [' ,
14
+ ' ]' : ' ]' ,
15
+ ' ,' : ' ,' ,
16
+ ' :' : ' :' ,
17
+ TRUE : / true\b / ,
18
+ FALSE : / false\b / ,
19
+ NULL : / null\b / ,
20
+ })
21
+
22
+ var SPACE = {type: ' SPACE' }
23
+ var STRING = {type: ' STRING' }
24
+ var NUMBER = {type: ' NUMBER' }
25
+ var TRUE = {type: ' TRUE' }
26
+ var FALSE = {type: ' FALSE' }
27
+ var NULL = {type: ' NULL' }
28
+ %}
3
29
4
- json -> [\s ] :* ( object | array ) [\s ] :* {% function (d ) { return d[1 ][0 ]; } %}
30
+ @lexer lexer
31
+
32
+ json -> _ ( object | array ) _ {% function (d ) { return d[1 ][0 ]; } %}
5
33
6
34
object -> "{" _ "}" {% function (d ) { return {}; } %}
7
35
| "{" _ pair ( _ "," _ pair ):* _ "}" {% extractObject %}
@@ -14,39 +42,19 @@ value ->
14
42
| array {% id %}
15
43
| number {% id %}
16
44
| string {% id %}
17
- | "true" {% function (d ) { return true ; } %}
18
- | "false" {% function (d ) { return false ; } %}
19
- | "null" {% function (d ) { return null ; } %}
45
+ | %TRUE {% function (d ) { return true ; } %}
46
+ | %FALSE {% function (d ) { return false ; } %}
47
+ | %NULL {% function (d ) { return null ; } %}
20
48
21
- number -> "-" :? ( "0" | intPart ) fracPart :? expPart :? {% extractNumber %}
49
+ number -> %NUMBER {% function ( d ) { return parseFloat (d[ 0 ]. value ) } %}
22
50
23
- string -> " \" " validChar :* " \" " {% function (d ) { return d[ 1 ]. join ( " " ) } %}
51
+ string -> %STRING {% function (d ) { return JSON . parse (d[ 0 ]. value ) } %}
24
52
25
53
pair -> key _ ":" _ value {% function (d ) { return [d[0 ], d[4 ]]; } %}
26
54
27
55
key -> string {% id %}
28
56
29
- intPart -> [1-9] [0-9] :* {% function (d ) { return d[0 ] + d[1 ].join (" " ); } %}
30
-
31
- fracPart -> "." [0-9] :* {% function (d ) { return d[0 ] + d[1 ].join (" " ); } %}
32
-
33
- expPart -> [eE] [+-] :? [0-9] :* {% function (d ) { return d[0 ] + (d[1 ] || ' ' ) + d[2 ].join (" " ); } %}
34
-
35
- validChar ->
36
- [^"\\ ] {% function (d ) { return d[0 ]; } %}
37
- | "\\\" " {% function (d ) { return " \" " ; } %}
38
- | "\\\\ " {% function (d ) { return " \\ " ; } %}
39
- | "\\ /" {% function (d ) { return " /" ; } %}
40
- | "\\ n" {% function (d ) { return " \n " ; } %}
41
- | "\\ b" {% function (d ) { return " \b " ; } %}
42
- | "\\ f" {% function (d ) { return " \f " ; } %}
43
- | "\\ r" {% function (d ) { return " \r " ; } %}
44
- | "\\ t" {% function (d ) { return " \t " ; } %}
45
- | "\\ u" hex hex hex hex {% unicodehex %}
46
-
47
- hex -> [0-9a-fA-F] {% function (d ) { return d[0 ]; } %}
48
-
49
- _ -> null | [\s ] :+ {% function (d ) { return null ; } %}
57
+ _ -> null | %SPACE {% function (d ) { return null ; } %}
50
58
51
59
@{%
52
60
@@ -76,20 +84,4 @@ function extractArray(d) {
76
84
return output;
77
85
}
78
86
79
- function unicodehex (d ) {
80
- let codePoint = parseInt (d[1 ]+ d[2 ]+ d[3 ]+ d[4 ], 16 );
81
-
82
- // Handle '\\'
83
- if (codePoint == 92 ) {
84
- return " \\ " ;
85
- }
86
-
87
- return String .fromCodePoint (codePoint);
88
- }
89
-
90
- function extractNumber (d ) {
91
- let value = (d[0 ] || ' ' ) + d[1 ] + (d[2 ] || ' ' ) + (d[3 ] || ' ' );
92
- return parseFloat (value);
93
- }
94
-
95
87
%}
0 commit comments