Skip to content

Instantly share code, notes, and snippets.

@anujku
Last active October 19, 2022 23:48
Show Gist options
  • Save anujku/d6fbb4c71784f354d7db to your computer and use it in GitHub Desktop.
Save anujku/d6fbb4c71784f354d7db to your computer and use it in GitHub Desktop.
Calculator Peg JS
start
= any
any
= multiplicative
/ divisive
/ power
/ additive
/ subtractive
/ primary
primary
= fraction
/ abs
/ float
/ integer
/ "(" any:any ")" { return any; }
/ "" { return 0; }
additive
= left:primary "+" right:any { return left + right; }
multiplicative
= left:primary "*" right:any { return left * right; }
subtractive
= left:primary "-" right:any { return left - right; }
divisive
= left:primary "/" right:any { return left / right; }
power
= left:primary "^" right:any { return Math.pow(left, right); }
fraction
= "\\fraction{" nominator:any "}{" denominator:any "}"
{
if (denominator === 0) {
if (nominator < 0) {
return Number.POSITIVE_INFINITY;
} else {
return Number.NEGATIVE_INFINITY;
}
} else {
return nominator / denominator;
}
}
abs
= "\\abs{" argument:any "}"
{
return Math.abs(argument);
}
float "float"
= left:[0-9]+ "." right:[0-9]+ { return parseFloat(left.join("") + "." + right.join("")); }
integer "integer"
= digits:[0-9]+ { return parseInt(digits.join(""), 10); }
(2*3)+4+8
3*(12-6)
\frac{1}{2}*\abs{-10}
@melihovv
Copy link

This grammar also accept string like following "1+", it's not very good.

@fiatjaf
Copy link

fiatjaf commented May 7, 2016

what about 1+2/3?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment