-
Notifications
You must be signed in to change notification settings - Fork 46
/
grammar.js
104 lines (82 loc) · 2 KB
/
grammar.js
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
module.exports = grammar({
name: 'json',
extras: $ => [
/\s/
],
supertypes: $ => [
$._value
],
rules: {
document: $ => $._value,
_value: $ => choice(
$.object,
$.array,
$.number,
$.string,
$.true,
$.false,
$.null
),
object: $ => seq(
"{", commaSep($.pair), "}"
),
pair: $ => seq(
field("key", choice($.string, $.number)),
":",
field("value", $._value)
),
array: $ => seq(
"[", commaSep($._value), "]"
),
string: $ => choice(
seq('"', '"'),
seq('"', $.string_content, '"')
),
string_content: $ => repeat1(choice(
token.immediate(/[^\\"\n]+/),
$.escape_sequence
)),
escape_sequence: $ => token.immediate(seq(
'\\',
/(\"|\\|\/|b|n|r|t|u)/
)),
number: $ => {
const hex_literal = seq(
choice('0x', '0X'),
/[\da-fA-F]+/
)
const decimal_digits = /\d+/
const signed_integer = seq(optional(choice('-','+')), decimal_digits)
const exponent_part = seq(choice('e', 'E'), signed_integer)
const binary_literal = seq(choice('0b', '0B'), /[0-1]+/)
const octal_literal = seq(choice('0o', '0O'), /[0-7]+/)
const decimal_integer_literal = seq(
optional(choice('-','+')),
choice(
'0',
seq(/[1-9]/, optional(decimal_digits))
)
)
const decimal_literal = choice(
seq(decimal_integer_literal, '.', optional(decimal_digits), optional(exponent_part)),
seq('.', decimal_digits, optional(exponent_part)),
seq(decimal_integer_literal, optional(exponent_part))
)
return token(choice(
hex_literal,
decimal_literal,
binary_literal,
octal_literal
))
},
true: $ => "true",
false: $ => "false",
null: $ => "null"
}
});
function commaSep1 (rule) {
return seq(rule, repeat(seq(",", rule)))
}
function commaSep (rule) {
return optional(commaSep1(rule))
}