Last active
August 29, 2015 14:22
-
-
Save MisterTimur/7e35b4008c615fe9f515 to your computer and use it in GitHub Desktop.
programming language ATR
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ATR.cpp : Defines the entry point for the console application. | |
// AbdUlov Timur Rifovich 2015 programming language ATR | |
// https://sites.google.com/site/timpascallib/atr | |
#include "stdafx.h" | |
#include <iostream> | |
#include <string> | |
using namespace std; | |
string LN; | |
string Pro ;// Тект программы Text Programm | |
string Co;// Consol Консолька | |
int Poi ;// Указатель на читаемый символ Pointer to read char | |
int Len ;// Длина текста программы Length programm | |
int Ti_Ope = 10; // Оператор Command Word | |
int Ti_Cif = 20; // Цифра Number | |
int Ti_Zna = 30; // Знак ОДинарный например = + - / , | |
int Ti_Kav = 40; // В кавычках "" | |
int WordC (string S, char C) // Count Word The C Separator Количество слов в строке s с разделитем c | |
{ | |
int Rez = 0; | |
if (S.length() != 0) | |
{ | |
Rez = 1; | |
for (unsigned int i = 0; i < S.length(); i++) | |
if (S[i] == C) Rez++; | |
} | |
return Rez; | |
} | |
string WordN (string S, char C,int N) // Возвращает слово номер N из строки S с разделителем C | |
{ // Count Word The C Separator Количество слов в строке s с разделитем c | |
string Rez = string(); | |
Rez = ""; | |
int LS = S.length(); | |
int NS = 1; | |
int F = 0; | |
while ((F < LS) && (NS <= N)) | |
{ | |
if (S[F] == C) NS++; else | |
if (NS == N) Rez = Rez + S[F]; | |
F++; | |
} | |
return Rez; | |
} | |
int InStr (string S, string Z, char C )// Ищит строку Z в строке S С разделителем C возвращает номер слова в списке если слова нету 0 | |
{// Find String Z in string S Separator C return Number Pos | |
int WC = WordC(Z, C); | |
int Rez=0; | |
int NS = 0; | |
while ((Rez == 0) && (NS <= WC)) | |
if (WordN(Z, C, NS) == S) Rez = NS; else NS++; | |
return Rez; | |
} | |
bool EtoCif(string S)/*Проверяет цифра ли это */{ | |
/* checks whether the string number | |
проверяет является ли строка числом*/ | |
bool Rez = true; | |
for (unsigned int z = 0; z < S.length(); z++) | |
if (((S[z]<'0') || (S[z]>'9')) && (S[z] != '.')) Rez = false; | |
return Rez; | |
} | |
/* if it does not return an empty string | |
если это не являеться возвращает пустую строку */ | |
string ReadOpe(char s1, char s2)/* Читает оператор из строки*/{ | |
/* This function reads word Commando from programm string PRO | |
Эта функция читает оператор слова из строки с программой Pro */ | |
string Rez = string(); | |
Rez = ""; | |
while ((Poi < Len) && ((Pro[Poi] >= s1) && (Pro[Poi] <= s2))) | |
{ | |
Rez = Rez + (Pro[Poi]); | |
Poi++; | |
} | |
return Rez; | |
} | |
string ReadKav()/* Читает строку в кавычках " из строки если не удаеться возвращает пустую строку*/{ | |
/* This function reads "TEXT" from programm string PRO | |
Эта функция читает то что содержиться в кавычках в тексте программы */ | |
string Rez = string(); | |
Rez = ""; | |
if ((Poi < Len) && (Pro[Poi] == '"')) | |
{ | |
Poi++; | |
while ((Poi <= Len) && (Pro[Poi] != '"')) | |
{ | |
Rez = Rez + Pro[Poi]; | |
Poi++; | |
} | |
Poi++; | |
} | |
return Rez; | |
}; | |
string ReadZna(string Z,char C)/* Читает знак из строки в случае неудачи возвращает пустую строку*/{ | |
/* This function reads + - * / { } ( ) from programm string PRO | |
Эта функция читает знаки из текста программы */ | |
string Rez = string(); | |
Rez = ""; | |
int NS = 1; | |
int WC = WordC(Z, C); | |
while ((Rez=="") && (NS <= WC)) | |
{ | |
Rez=WordN(Z, ',', NS); | |
for (unsigned int f = 0; f < Rez.length(); f++) | |
if (Rez[f] != Pro[f + Poi]) Rez = ""; | |
NS++; | |
} | |
Poi = Poi + Rez.length(); | |
return Rez; | |
} | |
string ReadRem()/* Read Comments Читает Комментарии*/ | |
{ | |
/*This function reads Comments from programm string PRO | |
Эта функция читает комментарии в тексте программы */ | |
string Rez = string(); | |
Rez = ""; | |
if ((Poi <= Len - 1) && (Pro[Poi] == '/') && (Pro[Poi + 1] == '/')) | |
{ | |
Rez = Rez + (Pro[Poi]); Poi++; Poi++; | |
while ((Poi <= Len - 1) && (Pro[Poi] != 13)) | |
{Rez = Rez + Pro[Poi];Poi++;} | |
Poi++; | |
} | |
return Rez; | |
} | |
class TEl{ | |
public: | |
int Tip; // Тип Элемента Type Element Ti_Ope,Ti_Cif,Ti_Zna Ti_Kav | |
bool Fun; // Если это Функция if the Function true | |
string Nam; // Наименование элемента | |
string Zna; // Значение Value the Elements | |
TEl* Rod; // Родительский элемент Parent Element | |
TEl* Pre; // предыдущий эллемент Prew element | |
TEl* Nex; // Следующий элемент Next element | |
TEl* Blo; // Вложеный елемент The Children First E;ements | |
void Del()/*Функция не разрушает элемент а просто выдергивает из списка*/{ | |
/*// The function does not destroy the item and simply pulls out from the list | |
Функция не разрушает элемент а просто выдергивает из списка */ | |
TEl* Ne = Nex; | |
TEl* Pr = Pre; // Запоминаем предыдущий и следующий элемент | |
if (Pre != NULL) Pre->Nex = Ne;// Ставим в предыдущем элементе следующий элемент | |
if (Nex != NULL) Nex->Pre = Pr;// Ставим в следующем элементе предыдущий | |
if ((Rod != NULL) && (Rod->Blo == this)) Rod->Blo = Ne;// Если в родительском элементе мы первые | |
Nex = NULL; | |
Pre = NULL; | |
Rod = NULL; | |
} | |
void Cle()/*Clear element and children element Очищает элемент и дочернии элементы */ { | |
TEl* l2 = Blo; | |
while (l2 != NULL) | |
{ | |
TEl* l = l2; | |
l->Cle(); | |
l2 = l->Nex; | |
} | |
} | |
TEl* Lst()/*Функция находит последний элемент в списке*/ { | |
/*Find Last Element находит последний элемент */ | |
TEl* Rez = Blo; // ОТкрывем первый элемент в списке | |
if (Rez != NULL) // Двигаемся в конец списка через цикл | |
while (Rez->Nex != NULL) | |
Rez = Rez->Nex; | |
return Rez; | |
} | |
void Add(TEl* El)/*Добавляет едемент в конец списка*/{ | |
// add element to end Добавляет едемент в конец списка | |
El->Del(); // Удаляем элемент из предыдущего списка | |
El->Pre = Lst(); // ПРисоеденяем к последнему элементу новго списка | |
if (Lst() != NULL) | |
{ | |
El->Pre = Lst(); | |
Lst()->Nex = El; | |
} | |
else Blo = El; // если это первый элемент ставим его первым | |
El->Rod = this; // указываем родителя | |
} | |
bool AddS(string S, int T) /*Создает и Добавляет едемент в конец списка}*/ { | |
// Create and add element to end Создает и добавляет элеемнт | |
bool Rez = false; | |
if (S != "") { | |
TEl* E = new TEl(); | |
E->Fun = false; | |
E->Nam = S; | |
E->Zna = S; | |
E->Tip = T; | |
Add(E); | |
Rez = true; | |
} | |
return Rez; | |
} | |
TEl* Cop(TEl* iRod, TEl* iPre) /* Копирует элемент*/{ | |
// Copy Element and child elem Создает копию элемента с дочерними элементами | |
TEl* Rez = new TEl();// Создаем новый элемент | |
Rez->Nam = Nam; // И копируем всек значения | |
Rez->Zna = Zna; | |
Rez->Tip = Tip; | |
Rez->Fun = Fun; | |
Rez->Rod = iRod; | |
Rez->Pre = iPre; // устанавливаем предыдущий элемент в новом элементе | |
Rez->Nex = NULL; | |
Rez->Blo = NULL; | |
//================================ | |
if (Blo != NULL) | |
{ | |
Rez->Blo = Blo->Cop(Rez, NULL); // Копируем первый элемент | |
TEl* Ne = Blo->Nex;// читаем следующий ВЛОЖЕНЫЙ ! элемент | |
TEl* Pr = Rez->Blo;// Запоминаем предыдущий элемент | |
while (Ne != NULL) | |
{ | |
Pr->Nex = Ne->Cop(Rez, Pr);// Копируем Следующий элемент | |
Ne = Ne->Nex; // Перемещаемся к следующему элементу | |
Pr = Pr->Nex; // назначем предыдущй элемент следующего элемента | |
} | |
} | |
return Rez; | |
} | |
void ProgRead()/* Разбивает строку на слова*/{ | |
// Read programm from Pro Читает программы разбивает на слова | |
Poi = 0; | |
Len = Pro.length(); | |
while (Poi<Len) | |
if (ReadRem() == "") | |
if (AddS(ReadOpe('A', 'Z'), Ti_Ope) == false) | |
if (AddS(ReadOpe('0', '9'), Ti_Cif) == false) | |
if (AddS(ReadKav(), Ti_Kav) == false) | |
if (AddS(ReadZna(":=",','), Ti_Zna) == false) | |
if (AddS(ReadZna("+,-,/,*,>,<,=,(,),{,}",','), Ti_Zna) == false) Poi++; | |
} | |
TEl* FinFunc(string N) /* Ищит элемент N вверх по иирархии*/{ | |
// Find word function Ищит Функцию слово | |
TEl* Rez = NULL; | |
TEl* L; | |
if ((Fun == true) && (Nam == N)) Rez = this; | |
// поиск в предыдущих элементах списка | |
L = Pre; | |
while ((L != NULL) && (Rez == NULL)) | |
{ | |
if ((L->Tip == Ti_Ope) && | |
(L->Fun == true) && | |
(L->Nam == N)) Rez = L; | |
L = L->Pre; | |
} | |
// ПОиск внутри параметрова | |
if ((Rez == NULL) && | |
(Rod != NULL) && | |
(Rod->Fun == true) && | |
(Rod->Blo->Nam == "(") && | |
(Rod->Blo->Blo != NULL)) | |
{ | |
L = Rod->Blo->Blo; | |
while ((Rez == NULL) && (L != NULL)) | |
{ | |
if (L->Nam == N) Rez = L; | |
L = L->Nex; | |
} | |
} | |
// Продолжим поиск функции в родительском элементе | |
if ((Rez == NULL) && (Rod != NULL)) Rez = Rod->FinFunc(N); | |
return Rez; | |
} | |
void Sco()/* Выполняет скобку */{ | |
string Rez = string(); | |
TEl* L = Blo; | |
while (L != NULL) | |
{ | |
L->TRun(); | |
Rez = Rez + L->Zna; | |
L = L->Nex; | |
} | |
Zna = Rez; | |
} | |
void Con()/* Выполняет PRINT*/{ | |
if (Blo != NULL) | |
{ | |
TEl* L = Blo->Blo; | |
while (L != NULL) | |
{ | |
L->TRun(); | |
Co = Co + L->Zna; | |
L = L->Nex; | |
} | |
Co = Co + "\n"; | |
} | |
} | |
void Mat()/* Выполняет сложение */ { | |
if ((Blo != NULL) && (Blo->Nex != NULL)) | |
{ | |
Blo->TRun(); | |
Blo->Nex->TRun(); | |
if (EtoCif(Blo->Zna) && EtoCif(Blo->Nex->Zna)) | |
{// For Number Операции для обработки чисел | |
if (Nam == "+") Zna = to_string((stoi(Blo->Zna) + stoi(Blo->Nex->Zna))); else | |
if (Nam == "-") Zna = to_string(stoi(Blo->Zna) - stoi(Blo->Nex->Zna)); else | |
if (Nam == "*") Zna = to_string(stoi(Blo->Zna)*stoi(Blo->Nex->Zna)); else | |
if (Nam == "/") Zna = to_string(stoi(Blo->Zna) / stoi(Blo->Nex->Zna)); else | |
if (Nam == "&&") Zna = to_string(stoi(Blo->Zna)*stoi(Blo->Nex->Zna)); else | |
if (Nam == "||") { if ((stoi(Blo->Zna) == 1) || (stoi(Blo->Nex->Zna) == 1)) Zna = "1"; else Zna = "0"; }else | |
if (Nam == ">") { if (stoi(Blo->Zna) > stoi(Blo->Nex->Zna)) Zna = "1"; else Zna = "0"; }else | |
if (Nam == "<") { if (stoi(Blo->Zna) < stoi(Blo->Nex->Zna)) Zna = "1"; else Zna = "0"; }; | |
} else // For String Операции для обработки строк | |
if (Nam == "+") Zna = Blo->Zna + Blo->Nex->Zna; else | |
if (Nam == "=") { if (Blo->Zna == Blo->Nex->Zna) Zna = "1"; else Zna = "0"; }else | |
if (Nam == ">") { if (Blo->Zna > Blo->Nex->Zna) Zna = "1"; else Zna = "0"; }else | |
if (Nam == "<") { if (Blo->Zna < Blo->Nex->Zna) Zna = "1"; else Zna = "0"; }; | |
} | |
} | |
void Pri()/* Операция присваивания значения*/ { | |
if ((Blo != NULL) && (Blo->Nex != NULL)) | |
{ | |
Blo->Nex->TRun(); | |
TEl* F = FinFunc(Blo->Nam); | |
if (F != NULL) F->Zna = Blo->Nex->Zna; | |
} | |
} | |
void Iff()/* IF Условиме */ { | |
if ((Blo != NULL) && (Blo->Nex != NULL)) | |
{ | |
Blo->Nex->TRuns(); | |
if (Blo->Zna == "1") Blo->Nex->TRuns(); | |
} | |
} | |
void Whi()/* While Цикл пока */{ | |
if ((Blo != NULL) && (Blo->Nex != NULL)) | |
{ | |
Blo->TRun(); | |
while (Blo->Zna == "1") | |
{ | |
Blo->Nex->TRun(); | |
Blo->TRun(); | |
} | |
} | |
} | |
void TRun() /* Выполняет 1 команду */{ | |
if (Nam == "*") Mat(); else | |
if (Nam == "/") Mat(); else | |
if (Nam =="+") Mat(); else | |
if (Nam == "-") Mat(); else | |
if (Nam == ">") Mat(); else | |
if (Nam == "<") Mat(); else | |
if (Nam == "&&") Mat(); else | |
if (Nam == "||") Mat(); else | |
if (Nam == "=") Mat(); else | |
if (Nam == ":=") Pri(); else | |
if (Nam == "PRINT") Con(); else | |
if (Nam == "WHILE") Whi(); else | |
if (Nam == "IF") Iff(); else | |
if (Nam == "(") Sco(); else | |
if (Nam == "{") TRuns(); else | |
if (Tip == Ti_Ope) RunFunc(); | |
} | |
void TRuns()/* Выполняет список Комманд */{ | |
TEl* Uka = Blo; | |
while (Uka != NULL) | |
{ | |
if ((Uka->Fun == false) || | |
(Uka->Nam == "WHILE") || | |
(Uka->Nam == "IF") ) Uka->TRun(); | |
Uka = Uka->Nex; | |
} | |
} | |
void RunFunc()/* Пытаеться выполнить елемент */ { | |
TEl* F; | |
TEl* Ru; | |
TEl* L1; | |
TEl* L2; | |
F = FinFunc(Nam); // Ищим функцию | |
if (F != NULL) | |
{// если такая функция существует | |
Ru = F->Cop(Rod, Pre); // Создаем копию функции | |
Blo->TRun(); // Вычисляем параметры | |
L1 = Ru->Blo->Blo; | |
L2 = Blo->Blo;// Копируем параметры ================================================================== | |
while ((L1 != NULL) && (L2 != NULL)) | |
{ | |
L1->Zna = L2->Zna; | |
L1 = L1->Nex; | |
L2 = L2->Nex; | |
} | |
Ru->Blo->Nex->TRun();// Выполняем функцию | |
Zna = Ru->Zna; // Возвращаем значение | |
Ru->Cle(); | |
} | |
} | |
void CompileSc(string s1, string s2)/* Чтение скобок*/ { | |
TEl* Ne; | |
TEl* Kon = this;// Контенер куда вкладываем элементы | |
TEl* Uka = Blo; // Первый анализируемый элемент | |
while (Uka != NULL) | |
{ | |
Ne = Uka->Nex; // запоминаем следующий элемент | |
if ((Kon != this) && (Uka->Nam != s2)) Kon->Add(Uka); // Добавляем в контенер | |
if (Uka->Nam == s1) Kon = Uka; // Контенер | |
if (Uka->Nam == s2) {Kon = Kon->Rod; Uka->Del(); } // Вернуться на уровень вверх | |
Uka = Ne; // Переходм к следующему элементу | |
} | |
} | |
void CompileBL(string b)/* Вложение Блоков {} () */{ | |
TEl* Uka = Blo; | |
while (Uka != NULL) | |
{ | |
if (Uka->Tip == Ti_Ope) | |
if ((Uka->Nex != NULL) && (Uka->Nex->Nam == b)) | |
{ | |
if (Uka->Nex->Nam=="{") Uka->Fun = true; | |
Uka->Add(Uka->Nex); | |
} | |
else Uka->AddS(b, Ti_Zna); | |
if (Uka->Blo != NULL) Uka->CompileBL(b); | |
Uka = Uka->Nex; | |
} | |
} | |
void CompileMa(string Z)/* Умножение деление */ { | |
TEl* L = Blo; | |
while (L != NULL) | |
{ | |
L->CompileMa(Z); | |
if (InStr(L->Nam,Z,',') != 0) | |
if ((L->Pre != NULL) && (L->Nex != NULL)) | |
{ | |
L->Nex->CompileMa(Z); | |
L->Add(L->Pre); | |
L->Add(L->Nex); | |
} | |
L = L->Nex; | |
} | |
} | |
void View(string S)/* ПРосмотр элемента */ { | |
TEl* L = Blo; | |
string TF = string(); | |
while (L != NULL) | |
{ | |
if (L->Fun==true) TF = " Function"; else TF = ""; | |
cout << S << L->Nam << TF << endl; | |
if (L->Blo != NULL) L->View(" "+S); | |
L = L->Nex; | |
} | |
} | |
}; | |
int _tmain(int argc, _TCHAR* argv[]) | |
{ | |
LN = ""; | |
LN =LN+ ((char)13) + ((char)10); | |
Pro = ( | |
"//EXAMPLE Object Programming PROGRAM In ATR language " + LN + | |
// Абстрактная переменная X Abstract X | |
" Left(a){x:=x-a;} " + LN + | |
" Obj(a){ " + LN + | |
" X(){};x:=10; // var x; Обьявленеи переменной " + LN + | |
" f(){};f:=0; " + LN + | |
" While (f<3) " + LN + | |
" { " + LN + | |
" Left(a); // Call Function Left Вызов функции LEft" + LN + | |
" f:=f+1; " + LN + | |
" } " + LN + | |
" Print(X); " + LN + | |
"' } " + LN + | |
" Obj(3); "); | |
Poi = 0; | |
Len = Pro.length(); | |
for (int i = 0; i<Len; i++) | |
Pro[i] = toupper(Pro[i]); | |
TEl* Prog; | |
Prog = new TEl(); | |
Prog->Nam = ("PROG"); | |
Poi = 0; | |
Len = Pro.length(); | |
Prog->ProgRead(); | |
Prog->CompileSc("(",")"); | |
Prog->CompileSc("{","}"); | |
Prog->CompileBL("("); | |
Prog->CompileBL("{"); | |
Prog->CompileMa("*,/"); //* / | |
Prog->CompileMa("+,-"); // + - | |
Prog->CompileMa(">,<,||,&&,<=,>=,!=,"); // < > = <= >= != | |
Prog->CompileMa(":="); // := | |
Prog->TRuns(); | |
//Prog->View(""); | |
cout << Co << endl;// Вывод текста программы в консоль | |
// Чтение с консоли | |
string s; | |
cin >> s; | |
cout << s << endl; | |
system("pause"); // пауза | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment