MSzopa

C# ONP Interpreter

Mar 17th, 2022
1,143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.60 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace onpInterpreter
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             while (true)
  11.             {
  12.                 Console.Clear();
  13.                 Console.WriteLine("Enter ONP expression: ");
  14.                 string expression = Console.ReadLine();
  15.                 try
  16.                 {
  17.                     double result = ONP(expression);
  18.                     Console.WriteLine($"Expression value equals {result}.");
  19.                 }catch(Exception ex)
  20.                 {
  21.                     Console.WriteLine($"Error occured: \"{ex.Message}\"");
  22.                 }
  23.                 Console.WriteLine("Press ESC to close program or any other key to continue...");
  24.                 if (Console.ReadKey().Key == ConsoleKey.Escape)
  25.                     break;
  26.             }
  27.         }
  28.         static double ONP(string expression)
  29.         {
  30.             if (!string.IsNullOrEmpty(expression))
  31.             {
  32.                 List<double> _memoryTower = new List<double>();
  33.                 string[] _syntax = expression.Split(' ');
  34.                 foreach (var c in _syntax)
  35.                 {
  36.                     int number;
  37.                     if (int.TryParse(c, out number))
  38.                     {
  39.                         _memoryTower.Add(number);
  40.                     }
  41.                     else
  42.                     {
  43.                         switch (c)
  44.                         {
  45.                             case "+":
  46.                                 if (_memoryTower.Count > 1)
  47.                                 {
  48.                                     _memoryTower.Add(_memoryTower[_memoryTower.Count - 2] + _memoryTower[_memoryTower.Count - 1]);
  49.                                     _memoryTower.RemoveRange(_memoryTower.Count - 3, 2);
  50.                                 }
  51.                                 else
  52.                                     throw new Exception($"Unexpected {c} in expression!");
  53.                                 break;
  54.                             case "-":
  55.                                 if (_memoryTower.Count > 1)
  56.                                 {
  57.                                     _memoryTower.Add(_memoryTower[_memoryTower.Count - 2] - _memoryTower[_memoryTower.Count - 1]);
  58.                                     _memoryTower.RemoveRange(_memoryTower.Count - 3, 2);
  59.                                 }
  60.                                 else
  61.                                     throw new Exception($"Unexpected {c} in expression!");
  62.                                 break;
  63.                             case "*":
  64.                                 if (_memoryTower.Count > 1)
  65.                                 {
  66.                                     _memoryTower.Add(_memoryTower[_memoryTower.Count - 2] * _memoryTower[_memoryTower.Count - 1]);
  67.                                     _memoryTower.RemoveRange(_memoryTower.Count - 3, 2);
  68.                                 }
  69.                                 else
  70.                                     throw new Exception($"Unexpected {c} in expression!");
  71.                                 break;
  72.                             case "/":
  73.                                 if (_memoryTower.Count > 1)
  74.                                 {
  75.                                     _memoryTower.Add(_memoryTower[_memoryTower.Count - 2] / _memoryTower[_memoryTower.Count - 1]);
  76.                                     _memoryTower.RemoveRange(_memoryTower.Count - 3, 2);
  77.                                 }
  78.                                 else
  79.                                     throw new Exception($"Unexpected {c} in expression!");
  80.                                 break;
  81.                             case "^":
  82.                                 if (_memoryTower.Count > 1)
  83.                                 {
  84.                                     _memoryTower.Add(System.Math.Pow(_memoryTower[_memoryTower.Count - 2], _memoryTower[_memoryTower.Count - 1]));
  85.                                     _memoryTower.RemoveRange(_memoryTower.Count - 3, 2);
  86.                                 }
  87.                                 else
  88.                                     throw new Exception($"Unexpected {c} in expression!");
  89.                                 break;
  90.                             default:
  91.                                 throw new Exception($"Unexpected {c} in expression!");
  92.                         }
  93.                     }
  94.                 }
  95.                 if (_memoryTower.Count == 1)
  96.                     return _memoryTower[0];
  97.             }
  98.             throw new Exception("ONP expression in not valid!");
  99.         }
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment