Skip to content

Instantly share code, notes, and snippets.

@recih
Last active August 29, 2015 14:13
Show Gist options
  • Save recih/46b7c64c0b4a45683196 to your computer and use it in GitHub Desktop.
Save recih/46b7c64c0b4a45683196 to your computer and use it in GitHub Desktop.
a javascript parser for lua object, use PEG.js to generate parser code
start = S v:value S { return v; }
s = [ \t\r\n]
S = s*
SEP = S [,;]? S
name = c:[a-zA-Z0-9_]+ { return c.join(""); }
number = c:[0-9.+-]+ { return parseFloat(c.join("")); }
bool = s:('true' / 'false') { return s === 'true'; }
string = '"' s:([^"] / ('\\"' { return '"'}))* '"' { return s.join(""); }
key = ('[' k:(number / string) ']' { return k }) / name
value = number / bool / string / object
kvpair = key:key S '=' S value:value { return { key: key, value: value } }
object_entry = p:kvpair { return p; } / v:value { return v; }
object = '{' entries:( S e:object_entry SEP {return e;})* '}' {
var result = {};
var arr = [];
var is_array = true;
var index = 0;
for(var i = 0; i < entries.length; i++)
{
var e = entries[i];
if(typeof(e) == "object" && !(e instanceof Array) && e.key)
{
result[e.key] = e.value;
is_array = false;
}
else
{
result[index] = e;
arr[index] = e;
index++;
}
}
if(arr.length > 0)
{
result["#"] = arr.length;
}
return is_array ? arr : result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment