Skip to content

Instantly share code, notes, and snippets.

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