Last active
August 29, 2015 14:22
-
-
Save MisterTimur/f8a7c0657b91b7d2afdf to your computer and use it in GitHub Desktop.
programming 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
/* | |
* To change this license header, choose License Headers in Project Properties. | |
* To change this template file, choose Tools | Templates | |
* and open the template in the editor. | |
*/ | |
package atr; | |
/* author Abdulov Timur Rifovich 2015 | |
// Site https://sites.google.com/site/timpascallib/atr */ | |
public class ATR { | |
static String Pro; // Текст программы | |
static int Poi; // Указатель на читаемый символ в программе | |
static int Len; // Len Program Длина программы | |
static String Co; // Consol Консоль | |
static String Znak; // Знаки | |
static String LN; // | |
static byte Ti_Ope = 10;// Word Оператор | |
static byte Ti_Cif = 20;// Number Цифра | |
static byte Ti_Zna = 30;// +-*/ ..... Знак ОДинарный например = + - / , | |
static byte 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.charAt(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.charAt(F) == C) NS++; | |
else | |
if (NS == N) Rez = Rez + S.charAt(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).equals(S)) Rez = NS; else NS++; | |
return Rez; | |
} | |
static public boolean EtoCif(String S)/*Проверяет цифра ли это */{ | |
/* checks whether the string number | |
проверяет является ли строка числом*/ | |
boolean Rez = true; | |
int F; | |
for (F=0;F<S.length();F++) | |
if ( ((S.charAt(F)<'0') || (S.charAt(F)>'9')) && (S.charAt(F) != '.')) Rez=false; | |
return Rez; | |
} | |
static public String FloatToStr(float i)/*ПРеобразует число в строку*/{ | |
String str = Float.toString(i); | |
return str; | |
} | |
static public float StrToFloat(String s)/*ПРеобразует Строку в число */{ | |
return new Float(s); | |
} | |
/* 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 = new String(); | |
Rez = ""; | |
while ((Poi < Len) && ((Pro.charAt(Poi) >= s1) && (Pro.charAt(Poi) <= s2))) | |
{ | |
Rez = Rez+(Pro.charAt(Poi)); | |
Poi++; | |
} | |
return Rez; | |
} | |
static public String ReadKav()/* Читает строку в кавычках ' из строки если не удаеться возвращает пустую строку*/{ | |
String Rez = new String(); | |
Rez = ""; | |
if ((Poi < Len) && (Pro.charAt(Poi)=='"')) | |
{ | |
Poi++; | |
while ((Poi<=Len) && (Pro.charAt(Poi)!='"')) | |
{ | |
Rez=Rez+(Pro.charAt(Poi)); | |
Poi++; | |
} | |
Poi++; | |
} | |
return Rez; | |
}; | |
static public String ReadZna(String Z, char C)/* Читает одинарный знак из строки в случае неудачи возвращает пустую строку*/{ | |
/* This function reads + - * / { } ( ) from programm string PRO | |
Эта функция читает знаки из текста программы */ | |
String Rez=new String(); | |
Rez = ""; | |
int NS = 1; | |
int WC = WordC(Z, C); | |
while (("".equals(Rez)) && (NS <= WC)) | |
{ | |
Rez=WordN(Z, ',', NS); | |
for (int f = 0; f < Rez.length(); f++) | |
if (Rez.charAt(f) != Pro.charAt(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 = new String(); | |
Rez=""; | |
char l=(char)13; | |
if ((Poi<=(Len-1)) && (Pro.charAt(Poi)=='/') && (Pro.charAt(Poi+1) == '/')) | |
{ | |
Rez = Rez+Pro.charAt(Poi);Poi++;Poi++; | |
while ((Poi<=Len-1) && (Pro.charAt(Poi)!=l) ) | |
{Rez = Rez+Pro.charAt(Poi);Poi++;} | |
Poi++; | |
} | |
return Rez; | |
} | |
static public class TEl { | |
Byte Tip = 0; // Тип Элемента Type Element Ti_Ope,Ti_Cif,Ti_Zna Ti_Kav | |
boolean Fun = false;// Если это Функция if the Function true | |
String Nam = "";// Наименование элемента | |
String Zna = "";// Значение | |
TEl Rod = null; // Родительский элемент Parent Element | |
TEl Pre = null; // предыдущий эллемент Prew element | |
TEl Nex = null; // Следующий элемент | |
TEl Blo = null; // Вложеный елемент | |
public 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; | |
} | |
public void Cle()/*Clear Elements and children elemens Очищает элемент*/ { | |
TEl l2 = Blo; | |
while (l2 != null) | |
{ | |
TEl l=l2; | |
l.Cle(); | |
l2=l.Nex; | |
} | |
} | |
public TEl Lst()/*Функция находит последний элемент в списке*/ { | |
/*Find Last Element находит последний элемент */ | |
TEl Rez = Blo; // ОТкрывем первый элемент в списке | |
if (Rez != null) // Двигаемся в конец списка через цикл | |
while (Rez.Nex != null ) | |
Rez = Rez.Nex; | |
return Rez; | |
} | |
public 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; // указываем родителя | |
} | |
public boolean AddS(String S, byte T) /*Создает и Добавляет едемент в конец списка}*/ { | |
// Create and add element to end Создает и добавляет элеемнт | |
boolean Rez = false; | |
if (!"".equals(S)) { | |
TEl E = new TEl(); | |
E.Fun = false; | |
E.Nam = S; | |
E.Zna = S; | |
E.Tip = T; | |
Add(E); | |
Rez = true; | |
} | |
return Rez; | |
} | |
public 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 ("".equals(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++; | |
} | |
} | |
public TEl FinFunc(String N)/* Ищит элемент N вверх по иирархии*/{ | |
// Fund word function Ищит Функцию слово | |
TEl Rez = null; | |
TEl L ; | |
if ((Fun == true) && (Nam.equals(N))) Rez = this; | |
// поиск в предыдущих элементах списка | |
L = Pre; | |
while ((L != null) && (Rez == null)) | |
{ | |
if ((L.Tip==Ti_Ope) && | |
(L.Fun == true) && | |
(L.Nam.equals(N))) Rez = L; | |
L=L.Pre; | |
} | |
// ПОиск внутри параметрова | |
if ((Rez==null) && | |
(Rod!=null) && | |
(Rod.Fun == true) && | |
(Rod.Blo.Nam.charAt(0)=='(')&& | |
(Rod.Blo.Blo != null)) | |
{ | |
L=Rod.Blo.Blo; | |
while ((Rez == null) && (L != null)) | |
{ | |
if (L.Nam.equals(N)) Rez = L; | |
L=L.Nex; | |
} | |
} | |
// Продолжим поиск функции в родительском элементе | |
if ((Rez == null) && (Rod != null)) Rez = Rod.FinFunc(N); | |
return Rez; | |
} | |
public void Sco()/* Выполняет скобку */{ | |
String Rez = new String(); | |
TEl L = Blo; | |
while (L != null) | |
{ | |
L.TRun(); | |
Rez = Rez+L.Zna; | |
L = L.Nex; | |
} | |
Zna = Rez; | |
} | |
public 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"; | |
} | |
} | |
public void Mat()/* Выполняет сложение */ { | |
if ((Blo!=null) && (Blo.Nex!=null)) | |
{ | |
Blo.TRun(); | |
Blo.Nex.TRun(); | |
if (EtoCif(Blo.Zna) && EtoCif(Blo.Nex.Zna)) | |
{ | |
if ("+".equals(Nam)) Zna = FloatToStr(StrToFloat(Blo.Zna)+StrToFloat(Blo.Nex.Zna)); else | |
if ("-".equals(Nam)) Zna = FloatToStr(StrToFloat(Blo.Zna)-StrToFloat(Blo.Nex.Zna)); else | |
if ("*".equals(Nam)) Zna = FloatToStr(StrToFloat(Blo.Zna)*StrToFloat(Blo.Nex.Zna)); else | |
if ("/".equals(Nam)) Zna = FloatToStr(StrToFloat(Blo.Zna)/StrToFloat(Blo.Nex.Zna)); else | |
if ("&&".equals(Nam)) Zna = FloatToStr(StrToFloat(Blo.Zna)*StrToFloat(Blo.Nex.Zna)); else | |
if ("||".equals(Nam)) {if ((StrToFloat(Blo.Zna) == 1) || (StrToFloat(Blo.Nex.Zna) == 1)) Zna="1"; else Zna="0";} else | |
if (">".equals(Nam)) {if (StrToFloat(Blo.Zna) > StrToFloat(Blo.Nex.Zna)) Zna="1"; else Zna="0";} else | |
if ("<".equals(Nam)) {if (StrToFloat(Blo.Zna) < StrToFloat(Blo.Nex.Zna)) Zna="1"; else Zna="0";} | |
} | |
else | |
if ("+".equals(Nam) ) { Zna=Blo.Zna + Blo.Nex.Zna;} else | |
if ("=".equals(Nam) ) { if (Blo.Zna.compareTo(Blo.Nex.Zna)==0) Zna = "1" ; else Zna = "0";} else | |
if (">".equals(Nam) ) { if (Blo.Zna.compareTo(Blo.Nex.Zna)>0) Zna = "1" ; else Zna = "0";} else | |
if ("<".equals(Nam) ) { if (Blo.Zna.compareTo(Blo.Nex.Zna)<0) Zna = "1" ; else Zna = "0";} | |
} | |
} | |
public void Pri()/* Операция присваивания значения*/ { | |
if ((Blo!=null) && (Blo.Nex!=null)) | |
{ | |
Blo.Nex.TRun(); | |
TEl F = FinFunc(Blo.Nam); | |
if (F != null) F.Zna=Blo.Nex.Zna; | |
} | |
} | |
public void IFF()/* IF Условиме */ { | |
if ((Blo != null) && (Blo.Nex != null)) | |
{ | |
Blo.Nex.TRuns(); | |
if ("1".equals(Blo.Zna)) Blo.Nex.TRun(); | |
} | |
} | |
public void WHI()/* While Цикл пока */{ | |
if ((Blo!=null) && (Blo.Nex!=null)) | |
{ | |
Blo.TRun(); | |
while ("1".equals(Blo.Zna)) | |
{ | |
Blo.Nex.TRun(); | |
Blo.TRun(); | |
} | |
} | |
} | |
public void TRun() /* Выполняет 1 команду */{ | |
if ("*".equals(Nam) ) Mat(); else | |
if ("/".equals(Nam) ) Mat(); else | |
if ("+".equals(Nam) ) Mat(); else | |
if ("-".equals(Nam) ) Mat(); else | |
if (">".equals(Nam) ) Mat(); else | |
if ("<".equals(Nam) ) Mat(); else | |
if ("&".equals(Nam) ) Mat(); else | |
if ("|".equals(Nam) ) Mat(); else | |
if ("=".equals(Nam) ) Mat(); else | |
//-------------------------------------------------------- | |
if (":=".equals(Nam) ) Pri(); else | |
if ("PRINT".equals(Nam) ) Con(); else | |
if ("IFF".equals(Nam) ) IFF(); else | |
if ("WHILE".equals(Nam) ) WHI(); else | |
if ("(".equals(Nam) ) Sco(); else | |
if ("{".equals(Nam) ) TRuns();else | |
if (Tip==Ti_Ope ) RunFunc(); | |
} | |
public void TRuns()/* Выполняет список Комманд */{ | |
TEl Uka = Blo; | |
while (Uka != null) | |
{ | |
if ((Uka.Fun != true )|| // This Not Function Это не описание функции | |
("WHILE".equals(Uka.Nam))|| // This WHILE или это цикл WHILE это не функция но похоже | |
("IF".equals(Uka.Nam) )) // This IF или это условие IF это не функция но похоже | |
Uka.TRun(); | |
Uka = Uka.Nex; | |
} | |
} | |
public void RunFunc()/* Пытаеться выполнить елемент */ { | |
TEl F; | |
TEl Ru; | |
F = FinFunc(Nam); // Ищим функцию | |
if (F != null) | |
{// если такая функция существует | |
Ru = F.Cop(Rod,Pre); // Создаем копию функции | |
Blo.TRun(); // Вычисляем параметры | |
TEl L1 = Ru.Blo.Blo; | |
TEl 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 View(String S)/* ПРосмотр элемента */ { | |
TEl L = Blo; | |
while (L != null) | |
{ | |
System.out.println(S+L.Nam+" "+S+L.Zna); | |
if (L.Blo != null) L.View(S+" "); | |
L = L.Nex; | |
} | |
} | |
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.equals(s2)) ) Kon.Add(Uka);// Добавляем в контенер | |
if (Uka.Nam.equals(s1)) Kon=Uka; // Контенер | |
if (Uka.Nam.equals(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.equals(c))) | |
{ | |
if ("{".equals(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 (Z.indexOf(L.Nam.charAt(0))!=-1) | |
if ((L.Pre!=null) && (L.Nex!=null)) | |
{ | |
L.Nex.CompileMa(Z); | |
L.Add(L.Pre); | |
L.Add(L.Nex); | |
} | |
L = L.Nex; | |
} | |
} | |
} | |
public static void main(String[] args) { | |
LN = new String(); | |
LN = LN+((char)13)+((char)10); | |
Pro = new String(); | |
Co = new String(); | |
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); "+LN).toUpperCase(); | |
TEl Prog; | |
Prog = new TEl(); | |
Prog.Nam=("PROG"); | |
Znak="+-*/=(){}|&:<>"; | |
Poi=0; | |
Len=Pro.length(); | |
Prog.ProgRead(); | |
//Prog.View(""); | |
Prog.CompileSc("(",")"); | |
Prog.CompileSc("{","}"); | |
Prog.CompileBL("("); | |
Prog.CompileBL("{"); | |
Prog.CompileMa("*,/"); | |
Prog.CompileMa("+,-"); | |
Prog.CompileMa(">,<,||,&&,=,"); | |
Prog.CompileMa(":="); | |
Prog.TRuns(); | |
System.out.println(Co); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment