Created
December 7, 2013 00:33
-
-
Save ashnur/7835629 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void function(){ | |
var p = require('combigreater') | |
var liberate = require('liberate') | |
var call = liberate(Function.prototype.call) | |
var slice = liberate(Array.prototype.slice) | |
var R = require('rationals') | |
var ZERO = R(0) | |
var ONE = R(1) | |
var digit = p.oneOf('0123456789') | |
var digits = p.many1(digit) | |
var integer = p.map(function (array) { return R(array.join('')) }, digits) | |
function createOperation(op, def){ | |
return function(){ return function(a, b){ return (a||def)[op](b||def) } } | |
} | |
var plus = p.symbol('+') | |
var dash = p.symbol('-') | |
var star = p.symbol('*') | |
var slash = p.symbol('/') | |
var add = p.map(createOperation('add', R(0)), plus) | |
var sub = p.map(createOperation('sub', R(0)), dash) | |
var mul = p.map(createOperation('mul', R(1)), star) | |
var div = p.map(createOperation('div', R(1)), slash) | |
//var whitespace = p.map(function(){return ''}, p.many1(p.oneOf( | |
// '\u0009\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000' | |
//))) | |
var whitespace = p.map(function(){return ''}, p.many1(p.symbol(' '))) | |
var ws = p.many(p.symbol(' ')) | |
function leftExpParser(op, rightExp){ | |
return p.map( | |
function(s){ | |
return s[1].reduce(function(l, n){ return n[0](l, n[1]) }, s[0]) | |
} | |
, p.all([rightExp, p.many(p.all([op, rightExp]))]) | |
) | |
} | |
var additive = p.any([add, sub]) | |
var multiplicative = p.any([mul, div]) | |
var e0 = p.lazy(function(){ | |
return p.any([ | |
integer | |
, p.map(function(a){return a[1]}, p.all([p.symbol("("), exp, p.symbol(")")])) | |
, p.map(function(a){return a[0](0, a[1])}, p.all([additive, e0])) | |
, p.map(function(a){return a[1]}, p.all(ws, e0)) | |
]) | |
}) | |
var exp = leftExpParser(additive, leftExpParser(multiplicative, e0)) | |
function arith(str){ | |
var r = exp(str) | |
console.log('\n\n\n',str, r) | |
return r.value | |
} | |
module.exports = arith | |
}() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment