Advertisement
kot025

TFCS-2 3.2 Fin

Dec 17th, 2014
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.46 KB | None | 0 0
  1. /*
  2.  
  3. BY: Iurchak Aleksei BI-14-1
  4.  
  5. G = {A, N, P, S}
  6.  
  7. A = {‘0’ .. ‘9’, ‘a’ .. ’z’, ‘A’ .. ‘Z’, ‘_’, ‘+’, ‘-’, ‘*’, ‘/’}
  8.  
  9. N = {Digit, Int, Number, Letter, Variable, Expression, Addend, Factor)
  10.  
  11. P = {
  12. <Expression> ::= <Addend> { ‘+’ <Addend> | ‘–‘ <Addend> }
  13. <Addend> ::= <Factor> { ‘*’ <Factor> | ‘/‘ <Factor> }
  14. <Fac> ::= <Variable> | <Number> | ‘(‘ <Expression> ‘)’
  15. <Digit> ::= ‘0’ | ‘1’ | ‘2’ | ‘3’ | ‘4’ | ‘5’ | ‘6’ | ‘7’ | ‘8’ | ‘9’
  16. <Int> ::= <Digit> { <Digit> }
  17. <Number> ::= <Int> ’.’ [<Int>]
  18. <Letter> ::= ‘a’ | 'b' | ..  | ’z’ | ‘A’ | 'B' | .. | ‘Z’
  19. <Variable> ::= <L> { <L> | <Z> | ‘_’ }
  20. }
  21.  
  22. S ::= <Expression>
  23. */
  24.  
  25. using System;
  26. using System.Collections.Generic;
  27. using System.Linq;
  28. using System.Text;
  29. using System.Threading.Tasks;
  30.  
  31. namespace TFCS_2
  32. {
  33.     public class BinTree // BinTree root
  34.     {
  35.         public BinTree()
  36.         {
  37.         }
  38.         public string Info { get; set; }
  39.         public BinTree Left { get; set; }
  40.         public BinTree Right { get; set; }
  41.     }
  42.  
  43.     class Program
  44.     {
  45.         static string s = "";
  46.         static string error = "";
  47.         static int tick = -1;
  48.         static int m = 0;
  49.         static BinTree Root = null;
  50.         static BinTree Node = new BinTree();
  51.         static Dictionary<string, double> dict = new Dictionary<string, double>();
  52.         static BinTree AddNewNode(string s) //Adding new node
  53.         {
  54.             BinTree NewNode = new BinTree();
  55.             NewNode.Info = s;
  56.             NewNode.Left = null;
  57.             NewNode.Right = null;
  58.             return NewNode;
  59.         }
  60.         static BinTree Expression() // Expression parse
  61.         {
  62.             if (Is() && error == "" && (Letter(s[m]) || Digit(s[m]) || s[m] == '('))
  63.             {
  64.                 BinTree mid = null;
  65.                 BinTree left = Addend();
  66.  
  67.                 while (Is() && error == "" && (s[m] == '+' || s[m] == '-'))
  68.                 {
  69.                     string sym = s[m].ToString();
  70.                     Next();
  71.  
  72.                     BinTree right = Addend();
  73.                     mid = AddNewNode(sym);
  74.                     mid.Left = left;
  75.                     mid.Right = right;
  76.                     left = mid;
  77.                 }
  78.                 /*
  79.                 if (Is() && error == "")
  80.                 {
  81.                     error = "Operator expected\n";
  82.                     tick = m;
  83.                     return null;
  84.                 }
  85.                 */
  86.                 return left;
  87.             }
  88.             else
  89.             {
  90.                 error = "Number, variable or '(' expected\n";
  91.                 tick = m;
  92.                 return null;
  93.             }
  94.         }
  95.         static BinTree Addend() // Addend parse
  96.         {
  97.             if (Is() && error == "" && (Letter(s[m]) || Digit(s[m]) || s[m] == '('))
  98.             {
  99.                 BinTree mid = null;
  100.                 BinTree left = Factor();
  101.                 while (Is() && error == "" && (s[m] == '*' || s[m] == '/'))
  102.                 {
  103.                     string sym = s[m].ToString();
  104.                     Next();
  105.                     if (Is())
  106.                     {
  107.                         BinTree right = Factor();
  108.                         mid = AddNewNode(sym);
  109.                         mid.Left = left;
  110.                         mid.Right = right;
  111.                     }
  112.                     else
  113.                     {
  114.                         error = "Number, variable or '(' expected\n";
  115.                         tick = m;
  116.                         return null;
  117.                     }
  118.                     left = mid;
  119.                 }
  120.                 return left;
  121.             }
  122.             else
  123.             {
  124.                 error = "Number, variable or '(' expected\n";
  125.                 tick = m;
  126.                 return null;
  127.             }
  128.         }
  129.         static BinTree Factor() // Factor parse
  130.         {
  131.             if (Is() && error == "" && Letter(s[m]))
  132.             {
  133.                 return AddNewNode(Variable());
  134.             }
  135.             else
  136.             {
  137.                 if (Is() && Digit(s[m]))
  138.                 {
  139.                     return AddNewNode(Number());
  140.                 }
  141.                 else
  142.                 {
  143.                     if (Is() && s[m] == '(')
  144.                     {
  145.                         Next();
  146.                         BinTree mid = Expression();
  147.                         if (Is() && s[m] == ')')
  148.                         {
  149.                             Next();
  150.                             return mid;
  151.                         }
  152.                         else
  153.                         {
  154.                             error = "')' expected\n";
  155.                             tick = m;
  156.                             return null;
  157.                         }
  158.                     }
  159.                     else
  160.                     {
  161.                         error = "Number, variable or '(' expected\n";
  162.                         tick = m;
  163.                         return null;
  164.                     }
  165.                 }
  166.             }
  167.         }
  168.         static string Number() // Number parse
  169.         {
  170.             char[] ar = new char[0];
  171.             while (Is() && Digit(s[m]))
  172.             {
  173.                 ar = Add(ar, s[m]);
  174.                 m++;
  175.             }
  176.             if (Is() && s[m] == ',')
  177.             {
  178.                 ar = Add(ar, s[m]);
  179.                 m++;
  180.  
  181.                 while (Is() && Digit(s[m]))
  182.                 {
  183.                     ar = Add(ar, s[m]);
  184.                     m++;
  185.                 }
  186.             }
  187.             if (Is() && s[m] == ' ')
  188.             {
  189.                 Next();
  190.             }
  191.  
  192.             return new string(ar);
  193.         }
  194.         static string Variable() // Variable parse
  195.         {
  196.             char[] ar = new char[0];
  197.             while (Is() && (Letter(s[m]) || Digit(s[m]) || s[m] == '_'))
  198.             {
  199.                 ar = Add(ar, s[m]);
  200.                 m++;
  201.             }
  202.             if (Is() && s[m] == ' ')
  203.             {
  204.                 Next();
  205.             }
  206.             string var = new string(ar);
  207.             return var;
  208.         }
  209.         static void Next() // Getting to the next meaningful symbol
  210.         {
  211.             m++;
  212.             while (Is() && s[m] == ' ')
  213.             {
  214.                 m++;
  215.             }
  216.         }
  217.         static bool Is() // Element exists
  218.         {
  219.             return m < s.Length;
  220.         }
  221.         static bool Letter(char sym) // Symbol is a letter
  222.         {
  223.             return char.IsLetter(sym);
  224.         }
  225.         static bool Digit(char sym) // Symbol is a digit
  226.         {
  227.             return char.IsDigit(sym);
  228.         }
  229.         static char[] Add(char[] ar, char sym) // Adding the element to char array end  
  230.         {
  231.             char[] newAr = new char[ar.Length + 1];
  232.             int i = 0;
  233.             for (i = 0; i < ar.Length; i++)
  234.             {
  235.                 newAr[i] = ar[i];
  236.             }
  237.             newAr[i] = sym;
  238.             return newAr;
  239.         }
  240.         static string[] Add(string[] ar, string strToAdd) // Adding the element to string array end  
  241.         {
  242.             string[] newAr = new string[ar.Length + 1];
  243.             int i = 0;
  244.             for (i = 0; i < ar.Length; i++)
  245.             {
  246.                 newAr[i] = ar[i];
  247.             }
  248.             newAr[i] = strToAdd;
  249.             return newAr;
  250.         }
  251.         static void PrintTree(BinTree Root) // BinTree print
  252.         {
  253.             if (Root != null)
  254.             {
  255.                 PrintTree(Root.Left);
  256.                 Console.Write(" ");
  257.                 PrintTree(Root.Right);
  258.                 Console.Write(" ");
  259.                 Console.Write(Root.Info);
  260.             }
  261.         }
  262.         static double Calcul(BinTree R) // Calculating RPN
  263.         {
  264.             if (Digit(R.Info[0]))
  265.             {
  266.                 return Convert.ToDouble(R.Info);
  267.             }
  268.             else
  269.             {
  270.                 if (R.Info == "+")
  271.                 {
  272.                     return Calcul(R.Left) + Calcul(R.Right);
  273.                 }
  274.                 else
  275.                 {
  276.                     if (R.Info == "-")
  277.                     {
  278.                         return Calcul(R.Left) - Calcul(R.Right);
  279.                     }
  280.                     else
  281.                     {
  282.                         if (R.Info == "*")
  283.                         {
  284.                             return Calcul(R.Left) * Calcul(R.Right);
  285.                         }
  286.                         else
  287.                         {
  288.                             if (R.Info == "/")
  289.                             {
  290.                                 double rRight = Calcul(R.Right);
  291.                                 if (rRight == 0)
  292.                                 {
  293.                                     error = "Division by zero error";
  294.                                 }
  295.                                 else
  296.                                 {
  297.                                     return Calcul(R.Left) / rRight;
  298.                                 }
  299.                             }
  300.                             else
  301.                             {
  302.                                 if (Letter(R.Info[0]))
  303.                                 {
  304.                                     if (dict.ContainsKey(R.Info))
  305.                                     {
  306.                                         return dict[R.Info];
  307.                                     }
  308.                                     else
  309.                                     {
  310.                                         bool ok;
  311.                                         double value;
  312.                                         do
  313.                                         {
  314.                                             Console.Write(R.Info + ": ");
  315.                                             ok = double.TryParse(Console.ReadLine(), out value);
  316.                                             if (!ok)
  317.                                             {
  318.                                                 Console.ForegroundColor = ConsoleColor.Red;
  319.                                                 Console.WriteLine("Integer or real value expected");
  320.                                                 Console.ResetColor();
  321.                                             }
  322.                                         } while (!ok);
  323.                                         dict.Add(R.Info, value);
  324.                                         return value;
  325.                                     }
  326.                                 }
  327.                             }
  328.                         }
  329.                     }
  330.                 }
  331.             }
  332.  
  333.             return 0;
  334.         }
  335.  
  336.         static void Main(string[] args) // Entering point
  337.         {
  338.             Console.Clear();
  339.             Console.WriteLine("Enter an expression");
  340.             Console.WriteLine();
  341.  
  342.             s = Console.ReadLine();
  343.  
  344.             if (s != "")
  345.             {
  346.                 if (s[0] == ' ')
  347.                 {
  348.                     Next();
  349.                 }
  350.                 Root = Expression();
  351.  
  352.                 if (error == "" && m < s.Length)
  353.                 {
  354.                     error = "Operator expected\n";
  355.                     tick = m;
  356.                 }
  357.                 if (error != "")
  358.                 {
  359.                     for (int i = 0; i < tick; i++)
  360.                     {
  361.                         Console.Write(' ');
  362.                     }
  363.                     Console.ForegroundColor = ConsoleColor.Red;
  364.                     Console.Write("^");
  365.                     Console.WriteLine();
  366.                     Console.WriteLine(error);
  367.                     Console.ResetColor();
  368.                 }
  369.                 else
  370.                 {
  371.  
  372.                     Console.WriteLine();
  373.                     Console.Write("RPN:");
  374.                     PrintTree(Root);
  375.                     Console.WriteLine();
  376.                     Console.WriteLine();
  377.  
  378.                     double res = Calcul(Root);
  379.  
  380.                     if (error == "")
  381.                     {
  382.                         Console.WriteLine(s + " = " + res);
  383.                     }
  384.                     else
  385.                     {
  386.                         Console.ForegroundColor = ConsoleColor.Red;
  387.                         Console.WriteLine(error);
  388.                         Console.ResetColor();
  389.                     }
  390.                 }
  391.             }
  392.             Console.WriteLine();
  393.         }
  394.     }
  395. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement