Skip to content

Instantly share code, notes, and snippets.

@rrthomas
Created September 19, 2014 12:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rrthomas/7837e2bd90de80f2ca6b to your computer and use it in GitHub Desktop.
Save rrthomas/7837e2bd90de80f2ca6b to your computer and use it in GitHub Desktop.
PEG.js for numeric part of Metapolator's formula language
/*
* Parser for Metapolator CPS formula language
*/
{
var unaryOperators = {
'-': 'negate'
};
function $_(operator, right) {
var handler = unaryOperators[operator];
if (right && right[handler])
return right[handler]();
switch (operator) {
case '-': return -right;
}
}
var binaryOperators = {
'+': 'add',
'-': 'subtract',
'*': 'multiply',
'/': 'divide',
'^': 'exponent'
};
function _$_(left, operator, right) {
var handler = binaryOperators[operator];
if (left && left[handler])
return left[handler](right);
switch (operator) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/': return left / right;
case '^': return Math.pow(left, right);
}
}
}
start
= sum
sum
= left:factor s* "+" s* right:sum { return _$_(left, "+", right); }
/ left:factor s* "-" s* right:sum { return _$_(left, "-", right); }
/ factor
factor
= left:exponent s* "*" s* right:factor { return _$_(left, "*", right); }
/ left:exponent s* "/" s* right:factor { return _$_(left, "/", right); }
/ exponent
exponent
= left:negation s* "^" s* right:negation {return _$_(left, "^", right); }
/ negation
negation
= "-" primary:primary { return $_("-", primary); }
/ primary
primary
= number
/ "(" sum:sum ")" { return sum; }
digit
= [0-9]
number "number"
= digits:$((digit* "." digit+) / (digit+ "."?))(([eE][+\-]? digit+)?) { return parseFloat(digits, 10); }
s
= [ \t\r\n\f]+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment