Skip to content

Instantly share code, notes, and snippets.

@christianp
Created January 19, 2012 09:21
Show Gist options
  • Save christianp/1638930 to your computer and use it in GitHub Desktop.
Save christianp/1638930 to your computer and use it in GitHub Desktop.
lambda-ish PEG
/*
* Classic example grammar, which recognizes simple arithmetic expressions like
* "2*(3+4)". The parser generated from this grammar then computes their value.
*/
start
= expr:expression { return expr({}); }
expression
= function
/ additive
function
= "(" lambda:lambda ")(" expr:expression ")"
{
return function(env){ return lambda(env,expr()); };
}
lambda
= n:name "->" expr:expression
{
return function(env,val) {
var env2 = {};
for(var x in env){ env2[x] = env[x]; }
env2[n.n] = val;
return expr(env2);
}
}
additive
= left:multiplicative "+" right:additive { return function(env){ return left(env)+right(env);} }
/ multiplicative
multiplicative
= left:primary "*" right:multiplicative { return function(env){ return left(env)*right(env);} }
/ primary
primary
= integer
/ name
/ "(" additive:additive ")" { return additive; }
integer "integer"
= digits:[0-9]+
{
var n = parseInt(digits.join(""), 10);
return function(){ return n; }
}
name
= chars:([a-zA-Z][a-zA-Z0-9]*)
{
var n = chars.join('');
var f = function(env) {
if(n in env)
return env[n];
else
return NaN;
}
f.n = n;
return f;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment