aboutsummaryrefslogtreecommitdiff
path: root/node_modules/toml/src
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/toml/src')
-rw-r--r--node_modules/toml/src/toml.pegjs231
1 files changed, 231 insertions, 0 deletions
diff --git a/node_modules/toml/src/toml.pegjs b/node_modules/toml/src/toml.pegjs
new file mode 100644
index 00000000..70517078
--- /dev/null
+++ b/node_modules/toml/src/toml.pegjs
@@ -0,0 +1,231 @@
+{
+ var nodes = [];
+
+ function genError(err, line, col) {
+ var ex = new Error(err);
+ ex.line = line;
+ ex.column = col;
+ throw ex;
+ }
+
+ function addNode(node) {
+ nodes.push(node);
+ }
+
+ function node(type, value, line, column, key) {
+ var obj = { type: type, value: value, line: line(), column: column() };
+ if (key) obj.key = key;
+ return obj;
+ }
+
+ function convertCodePoint(str, line, col) {
+ var num = parseInt("0x" + str);
+
+ if (
+ !isFinite(num) ||
+ Math.floor(num) != num ||
+ num < 0 ||
+ num > 0x10FFFF ||
+ (num > 0xD7FF && num < 0xE000)
+ ) {
+ genError("Invalid Unicode escape code: " + str, line, col);
+ } else {
+ return fromCodePoint(num);
+ }
+ }
+
+ function fromCodePoint() {
+ var MAX_SIZE = 0x4000;
+ var codeUnits = [];
+ var highSurrogate;
+ var lowSurrogate;
+ var index = -1;
+ var length = arguments.length;
+ if (!length) {
+ return '';
+ }
+ var result = '';
+ while (++index < length) {
+ var codePoint = Number(arguments[index]);
+ if (codePoint <= 0xFFFF) { // BMP code point
+ codeUnits.push(codePoint);
+ } else { // Astral code point; split in surrogate halves
+ // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+ codePoint -= 0x10000;
+ highSurrogate = (codePoint >> 10) + 0xD800;
+ lowSurrogate = (codePoint % 0x400) + 0xDC00;
+ codeUnits.push(highSurrogate, lowSurrogate);
+ }
+ if (index + 1 == length || codeUnits.length > MAX_SIZE) {
+ result += String.fromCharCode.apply(null, codeUnits);
+ codeUnits.length = 0;
+ }
+ }
+ return result;
+ }
+}
+
+start
+ = line* { return nodes }
+
+line
+ = S* expr:expression S* comment* (NL+ / EOF)
+ / S+ (NL+ / EOF)
+ / NL
+
+expression
+ = comment / path / tablearray / assignment
+
+comment
+ = '#' (!(NL / EOF) .)*
+
+path
+ = '[' S* name:table_key S* ']' { addNode(node('ObjectPath', name, line, column)) }
+
+tablearray
+ = '[' '[' S* name:table_key S* ']' ']' { addNode(node('ArrayPath', name, line, column)) }
+
+table_key
+ = parts:dot_ended_table_key_part+ name:table_key_part { return parts.concat(name) }
+ / name:table_key_part { return [name] }
+
+table_key_part
+ = S* name:key S* { return name }
+ / S* name:quoted_key S* { return name }
+
+dot_ended_table_key_part
+ = S* name:key S* '.' S* { return name }
+ / S* name:quoted_key S* '.' S* { return name }
+
+assignment
+ = key:key S* '=' S* value:value { addNode(node('Assign', value, line, column, key)) }
+ / key:quoted_key S* '=' S* value:value { addNode(node('Assign', value, line, column, key)) }
+
+key
+ = chars:ASCII_BASIC+ { return chars.join('') }
+
+quoted_key
+ = node:double_quoted_single_line_string { return node.value }
+ / node:single_quoted_single_line_string { return node.value }
+
+value
+ = string / datetime / float / integer / boolean / array / inline_table
+
+string
+ = double_quoted_multiline_string
+ / double_quoted_single_line_string
+ / single_quoted_multiline_string
+ / single_quoted_single_line_string
+
+double_quoted_multiline_string
+ = '"""' NL? chars:multiline_string_char* '"""' { return node('String', chars.join(''), line, column) }
+double_quoted_single_line_string
+ = '"' chars:string_char* '"' { return node('String', chars.join(''), line, column) }
+single_quoted_multiline_string
+ = "'''" NL? chars:multiline_literal_char* "'''" { return node('String', chars.join(''), line, column) }
+single_quoted_single_line_string
+ = "'" chars:literal_char* "'" { return node('String', chars.join(''), line, column) }
+
+string_char
+ = ESCAPED / (!'"' char:. { return char })
+
+literal_char
+ = (!"'" char:. { return char })
+
+multiline_string_char
+ = ESCAPED / multiline_string_delim / (!'"""' char:. { return char})
+
+multiline_string_delim
+ = '\\' NL NLS* { return '' }
+
+multiline_literal_char
+ = (!"'''" char:. { return char })
+
+float
+ = left:(float_text / integer_text) ('e' / 'E') right:integer_text { return node('Float', parseFloat(left + 'e' + right), line, column) }
+ / text:float_text { return node('Float', parseFloat(text), line, column) }
+
+float_text
+ = '+'? digits:(DIGITS '.' DIGITS) { return digits.join('') }
+ / '-' digits:(DIGITS '.' DIGITS) { return '-' + digits.join('') }
+
+integer
+ = text:integer_text { return node('Integer', parseInt(text, 10), line, column) }
+
+integer_text
+ = '+'? digits:DIGIT+ !'.' { return digits.join('') }
+ / '-' digits:DIGIT+ !'.' { return '-' + digits.join('') }
+
+boolean
+ = 'true' { return node('Boolean', true, line, column) }
+ / 'false' { return node('Boolean', false, line, column) }
+
+array
+ = '[' array_sep* ']' { return node('Array', [], line, column) }
+ / '[' value:array_value? ']' { return node('Array', value ? [value] : [], line, column) }
+ / '[' values:array_value_list+ ']' { return node('Array', values, line, column) }
+ / '[' values:array_value_list+ value:array_value ']' { return node('Array', values.concat(value), line, column) }
+
+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
+
+inline_table
+ = '{' S* values:inline_table_assignment* S* '}' { return node('InlineTable', values, line, column) }
+
+inline_table_assignment
+ = S* key:key S* '=' S* value:value S* ',' S* { return node('InlineTableValue', value, line, column, key) }
+ / S* key:key S* '=' S* value:value { return node('InlineTableValue', value, line, column, key) }
+
+secfragment
+ = '.' digits:DIGITS { return "." + digits }
+
+date
+ = date:(
+ DIGIT DIGIT DIGIT DIGIT
+ '-'
+ DIGIT DIGIT
+ '-'
+ DIGIT DIGIT
+ ) { return date.join('') }
+
+time
+ = time:(DIGIT DIGIT ':' DIGIT DIGIT ':' DIGIT DIGIT secfragment?) { return time.join('') }
+
+time_with_offset
+ = time:(
+ DIGIT DIGIT ':' DIGIT DIGIT ':' DIGIT DIGIT secfragment?
+ ('-' / '+')
+ DIGIT DIGIT ':' DIGIT DIGIT
+ ) { return time.join('') }
+
+datetime
+ = date:date 'T' time:time 'Z' { return node('Date', new Date(date + "T" + time + "Z"), line, column) }
+ / date:date 'T' time:time_with_offset { return node('Date', new Date(date + "T" + time), line, column) }
+
+
+S = [ \t]
+NL = "\n" / "\r" "\n"
+NLS = NL / S
+EOF = !.
+HEX = [0-9a-f]i
+DIGIT = DIGIT_OR_UNDER
+DIGIT_OR_UNDER = [0-9]
+ / '_' { return "" }
+ASCII_BASIC = [A-Za-z0-9_\-]
+DIGITS = d:DIGIT_OR_UNDER+ { return d.join('') }
+ESCAPED = '\\"' { 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 HEX HEX HEX HEX) { return convertCodePoint(digits.join('')) }
+ / "\\u" digits:(HEX HEX HEX HEX) { return convertCodePoint(digits.join('')) }