200 lines
3.3 KiB
C++
Raw Blame History

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <ctime>
#include <chrono>
#include <fstream>
#include <iomanip>
#include <queue>
using namespace std;
#define endl '\n'
#define endll cout << endl
#define LL_MAX 2223372036854775807
typedef long long ll;
template <typename T>
class Stack {
private:
struct Node
{
Node* back;
T value;
};
Node* Head;
public:
Stack()
{
Head = nullptr;
}
void Add(T component)
{
Node* bk = Head;
Head = new Node;
Head->back = bk;
Head->value = component;
}
T Pop()
{
if (Head != nullptr)
{
Node* v = Head;
Head = Head->back;
T value = v->value;
delete(v);
return value;
}
}
bool isEmpty()
{
if (Head == nullptr)
return true;
return false;
}
};
struct Arg {
public:
string Name;
string Type;
string Value;
Arg() {}
Arg(string n, string t, string v) : Name(n), Type(t), Value(v) {}
Arg(string n, string t) : Name(n), Type(t), Value("None") {}
};
class SysCall
{
public:
int ID;
string Name;
vector<Arg> Args;
SysCall(int id, string name, vector<Arg> args) : ID(id), Name(name), Args(args) {}
string toString()
{
string otv = "ID: " + to_string(ID) + "\t Name: " + Name + "\n";
for (Arg a : Args)
{
otv += "name: " + a.Name + "\t type: " + a.Type + "\t value: " + a.Value + "\n";
}
return otv;
}
};
class Kernel
{
private:
vector<SysCall> Calls;
public:
Kernel()
{
Calls = vector<SysCall>({
SysCall(1, "A", vector<Arg>({
Arg("AB", "int")
})),
SysCall(2, "B", vector<Arg>({
Arg("AB", "int", "163"),
Arg("BA", "string", "145")})),
SysCall(3, "V", vector<Arg>({
Arg("BA", "string", "145"),
Arg("OT", "bool", "731"),
Arg("QA", "float", "921")
})),
SysCall(4, "ST", vector<Arg>({
Arg("A", "string", "45"),
Arg("O", "string", "71"),
Arg("Q", "double", "21")
})),
SysCall(5, "OP", vector<Arg>({
Arg("B", "string", "15"),
Arg("OGT", "bool", "731"),
Arg("QFA", "float", "921")
}))
});
}
void ShowAll()
{
for (SysCall c : Calls)
{
cout << c.toString() << "\n";
}
}
void Call(int id, Stack<Arg> stack)
{
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:" << endl;
for (auto it : Calls)
{
if (it.ID == id)
{
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> " << it.Name << endl;
for (auto arg : it.Args)
{
if (stack.isEmpty())
{
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ERROR" << endl;
return;
}
Arg a = stack.Pop();
if (arg.Type != a.Type)
{
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Error \t <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " << it.Name << endl; return;
}
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " << a.Type << " <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: " << a.Value << endl;
}
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" << endl; return;
}
}
cout << "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID Error" << endl;
return;
}
};
int main1()
{
setlocale(LC_ALL, "Russian");
Kernel k;
endll;
Stack<Arg> S1;
S1.Add(Arg("AB", "int"));
k.Call(1, S1);
endll;
Stack<Arg> S3;
S3.Add(Arg("QA", "float", "921"));
S3.Add(Arg("OT", "bool", "731"));
S3.Add(Arg("BA", "string", "145"));
k.Call(3, S3);
endll;
Stack<Arg> S2;
S2.Add(Arg("QA", "float", "921"));
S2.Add(Arg("OT", "bool", "731"));
S2.Add(Arg("BA", "string", "145"));
k.Call(2, S2);
endll;
Stack<Arg> S4;
k.Call(4, S4);
endll;
Stack<Arg> S5;
k.Call(8, S5);
return 0;
}