Advertisement
filmee24

Reference CSharp Parser

Dec 22nd, 2013
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.28 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Lib.Mathematics
  6. {
  7.     public class Expression
  8.     {
  9.         internal Expression()
  10.         {
  11.            
  12.         }
  13.  
  14.         private List<Stack> _stacks = new List<Stack>();
  15.         public object Result { get; set; }
  16.         public string Term
  17.         {
  18.             get { return _term; }
  19.             internal set { _term = value;}
  20.         }
  21.  
  22.         public readonly Dictionary<string, Expression> Variables = new Dictionary<string, Expression>();
  23.         private string _term;
  24.  
  25.         public static Expression Parse(string expr)
  26.         {
  27.             var returns = new Expression {Term = expr};
  28.  
  29.             expr = expr.Replace("²", "²0");
  30.             expr = expr.Replace("³", "³0");
  31.             expr = expr.Replace("sqrt[", "√");
  32.             expr = expr.Replace("pi", "π");
  33.             expr = expr.Replace("]", "");
  34.             expr = expr.Replace("√", "1√");
  35.             expr = expr.Replace("π", "1π1");
  36.             expr = expr.Replace("True", "1");
  37.             expr = expr.Replace("False", "0");
  38.  
  39.             expr = returns.Variables.Aggregate(expr, (current, var) => current.Replace(var.Key + "*1", var.Value));
  40.  
  41.             var chars = expr.ToCharArray();
  42.             var result = "";
  43.             foreach (var c in chars)
  44.             {
  45.                 if (isNum(c))
  46.                 {
  47.                     result += c;
  48.                 }
  49.                 else
  50.                 {
  51.                     if (isOP(c))
  52.                     {
  53.                         returns._stacks.Add(new NumStack(Convert.ToDouble(result)));
  54.                         returns._stacks.Add(new OpStack(c.ToString()));
  55.                         result = "";
  56.                     }
  57.                 }
  58.             }
  59.             returns._stacks.Add(returns.getLastNum(expr));
  60.  
  61.             returns._stacks = returns.dotbeforestatement(returns._stacks);
  62.             returns.Calculate();
  63.  
  64.             return returns;
  65.         }
  66.  
  67.         internal void Calculate()
  68.         {
  69.             for (var i = 0; i < _stacks.Count - 1; i++)
  70.             {
  71.                 var stack = _stacks[i];
  72.                 var opStack = stack as OpStack;
  73.                 if (opStack != null)
  74.                 {
  75.                     var first = (NumStack)_stacks[i - 1];
  76.                     var second = (NumStack)_stacks[i + 1];
  77.                     var op = opStack;
  78.                     var _result = new NumStack(0);
  79.                     var resultisbool = false;
  80.                     var boolresult = false;
  81.  
  82.                     switch (op.Value)
  83.                     {
  84.                         case "+":
  85.                             _result = new NumStack(first.Value + second.Value);
  86.                             break;
  87.                         case "-":
  88.                             _result = new NumStack(first.Value - second.Value);
  89.                             break;
  90.                         case "*":
  91.                             _result = new NumStack(first.Value * second.Value);
  92.                             break;
  93.                         case "/":
  94.                             _result = new NumStack(first.Value / second.Value);
  95.                             break;
  96.                         case "^":
  97.                             _result = new NumStack(Math.Pow(first.Value, second.Value));
  98.                             break;
  99.                         case "%":
  100.                             _result = new NumStack(first.Value % second.Value);
  101.                             break;
  102.                         case "&":
  103.                             _result = new NumStack(Convert.ToDouble(first.Value.ToString() + second.Value.ToString()));
  104.                             break;
  105.                         case "²":
  106.                             _result = new NumStack(first.Value * first.Value);
  107.                             break;
  108.                         case "³":
  109.                             _result = new NumStack(first.Value * first.Value * first.Value);
  110.                             break;
  111.                         case "√":
  112.                             _result = new NumStack(Math.Sqrt(second.Value));
  113.                             break;
  114.                         case "π":
  115.                             _result = new NumStack(Math.PI);
  116.                             break;
  117.                         case "<":
  118.                             resultisbool = true;
  119.                             boolresult = first.Value < second.Value;
  120.                             break;
  121.                         case ">":
  122.                             resultisbool = true;
  123.                             boolresult = first.Value > second.Value;
  124.                             break;
  125.                         case "!":
  126.                             resultisbool = true;
  127.                             boolresult = first.Value != second.Value;
  128.                             break;
  129.                     }
  130.  
  131.                     _stacks.RemoveAt(0);
  132.                     _stacks.RemoveAt(0);
  133.                     _stacks.RemoveAt(0);
  134.                     _stacks.Insert(0, _result);
  135.  
  136.                     Result = (_stacks[0] as NumStack).Value;
  137.  
  138.                     if (_stacks.Count != 1)
  139.                     {
  140.                         if (_stacks[0] != null && _stacks[1] != null && _stacks[2] != null)
  141.                         {
  142.                             Calculate();
  143.                         }
  144.                     }
  145.                     if (resultisbool)
  146.                     {
  147.                         Result = boolresult;
  148.                     }
  149.                 }
  150.             }
  151.         }
  152.  
  153.         #region "ObjectOperators"
  154.  
  155.         public static Expression operator +(Expression e1, Expression e2)
  156.         {
  157.             return Parse(e1.Result + "+" + e2.Result);
  158.         }
  159.         public static bool operator ==(Expression e1, Expression e2)
  160.         {
  161.             return e1 == e2;
  162.         }
  163.         public static bool operator !=(Expression e1, Expression e2)
  164.         {
  165.             return e1 != e2;
  166.         }
  167.         public static Expression operator +(Expression e1, string e2)
  168.         {
  169.             e2 = e2.Replace("=", "");
  170.             return Parse(e2);
  171.         }
  172.         public static Expression operator -(Expression e1, Expression e2)
  173.         {
  174.             return Parse(e1.Result + "-" + e2.Result);
  175.         }
  176.         public static Expression operator *(Expression e1, Expression e2)
  177.         {
  178.             return Parse(e1.Result + "*" + e2.Result);
  179.         }
  180.         public static Expression operator /(Expression e1, Expression e2)
  181.         {
  182.             return Parse(e1.Result + "/" + e2.Result);
  183.         }
  184.         public static Expression operator <(Expression e1, Expression e2)
  185.         {
  186.             return Parse(e1.Result + "<" + e2.Result);
  187.         }
  188.         public static Expression operator >(Expression e1, Expression e2)
  189.         {
  190.             return Parse(e1.Result + ">" + e2.Result);
  191.         }
  192.         public static implicit operator Expression(string v)
  193.         {
  194.             return Parse(v);
  195.         }
  196.         public static implicit operator double(Expression instance)
  197.         {
  198.             return (double) instance.Result;
  199.         }
  200.         public static implicit operator bool(Expression instance)
  201.         {
  202.             return (bool) instance.Result;
  203.         }
  204.         public static implicit operator string(Expression instance)
  205.         {
  206.             return instance.Result.ToString();
  207.         }
  208.         public override bool Equals(object obj)
  209.         {
  210.             if (obj == null || GetType() != obj.GetType())
  211.             {
  212.                 return false;
  213.             }
  214.             return base.Equals(obj);
  215.            
  216.         }
  217.  
  218.         #endregion
  219.         #region "Help Functions"
  220.         private static bool isNum(char s)
  221.         {
  222.             double result;
  223.             return double.TryParse(s.ToString(), out result);
  224.         }
  225.         private static bool isOP(char s)
  226.         {
  227.             return s == '+' | s == '-' | s == '*' | s == '/' | s == '^' | s == '%' | s == '&' | s == '²' | s == '3' | s == '<' | s == '>' | s == '!' | s == '√' | s == 'π';
  228.         }
  229.         private bool isPunctiaton(char s)
  230.         {
  231.             return s == '*' | s == '/';
  232.         }
  233.         private bool isBracketOpen(char s)
  234.         {
  235.             return s == '(';
  236.         }
  237.         private bool isBracketClosed(char s)
  238.         {
  239.             return s == ')';
  240.         }
  241.         private NumStack getLastNum(string s)
  242.         {
  243.             var c = s.Split(Convert.ToChar((_stacks[_stacks.Count - 1] as OpStack).Value));
  244.             return new NumStack(Convert.ToInt32(c[c.Length - 1]));
  245.         }
  246.  
  247.         private List<Stack> dotbeforestatement(List<Stack> st)
  248.         {
  249.             var returns = st;
  250.  
  251.             for (var i = 0; i < st.Count; i++)
  252.             {
  253.                 var s = st[i];
  254.  
  255.                 if (s is OpStack)
  256.                 {
  257.                     var op = s as OpStack;
  258.                     if (isPunctiaton(Convert.ToChar(op.Value)))
  259.                     {
  260.                         if (st.Count < 3)
  261.                         {
  262.                             var firstop = st[i - 2];
  263.                             var first = st[i - 1];
  264.                             var ops = s;
  265.                             var second = st[i + 1];
  266.  
  267.                             returns.Remove(first);
  268.                             returns.Remove(ops);
  269.                             returns.Remove(second);
  270.                             returns.Remove(firstop);
  271.  
  272.                             returns.InsertRange(0, new[] { first, ops, second, firstop });
  273.                         }
  274.                     }
  275.                 }
  276.             }
  277.  
  278.             return returns;
  279.         }
  280.         #endregion
  281.         #region "Implementations"
  282.         public override int GetHashCode()
  283.         {
  284.             return base.GetHashCode();
  285.         }
  286.         public Expression Clone()
  287.         {
  288.             return this;
  289.         }
  290.         public override string ToString()
  291.         {
  292.             return Result.ToString();
  293.         }
  294.         #endregion
  295.     }
  296. }
  297. namespace Lib.Mathematics
  298. {
  299.     public class CalcedStack : Stack
  300.     {
  301.         public NumStack first { get; set; }
  302.         public OpStack op { get; set; }
  303.         public NumStack second { get; set; }
  304.         public NumStack result { get; set; }
  305.  
  306.         public CalcedStack()
  307.         {
  308.             first = new NumStack(0);
  309.             op = new OpStack("");
  310.             second = new NumStack(0);
  311.         }
  312.  
  313.         public override string ToString()
  314.         {
  315.             return first.Value.ToString() + op.Value + second.Value.ToString();
  316.         }
  317.     }
  318. }
  319. namespace Lib.Mathematics
  320. {
  321.     public class NumStack : Stack<double>
  322.     {
  323.         public NumStack(double v)
  324.             : base(v)
  325.         {
  326.         }
  327.     }
  328. }
  329. namespace Lib.Mathematics
  330. {
  331.     public class OpStack : Stack<string>
  332.     {
  333.         public OpStack(string v)
  334.             : base(v)
  335.         {
  336.         }
  337.     }
  338. }
  339. namespace Lib.Mathematics
  340. {
  341.     public abstract class Stack<t> : Stack
  342.     {
  343.         public t Value { get; set; }
  344.         protected Stack(t v)
  345.         {
  346.             Value = v;
  347.         }
  348.         public override string ToString()
  349.         {
  350.             return Value.ToString();
  351.         }
  352.     }
  353.  
  354.     public abstract class Stack
  355.     {
  356.     }
  357. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement