Skip to content

Instantly share code, notes, and snippets.

@bakso
Last active July 22, 2016 15:03
Show Gist options
  • Save bakso/d87a3328fe97b873cc251f501afa2910 to your computer and use it in GitHub Desktop.
Save bakso/d87a3328fe97b873cc251f501afa2910 to your computer and use it in GitHub Desktop.
json.pegjs
{
function mix(origin, target){
var origin = origin || {};
for (var i in target) {
origin[i] = target[i];
}
return origin;
}
}
value
= bool
/ object
/ array
/ string
/ number
/ null
object
= begin_object
members:object_members?
end_object { return members === null ? {} : members}
object_members
= head:object_member tail:followmember* {
var result = mix({}, head);
tail && tail.forEach(function (item) {
result = mix(result, item);
});
return result;
}
object_member
= name:string namesep value:value {
var obj = {};
obj[name] = value;
return obj;
}
followmember
= membersep m:object_member { return m }
array
= begin_array
values: array_members?
end_array {
return values !== null ? values : [];
}
array_members
= head:value
tail:(membersep v:value { return v; })*
{
return [head].concat(tail);
}
string
= '"' chars:char* '"' { return chars.join("") }
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; }
HEXDIG = [0-9a-f]i
escape = "\\"
unescaped = [^\0-\x1F\x22\x5C]
bool
= "true" { return true }
/ "false" { return false }
number
= "-"?[0-9]+("."[0-9])* { return parseFloat(text()) }
null
= "null" { return null }
namesep = ws ":" ws
membersep = ws "," ws
begin_object = ws "{" ws
end_object = ws "}" ws
begin_array = ws "[" ws
end_array = ws "]" ws
ws = [ \t\n\r]*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment