reparse
Version:
A parser combinator library like Parsec.
61 lines (47 loc) • 1.22 kB
JavaScript
/// calc -- a simple calculator
//
// Parses the this grammar and calculates the result:
//
// expr ::= expr '+' term | term
// term ::= term '*' factor | factor
// factor ::= '(' expr ')' | number
// number ::= '-' digit+ | digit+
// digit ::= '0' | '1' | ... | '9'
var sys = require('sys'),
ReParse = require('../lib/reparse').ReParse;
function read(input) {
return (new ReParse(input, true)).start(expr);
}
function expr() {
return this.chainl1(term, addop);
}
function term() {
return this.chainl1(factor, mulop);
}
function factor() {
return this.choice(group, number);
}
function group() {
return this.between(/^\(/, /^\)/, expr);
}
function number() {
return parseInt(this.match(/^\-?\d+/));
}
function mulop() {
return OPS[this.match(/^[\*\/]/)];
}
function addop() {
return OPS[this.match(/^[\+\-]/)];
}
var OPS = {
'+': function(a, b) { return a + b; },
'-': function(a, b) { return a - b; },
'*': function(a, b) { return a * b; },
'/': function(a, b) { return a / b; }
};
/// --- Main Program
if (process.argv.length != 3) {
sys.puts('Usage: node ' + process.argv[1] + ' expression');
process.exit(1);
}
sys.puts(read(process.argv[2]));