-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathtoml.peg
100 lines (80 loc) · 3.17 KB
/
toml.peg
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
{
var nodes = [];
function node(line, column, type, value, key) {
var node = { type: type, value: value, line: line, column: column };
if (key) node.key = key;
nodes.push(node);
return node;
};
}
start
= line* { return nodes }
line
= S* expr:expression S* comment* (NL+ / EOF)
/ S+ (NL+ / EOF)
expression
= comment / subpath / assignment
comment
= '#' (!(NL / EOF) .)*
subpath
= '[' name:key ']' { return node(line, column, 'Group', name) }
assignment
= key:key S* '=' S* value:value { return node(line, column, 'Set', value, key) }
key
= chars:(!(S / NL / '[' / ']' / '=') char:. { return char })+ { return chars.join('') }
value
= string / datetime / float / integer / boolean / array
string
= '"' chars:string_char* '"' { return node(line, column, 'String', chars.join('')) }
string_char
= ESCAPED / (!'"' !'\\' char:. { return char })
float
= digits:(DIGITS '.' DIGITS) { return node(line, column, 'Float', parseFloat(digits.join(''))) }
/ '-' digits:(DIGITS '.' DIGITS) { return node(line, column, 'Float', -1 * parseFloat(digits.join(''))) }
integer
= digits:DIGIT+ !'.' { return node(line, column, 'Integer', parseInt(digits.join(''), 10)) }
/ '-' digits:DIGIT+ !'.' { return node(line, column, 'Integer', -1 * parseInt(digits.join(''), 10)) }
boolean
= 'true' { return node(line, column, 'Boolean', true) }
/ 'false' { return node(line, column, 'Boolean', false) }
array
= '[' value:array_value? ']' { return node(line, column, 'Array', value ? [value] : []) }
/ '[' values:array_value_list+ ']' { return node(line, column, 'Array', values) }
/ '[' values:array_value_list+ value:array_value ']' { return node(line, column, 'Array', values.concat(value)) }
array_value
= array_sep* value:value array_sep* { return value }
array_value_list
= array_sep* value:value array_sep* ',' array_sep* { return value }
array_sep
= S / NL / comment
datetime
= date:(
DIGIT DIGIT DIGIT DIGIT
'-'
DIGIT DIGIT
'-'
DIGIT DIGIT
'T'
DIGIT DIGIT
':'
DIGIT DIGIT
':'
DIGIT DIGIT
'Z'
) { return node(line, column, 'Datetime', new Date(date.join(''))) }
S = [ \t]
NL = "\n" / "\r" "\n"
EOF = !.
HEX = [0-9a-f]i
DIGIT = [0-9]
DIGITS = d:[0-9]+ { return d.join('') }
ESCAPED = '\\"' { return '"' }
/ '\\\\' { return '\\' }
/ '\\/' { return '/' }
/ '\\b' { return '\b' }
/ '\\t' { return '\t' }
/ '\\n' { return '\n' }
/ '\\f' { return '\f' }
/ '\\r' { return '\r' }
/ ESCAPED_UNICODE
ESCAPED_UNICODE = "\\u" digits:(HEX HEX HEX HEX) { return String.fromCharCode(parseInt("0x" + digits.join(''))) }