|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Diggins.Jigsaw
{
class ArithmeticEvaluator
{
public static dynamic Eval(string s)
{
return Eval(ArithmeticGrammar.Expression.Parse(s)[0]);
}
public static dynamic Eval(Node n)
{
switch (n.Label)
{
case "Number": return Eval(n[0]);
case "Integer": return Int64.Parse(n.Text);
case "Float": return Double.Parse(n.Text);
case "PrefixExpr":
switch (n[0].Text)
{
case "-": return -Eval(n[1]);
case "!": return !Eval(n[1]);
case "~": return ~Eval(n[1]);
default: throw new Exception(n[0].Text);
}
case "ParanExpr": return Eval(n[0]);
case "Expression":
switch (n.Count)
{
case 1:
return Eval(n[0]);
case 3:
switch (n[1].Text)
{
case "+": return Eval(n[0]) + Eval(n[2]);
case "-": return Eval(n[0]) - Eval(n[2]);
case "*": return Eval(n[0]) * Eval(n[2]);
case "/": return Eval(n[0]) / Eval(n[2]);
case "%": return Eval(n[0]) % Eval(n[2]);
case "<<": return Eval(n[0]) << Eval(n[2]);
case ">>": return Eval(n[0]) >> Eval(n[2]);
case "==": return Eval(n[0]) == Eval(n[2]);
case "!=": return Eval(n[0]) != Eval(n[2]);
case "<=": return Eval(n[0]) <= Eval(n[2]);
case ">=": return Eval(n[0]) >= Eval(n[2]);
case "<": return Eval(n[0]) < Eval(n[2]);
case ">": return Eval(n[0]) > Eval(n[2]);
case "&&": return Eval(n[0]) && Eval(n[2]);
case "||": return Eval(n[0]) || Eval(n[2]);
case "&": return Eval(n[0]) & Eval(n[2]);
case "|": return Eval(n[0]) | Eval(n[2]);
default: throw new Exception("Unreocognized operator " + n[1].Text);
}
default:
throw new Exception(String.Format("Unexpected number of nodes {0} in expression", n.Count));
}
default:
throw new Exception("Unexpected type of node " + n.Label);
}
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.