146 lines
No EOL
2.6 KiB
JavaScript
146 lines
No EOL
2.6 KiB
JavaScript
// Atlas Grammar
|
|
// ============
|
|
//
|
|
// Based on the JSON example Grammar from PEG.js examples
|
|
//
|
|
|
|
Atlas_text = ws value:value ws { return value; }
|
|
|
|
begin_object = ws "(" ws
|
|
end_object = ws ")" ws
|
|
name_separator = ws "=" ws
|
|
value_separator = ws "," ws
|
|
|
|
ws "whitespace" = [ \t\n\r]*
|
|
|
|
// ----- Values -----
|
|
|
|
value = false / null / true / object / array / number / stringval / class / empty
|
|
|
|
empty = "" { return undefined; }
|
|
null = "None" { return null; }
|
|
false = "False" { return false; }
|
|
true = "True" { return true; }
|
|
|
|
// ----- Objects -----
|
|
|
|
object
|
|
= begin_object
|
|
members:(
|
|
head:member
|
|
tail:(value_separator m:member { return m; })*
|
|
{
|
|
var result = {};
|
|
|
|
[head].concat(tail).forEach(function(element) {
|
|
result[element.name] = element.value;
|
|
});
|
|
|
|
return result;
|
|
}
|
|
)?
|
|
end_object
|
|
{ return members !== null ? members: {}; }
|
|
|
|
member
|
|
= name:stringkey name_separator value:value {
|
|
return { name: name, value: value };
|
|
}
|
|
|
|
// ----- Arrays -----
|
|
|
|
array
|
|
= begin_object
|
|
values:(
|
|
head:value
|
|
tail:(value_separator v:value { return v; })*
|
|
{ return [head].concat(tail); }
|
|
)?
|
|
end_object
|
|
{ return values !== null ? values : []; }
|
|
|
|
// ----- Numbers -----
|
|
|
|
number "number"
|
|
= minus? int frac? exp? { return parseFloat(text()); }
|
|
|
|
decimal_point
|
|
= "."
|
|
|
|
digit1_9
|
|
= [1-9]
|
|
|
|
e
|
|
= [eE]
|
|
|
|
exp
|
|
= e (minus / plus)? DIGIT+
|
|
|
|
frac
|
|
= decimal_point DIGIT+
|
|
|
|
int
|
|
= zero / (digit1_9 DIGIT*)
|
|
|
|
minus
|
|
= "-"
|
|
|
|
plus
|
|
= "+"
|
|
|
|
zero
|
|
= "0"
|
|
|
|
// ----- Strings -----
|
|
|
|
stringkey "string key" = sequence:keychar* { return sequence.join(""); }
|
|
|
|
stringval "string value"
|
|
= quotation_mark chars:char* quotation_mark { return chars.join(""); }
|
|
|
|
class = key:stringkey singlequote_mark chars:pathchar* singlequote_mark { return [ key, chars.join("") ]; }
|
|
|
|
keychar = sequence:( [a-zA-Z] / "_" ) { return sequence; }
|
|
|
|
pathchar = sequence:(
|
|
[a-zA-Z0-9]
|
|
/ "_"
|
|
/ "."
|
|
/ "/"
|
|
)
|
|
{ return sequence; }
|
|
|
|
char
|
|
= unescaped
|
|
/ escape
|
|
sequence:(
|
|
'"'
|
|
/ "\\"
|
|
/ "/"
|
|
/ "b" { return "\b"; }
|
|
/ "f" { return "\f"; }
|
|
/ "n" { return "\n"; }
|
|
/ "r" { return "\r"; }
|
|
/ "t" { return "\t"; }
|
|
/ "u" digits:$(HEXDIG HEXDIG HEXDIG HEXDIG) {
|
|
return String.fromCharCode(parseInt(digits, 16));
|
|
}
|
|
)
|
|
{ return sequence; }
|
|
|
|
escape
|
|
= "\\"
|
|
|
|
quotation_mark
|
|
= '"'
|
|
|
|
singlequote_mark = "'"
|
|
|
|
unescaped
|
|
= [^\0-\x1F\x22\x5C]
|
|
|
|
// ----- Core ABNF Rules -----
|
|
|
|
// See RFC 4234, Appendix B (http://tools.ietf.org/html/rfc4234).
|
|
DIGIT = [0-9]
|
|
HEXDIG = [0-9a-f]i |