Skip to content

Instantly share code, notes, and snippets.

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