Atlas-Config-Generator/js/atlas.pegjs

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" / "none" { return null; }
false = "False" / "false" { return false; }
true = "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-Z0-9] / "_" ) { 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