Skip to content

Instantly share code, notes, and snippets.

@effrenus
Created February 16, 2020 13:38
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 effrenus/439008f70203329867395fe088fb4687 to your computer and use it in GitHub Desktop.
Save effrenus/439008f70203329867395fe088fb4687 to your computer and use it in GitHub Desktop.
{
const globalScope = new Map();
const getVar = (name) => {
if (!globalScope.has(name)) {
throw new Error("Unknown variable name");
}
return globalScope.get(name);
};
const filterEmpty = (arr) => arr.filter(v => typeof v === "number" || !v);
const resolv = (x) => typeof x === "number" ? x : getVar(x);
const sum = (e, t) => (x) => x + (e ? e(t) : t);
const minus = (e, t) => (x) => {
const diff = x - t;
return e ? e(diff) : diff;
}
const mult = (e, t) => (x) => {
const diff = x * t;
return e ? e(diff) : diff;
}
const div = (e, t) => (x) => {
const diff = x / t;
return e ? e(diff) : diff;
}
const mod = (e, t) => (x) => {
const diff = x % t;
return e ? e(diff) : diff;
}
}
S
= i:Ident _ a:Assign { a.shift(); globalScope.set(i, a[0]); return a[0]; }
/ s:Op1 { return s; }
Assign
= s:("=" _ Op1) { return filterEmpty(s); }
Op1
= l:Term _ r:Exp { return r ? r(resolv(l)) : resolv(l); }
_ = " "* { return; }
Exp
= "+" _ t:Term _ e:Exp2 { return sum(e, resolv(t)); }
/ "-" _ t:Term _ e:Exp2 { return minus(e, resolv(t)); }
/ Exp2
Exp2
= "/" _ t:Term _ e:Exp2 { return div(e, resolv(t)); }
/ "*" _ t:Term _ e:Exp2 { return mult(e, resolv(t)); }
/ "%" _ t:Term _ e:Exp2 { return mod(e, resolv(t)); }
/ "+" _ t:Term _ e:Exp2 { return sum(e, resolv(t)); }
/ "-" _ t:Term _ e:Exp2 { return minus(e, resolv(t)); }
/ Term
/ ""
Ident
= ident:(Letter / "_" IdentChr) { return ident.join(''); }
IdentChr
= "_" / Letter / Digit
Letter
= [a-zA-Z]+
Digit
= [0-9]+
Number
= n:(Digit+ ("." Digit+)?) { return parseFloat(n.flat(Infinity).join('')); }
Term
= Number
/ Ident
/ "(" _ op:Op1 _ ")" { return op; }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment