Skip to content

Instantly share code, notes, and snippets.

@ashnur
Created December 7, 2013 00:33
Show Gist options
  • Save ashnur/7835629 to your computer and use it in GitHub Desktop.
Save ashnur/7835629 to your computer and use it in GitHub Desktop.
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