Пример #1
0
 private void SetNum(Generator_OPS.ItemOPS itemOPS, int num)
 {
     if (Generator.GetVariables().ContainsKey(itemOPS.Variable_Name))
     {
         Generator.SetVariable(itemOPS.Variable_Name, num);
     }
     else if (Generator.GetArrays().ContainsKey(itemOPS.Variable_Name))
     {
         Generator.SetArrayValue(itemOPS.Variable_Name, itemOPS.Array_Index, num);
     }
     else
     {
         throw new Exception($"A variable was expected, (row='{itemOPS.Row}', col='{itemOPS.Col}')");
     }
 }
Пример #2
0
 private int GetNum(Generator_OPS.ItemOPS itemOPS)
 {
     if (itemOPS.Type_OPS == Generator_OPS.TypeOPS.NUMBER)
     {
         return(itemOPS.Number);
     }
     else if (itemOPS.Type_OPS == Generator_OPS.TypeOPS.VARIABLE)
     {
         if ((Generator.GetVariables()).ContainsKey(itemOPS.Variable_Name))
         {
             return(Generator.GetVariables()[itemOPS.Variable_Name]);
         }
         else
         {
             return(Generator.GetArrays()[itemOPS.Variable_Name][itemOPS.Array_Index]);
         }
     }
     else
     {
         throw new Exception($"Variable or number was expected, (row='{itemOPS.Row}', col='{itemOPS.Col}')");
     }
 }
Пример #3
0
        public void RunInterpreter()
        {
            ItemsOPS = Generator.RunGenerate(Analyzer.Analyze_Text(Program_Text));

            Stack <Generator_OPS.ItemOPS> magazine = new Stack <Generator_OPS.ItemOPS>();

            for (int i = 0; i < ItemsOPS.Count; i++)
            {
                switch (ItemsOPS[i].Type_OPS)
                {
                case Generator_OPS.TypeOPS.VARIABLE:
                {
                    if (!Generator.GetVariables().ContainsKey(ItemsOPS[i].Variable_Name) &&
                        !Generator.GetArrays().ContainsKey(ItemsOPS[i].Variable_Name))
                    {
                        throw new Exception($"Unknown variable '{ItemsOPS[i].Variable_Name}', (row='{ItemsOPS[i].Row}', col='{ItemsOPS[i].Col}')");
                    }
                    magazine.Push(ItemsOPS[i]);
                    break;
                }

                case Generator_OPS.TypeOPS.NUMBER:
                {
                    magazine.Push(ItemsOPS[i]);
                    break;
                }

                case Generator_OPS.TypeOPS.OPERATION:
                {
                    switch (ItemsOPS[i].Operation_OPS)
                    {
                    case Generator_OPS.OperationOPS.READ:
                    {
                        int num = int.Parse(Console.ReadLine());
                        Generator_OPS.ItemOPS itemOPS = magazine.Pop();
                        SetNum(itemOPS, num);
                        break;
                    }

                    case Generator_OPS.OperationOPS.WRITE:
                    {
                        Generator_OPS.ItemOPS itemOPS = magazine.Pop();
                        Console.WriteLine(GetNum(itemOPS));
                        break;
                    }

                    case Generator_OPS.OperationOPS.PLUS:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) + GetNum(itemOPS_2), itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.MINUS:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) - GetNum(itemOPS_2), itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.MULTIPLY:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) * GetNum(itemOPS_2), itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.DIVIDE:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        if (GetNum(itemOPS_2) == 0)
                        {
                            throw new Exception($"Division by zero, (row='{ItemsOPS[i].Row}', col='{ItemsOPS[i].Col}')");
                        }
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) / GetNum(itemOPS_2), itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.LESS:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) < GetNum(itemOPS_2) ? 1 : 0, itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.MORE:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) > GetNum(itemOPS_2) ? 1 : 0, itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.EQUAL:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) == GetNum(itemOPS_2) ? 1 : 0, itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.LESS_OR_EQUAL:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) <= GetNum(itemOPS_2) ? 1 : 0, itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.MORE_OR_EQUAL:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) >= GetNum(itemOPS_2) ? 1 : 0, itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.NOT_EQUAL:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        magazine.Push(new Generator_OPS.ItemOPS(GetNum(itemOPS_1) != GetNum(itemOPS_2) ? 1 : 0, itemOPS_1.Row, itemOPS_1.Col));
                        break;
                    }

                    case Generator_OPS.OperationOPS.ASSIGN:
                    {
                        Generator_OPS.ItemOPS itemOPS_2 = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS_1 = magazine.Pop();
                        SetNum(itemOPS_1, GetNum(itemOPS_2));
                        break;
                    }

                    case Generator_OPS.OperationOPS.J:
                    {
                        i = GetNum(magazine.Pop()) - 1;
                        break;
                    }

                    case Generator_OPS.OperationOPS.JF:
                    {
                        Generator_OPS.ItemOPS metka   = magazine.Pop();
                        Generator_OPS.ItemOPS itemOPS = magazine.Pop();
                        if (GetNum(itemOPS) == 0)
                        {
                            i = GetNum(metka) - 1;
                        }
                        break;
                    }

                    case Generator_OPS.OperationOPS.I:
                    {
                        Generator_OPS.ItemOPS itemIDX = magazine.Pop();
                        Generator_OPS.ItemOPS array   = magazine.Pop();
                        array.Array_Index = GetNum(itemIDX);
                        magazine.Push(array);
                        break;
                    }

                    default:
                        throw new Exception($"Unknown operation ops, (row='{ItemsOPS[i].Row}', col='{ItemsOPS[i].Col}')");
                    }
                    break;
                }
                }
            }
        }