Last active
August 29, 2015 14:22
-
-
Save MisterTimur/f2acbfb8262d979c71b8 to your computer and use it in GitHub Desktop.
ATR language
This file contains 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.CS : . | |
// AbdUlov Timur Rifovich 2015 programming language ATR | |
// https://sites.google.com/site/timpascallib/atr | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
namespace ATR | |
{ | |
class Program | |
{ | |
static string LN; | |
static string Pro; // Тект программы Text Programm | |
static string Co; // Consol Консолька | |
static int Poi; // Указатель на читаемый символ Pointer to read char | |
static int Len; // Длина текста программы Length programm | |
static int Ti_Ope = 10;// Оператор Command Word | |
static int Ti_Cif = 20;// Цифра Number | |
static int Ti_Zna = 30;// Знак ОДинарный например = + - / , | |
static int Ti_Kav = 40;// В кавычках "" | |
static public int WordC(string S, char C) // Count Word The C Separator Количество слов в строке s с разделитем c | |
{ | |
int Rez = 0; | |
if (S.Length != 0) | |
{ | |
Rez = 1; | |
for (int i = 0; i < S.Length; i++) | |
if (S[i] == C) Rez++; | |
} | |
return Rez; | |
} | |
static public string WordN(string S, char C, int N) // Возвращает слово номер N из строки S с разделителем C | |
{ // Count Word The C Separator Количество слов в строке s с разделитем c | |
string Rez; | |
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; | |
} | |
static public 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; | |
} | |
static public bool EtoCif(string S)/*Проверяет цифра ли это */{ | |
/* checks whether the string number | |
проверяет является ли строка числом*/ | |
bool Rez = true; | |
int F; | |
for (F = 0; F < S.Length; F++) | |
if (((S[F] < '0') || (S[F] > '9')) && (S[F] != '.')) Rez = false; | |
return Rez; | |
} | |
static public string FloatToStr(float i) | |
{ | |
string rez = Convert.ToString(i); | |
return rez; | |
} | |
static public float StrToFloat(string i) | |
{ | |
float rez = Convert.ToSingle(i); | |
return rez; | |
} | |
/* if it does not return an empty string | |
если это не являеться возвращает пустую строку */ | |
static public string ReadOpe(char s1, char s2)/* Читает оператор из строки*/{ | |
/* This function reads word Commando from programm string PRO | |
Эта функция читает оператор слова из строки с программой Pro */ | |
string Rez ; | |
Rez = ""; | |
while ((Poi < Len) && ((Pro[Poi] >= s1) && (Pro[Poi] <= s2))) | |
{ | |
Rez = Rez + (Pro[Poi]); | |
Poi++; | |
} | |
return Rez; | |
} | |
static public string ReadKav()/* Читает строку в кавычках ' из строки если не удаеться возвращает пустую строку*/{ | |
/* This function reads "TEXT" from programm string PRO | |
Эта функция читает то что содержиться в кавычках в тексте программы */ | |
string Rez; | |
Rez = ""; | |
if ((Poi < Len) && (Pro[Poi] == '"')) | |
{ | |
Poi++; | |
while ((Poi <= Len) && (Pro[Poi] != '"')) | |
{ | |
Rez = Rez + Pro[Poi]; | |
Poi++; | |
} | |
Poi++; | |
} | |
return Rez; | |
} | |
static public string ReadZna(string Z, char C)/* Читает одинарный знак из строки в случае неудачи возвращает пустую строку*/{ | |
/* This function reads + - * / { } ( ) from programm string PRO | |
Эта функция читает знаки из текста программы */ | |
string Rez; | |
Rez = ""; | |
int NS = 1; | |
int WC = WordC(Z, C); | |
while ((Rez=="") && (NS <= WC)) | |
{ | |
Rez=WordN(Z, ',', NS); | |
for (int f = 0; f < Rez.Length; f++) | |
if (Rez[f] != Pro[f + Poi]) Rez = ""; | |
NS++; | |
} | |
Poi = Poi + Rez.Length; | |
return Rez; | |
} | |
static public string ReadRem()/* Read Comments Читает Комментарии*/ | |
{ | |
/*This function reads Comments from programm string PRO | |
Эта функция читает комментарии в тексте программы */ | |
string Rez ; | |
Rez = "" ; | |
if ((Poi <= Len - 1) && (Pro[Poi] == '/') && (Pro[Poi + 1] == '/')) | |
{ | |
Rez = Rez + ( Pro[Poi]); | |
Poi++; | |
while ((Poi <= Len - 1) && (Pro[Poi] != 13)) Poi++; | |
Poi++; | |
} | |
return Rez; | |
} | |
class TEl | |
{ | |
int Tip; // Тип Элемента | |
bool Fun; // Если это Функция | |
public string Nam; // Наименование элемента | |
string Zna; // Значение | |
TEl Rod; // Родительский элемент | |
TEl Pre; // предыдущий эллемент | |
TEl Nex; // Следующий элемент | |
TEl Blo; // Вложеный елемент | |
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 Elements and children elemens Очищает элемент*/ { | |
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.Substring(0,S.Length); | |
E.Zna = S.Substring(0,S.Length); | |
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; | |
} | |
public 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) Poi++; | |
} | |
TEl FinFunc(string N) /* Ищит элемент N вверх по иирархии*/{ | |
// Fund 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[0] == '(') && | |
(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()/* Выполняет скобку */{ | |
TEl L = Blo; | |
Zna = ""; | |
while (L != null) | |
{ | |
L.TRun(); | |
Zna = Zna + L.Zna; | |
L = L.Nex; | |
} | |
} | |
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)) | |
{ | |
if (Nam == "+") Zna = FloatToStr(StrToFloat(Blo.Zna) + StrToFloat(Blo.Nex.Zna)); | |
else | |
if (Nam == "-") Zna = Convert.ToString(Convert.ToSingle(Blo.Zna) - Convert.ToSingle(Blo.Nex.Zna)); | |
else | |
if (Nam == "*") Zna = Convert.ToString(Convert.ToSingle(Blo.Zna) * Convert.ToSingle(Blo.Nex.Zna)); | |
else | |
if (Nam == "/") Zna = Convert.ToString(Convert.ToSingle(Blo.Zna) / Convert.ToSingle(Blo.Nex.Zna)); | |
else | |
if (Nam == "&&") Zna = Convert.ToString(Convert.ToSingle(Blo.Zna) * Convert.ToSingle(Blo.Nex.Zna)); | |
else | |
if (Nam == "||") { if ((Convert.ToSingle(Blo.Zna) == 1) || (Convert.ToSingle(Blo.Nex.Zna) == 1)) Zna = "1"; else Zna = "0"; } | |
else | |
if (Nam == ">") { if (Convert.ToSingle(Blo.Zna) > Convert.ToSingle(Blo.Nex.Zna)) Zna = "1"; else Zna = "0"; } | |
else | |
if (Nam == "<") { if (Convert.ToSingle(Blo.Zna) < Convert.ToSingle(Blo.Nex.Zna)) Zna = "1"; else Zna = "0"; }; | |
} | |
else | |
if (Nam == "+") Zna = Blo.Zna + Blo.Nex.Zna; | |
else | |
if (Nam == "=") { if (String.Compare(Blo.Zna, Blo.Nex.Zna, true) == 0) Zna = "1"; else Zna = "0"; } | |
else | |
if (Nam == ">") { if (String.Compare(Blo.Zna, Blo.Nex.Zna, true) > 0) Zna = "1"; else Zna = "0"; } | |
else | |
if (Nam == "<") { if (String.Compare(Blo.Zna, Blo.Nex.Zna, true) < 0) 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.TRun(); | |
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 == "WHILE") Whi(); | |
else | |
if (Nam == "PRINT") Con(); | |
else | |
if (Nam == "(") Sco(); | |
else | |
if (Nam == "{") TRuns(); | |
else | |
if (Tip == Ti_Ope) RunFunc(); | |
} | |
public void TRuns()/* Выполняет список Комманд */{ | |
TEl Uka = Blo; | |
while (Uka != null) | |
{ | |
if ((Uka.Fun != true) || | |
(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(); | |
} | |
} | |
public 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; // Переходм к следующему элементу | |
} | |
} | |
public void CompileBL(string c)/* Вложение Блоков {} () */{ | |
TEl Uka = Blo; | |
while (Uka != null) | |
{ | |
if (Uka.Tip == Ti_Ope) | |
if ((Uka.Nex != null) && (Uka.Nex.Nam == c)) | |
{ | |
if (c == "{") Uka.Fun = true; | |
Uka.Add(Uka.Nex); | |
} | |
else Uka.AddS(c + "", Ti_Zna); | |
if (Uka.Blo != null) Uka.CompileBL(c); | |
Uka = Uka.Nex; | |
} | |
} | |
public 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; | |
} | |
} | |
public void View(string S)/* ПРосмотр элемента */ { | |
TEl L = Blo; | |
while (L != null) | |
{ | |
Console.Write(S+L.Nam+LN); | |
if (L.Blo != null) L.View(S + ' '); | |
L = L.Nex; | |
} | |
} | |
}; | |
static void Main(string[] args) | |
{ | |
Pro = "Summa(a,b){Summa=a+b};Print(Summa(3,5));"; | |
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); ") ; | |
Pro = Pro.ToUpper();// Перекводит строку в верхний регистр | |
Poi = 0; | |
Len = Pro.Length; | |
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(""); | |
Console.Write(Co); | |
// Чтение с консоли | |
string name = Console.ReadLine(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment