Skip to content

Instantly share code, notes, and snippets.

@MisterTimur
Last active August 29, 2015 14:22
Show Gist options
  • Save MisterTimur/7e35b4008c615fe9f515 to your computer and use it in GitHub Desktop.
Save MisterTimur/7e35b4008c615fe9f515 to your computer and use it in GitHub Desktop.
programming language ATR
// 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