Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package sqript.engine;
- import java.util.Arrays;
- import java.util.HashMap;
- import javax.swing.JOptionPane;
- public abstract class Function {
- private static final HashMap<String, Function> functions = new HashMap<String, Function>();
- public static final String NULL = "NULL",
- TRUE = "TRUE",
- FALSE = "FALSE";
- private String name;
- public Function(String name) {
- this.name = name;
- }
- public abstract String execute(String[] args, Sqript sc, Sqript parent);
- public static String run(String line, Sqript sc, Sqript parent) {
- String name = line.substring(0, line.indexOf("("));
- String[] args = Operations.splitArgs(line.substring(line.indexOf("(") + 1, line.lastIndexOf(")")), ';');
- for(int i = 0 ; i < args.length ; i++)
- if(args[i].contains("(") && args[i].contains(")")) {
- args[i] = run(args[i], null, parent);
- }
- try {
- return Function.getFunction(name).execute(args, sc, parent);
- } catch(NullPointerException ex) {
- System.out.println("Function " + name + " isn't declarated.");
- return NULL;
- } catch(NumberFormatException ex) {
- System.out.println("Number error in line:\n\t" + line);
- return NULL;
- }
- }
- public static Function getFunction(String name) {
- try {
- return functions.get(name);
- } catch (Exception e) {
- return null;
- }
- }
- public String getName() {
- return name;
- }
- public static void registerFunction(Function f) {
- functions.put(f.name, f);
- }
- public static void init() {
- registerFunction(new Function("Output.println") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 1) {
- System.out.println(args[0]);
- return TRUE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("Input.readLine") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 1) {
- System.out.println(args[0]);
- return TRUE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("Math.add") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 1) {
- float i = 0;
- for(int j = 0 ; j < args.length ; j++)
- i+=Float.parseFloat(args[j]);
- return String.valueOf(i);
- }
- return NULL;
- }
- });
- registerFunction(new Function("Math.subtract") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 1) {
- float i = Float.parseFloat(args[0]);
- for(int j = 1 ; j < args.length ; j++)
- i-=Float.parseFloat(args[j]);
- return String.valueOf(i);
- }
- return NULL;
- }
- });
- registerFunction(new Function("Math.multiply") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 1) {
- float i = 1;
- for(int j = 0 ; j < args.length ; j++)
- i*=Float.parseFloat(args[j]);
- return String.valueOf(i);
- }
- return NULL;
- }
- });
- registerFunction(new Function("Math.divide") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 1) {
- float i = Float.parseFloat(args[0]);
- for(int j = 1 ; j < args.length ; j++)
- i/=Float.parseFloat(args[j]);
- return String.valueOf(i);
- }
- return NULL;
- }
- });
- registerFunction(new Function("Math.power") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 2) {
- return String.valueOf(Math.pow(Float.parseFloat(args[0]), Float.parseFloat(args[1])));
- }
- return NULL;
- }
- });
- registerFunction(new Function("Math.root") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 2) {
- return String.valueOf(Math.pow(Float.parseFloat(args[0]), 1 / Float.parseFloat(args[1])));
- }
- return NULL;
- }
- });
- registerFunction(new Function("Math.sqrt") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 1) {
- return String.valueOf(Math.sqrt(Float.parseFloat(args[0])));
- }
- return NULL;
- }
- });
- registerFunction(new Function("Math.toInteger") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 1) {
- return String.valueOf((int) Float.parseFloat(args[0]));
- }
- return NULL;
- }
- });
- registerFunction(new Function("String.build") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 0) {
- String s = "";
- for(String d : args)
- s+=d;
- return s;
- }
- return NULL;
- }
- });
- registerFunction(new Function("String.toLowerCase") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 1) {
- return args[0].toLowerCase();
- }
- return FALSE;
- }
- });
- registerFunction(new Function("String.toUpperCase") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 1) {
- return args[0].toUpperCase();
- }
- return FALSE;
- }
- });
- registerFunction(new Function("Window.message") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 0) {
- JOptionPane.showMessageDialog(null, args[0], args.length > 1 ? args[1] : "Message", JOptionPane.PLAIN_MESSAGE);
- }
- return NULL;
- }
- });
- registerFunction(new Function("Window.input") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 0) {
- return JOptionPane.showInputDialog(null, args[0], args.length > 1 ? args[1] : "Message", JOptionPane.QUESTION_MESSAGE);
- }
- return NULL;
- }
- });
- registerFunction(new Function("function") {
- public String execute(String[] args, final Sqript fScript, Sqript parent) {
- if(args.length > 0) {
- registerFunction(new Function(args[0]) {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- for(int i = 0 ; i < args.length ; i++) {
- fScript.vars.put("args[" + i + "]", args[i]);
- }
- fScript.vars.put("args[length]", String.valueOf(args.length));
- return fScript.execute();
- }
- });
- }
- return NULL;
- }
- });
- registerFunction(new Function("++") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 1) {
- String s = String.valueOf(Float.parseFloat(parent.get(args[0])) + 1);
- parent.put(args[0], s);
- return s;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("--") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 1) {
- String s = String.valueOf(Float.parseFloat(parent.get(args[0])) - 1);
- parent.put(args[0], s);
- return s;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("get") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 0) {
- return parent.get(args[0]);
- }
- return NULL;
- }
- });
- registerFunction(new Function("set") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 1) {
- parent.put(args[0], args[1]);
- return TRUE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("declare") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 0) {
- parent.declare(args[0]);
- return TRUE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("delete") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 0) {
- parent.delete(args[0]);
- return TRUE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("Array.get") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 1) {
- return parent.getArrayElement(args[0], Integer.parseInt(args[1]));
- }
- return NULL;
- }
- });
- registerFunction(new Function("Array.set") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 2) {
- parent.putArrayElement(args[0], Integer.parseInt(args[1]), args[2]);
- return TRUE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("Array.declare") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length > 0) {
- parent.declareArray(args[0]);
- return TRUE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("if") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length != 1)
- return NULL;
- String[] t = new String[0];
- String[] f = new String[0];
- String[] lines = sc.getLines();
- boolean b = true;
- for(String line : lines) {
- if(line.equals("else")) {
- b = false;
- continue;
- }
- if(b) {
- t = Arrays.copyOf(b?t:f, (b?t:f).length + 1);
- t[t.length - 1] = line;
- }
- else {
- f = Arrays.copyOf(b?t:f, (b?t:f).length + 1);
- f[f.length - 1] = line;
- }
- }
- if(args[0].equals(TRUE))
- new Sqript(t, parent).execute();
- else if(args[0].equals(FALSE))
- new Sqript(f, parent).execute();
- return NULL;
- }
- });
- registerFunction(new Function("run") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- sc.execute();
- return NULL;
- }
- });
- registerFunction(new Function("LT") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 2) {
- float a = Float.parseFloat(args[0]);
- float b = Float.parseFloat(args[1]);
- return a < b ? TRUE : FALSE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("LE") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 2) {
- float a = Float.parseFloat(args[0]);
- float b = Float.parseFloat(args[1]);
- return a <= b ? TRUE : FALSE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("GT") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 2) {
- float a = Float.parseFloat(args[0]);
- float b = Float.parseFloat(args[1]);
- return a > b ? TRUE : FALSE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("GE") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 2) {
- float a = Float.parseFloat(args[0]);
- float b = Float.parseFloat(args[1]);
- return a >= b ? TRUE : FALSE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("EQ") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 2) {
- return args[0].equals(args[1]) ? TRUE : FALSE;
- }
- return FALSE;
- }
- });
- registerFunction(new Function("NE") {
- public String execute(String[] args, Sqript sc, Sqript parent) {
- if(args.length == 2) {
- float a = Float.parseFloat(args[0]);
- float b = Float.parseFloat(args[1]);
- return args[0].equals(args[1]) ? TRUE : FALSE;
- }
- return FALSE;
- }
- });
- }
- }
- package sqript.engine;
- import java.util.Arrays;
- import java.util.HashMap;
- public class Sqript {
- private String[] lines;
- public final HashMap<String, String> vars = new HashMap<String, String>();
- public final HashMap<String, String[]> arrays = new HashMap<String, String[]>();
- private Sqript parent;
- public Sqript(String[] lines, Sqript parent) {
- this.lines = lines;
- this.parent = parent;
- }
- public Sqript getParent() {
- return parent;
- }
- public String[] getLines() {
- return lines;
- }
- public String execute() {
- for(int i = 0 ; i < lines.length ;) {
- String line = lines[i];
- if(line.isEmpty() || line.startsWith("//")) {
- i++;
- continue;
- }
- String[] subScript = new String[0];
- while(lines.length > ++i && lines[i].startsWith("\t")) {
- subScript = Arrays.copyOf(subScript, subScript.length + 1);
- subScript[subScript.length - 1] = lines[i].substring(1);
- }
- if(line.startsWith("return ") && line.indexOf(" ") + 1 < line.length()) {
- return line.contains("(") && line.contains(")") ?
- Function.run(line.substring(line.indexOf(" ") + 1, line.length()), new Sqript(subScript, this), this) :
- line.substring(line.indexOf(" ") + 1, line.length());
- } else if(line.startsWith("loop ")) {
- while((line.contains("(") && line.contains(")") ?
- Function.run(line.substring(line.indexOf(" ") + 1, line.length()), new Sqript(subScript, this), this) :
- line.substring(line.indexOf(" ") + 1, line.length())).equals("TRUE"))
- new Sqript(subScript, this).execute();
- continue;
- }
- Function.run(line, new Sqript(subScript, this), this);
- }
- return Function.NULL;
- }
- public String get(String k) {
- if(vars.containsKey(k))
- return vars.get(k);
- else if(parent != null)
- return parent.get(k);
- else
- return Function.NULL;
- }
- public void put(String k, String v) {
- if(vars.containsKey(k))
- vars.put(k, v);
- else if(parent != null)
- parent.put(k, v);
- }
- public void delete(String k) {
- if(vars.containsKey(k))
- vars.remove(k);
- else if(parent != null)
- parent.delete(k);
- }
- public void declare(String k) {
- vars.put(k, Function.NULL);
- }
- public String getArrayElement(String k, int address) {
- if(arrays.containsKey(k)) {
- String[] array = arrays.get(k);
- if(address < array.length)
- return array[address] == null ? Function.NULL : array[address];
- }
- else if(parent != null)
- return parent.getArrayElement(k, address);
- return Function.NULL;
- }
- public void putArrayElement(String k, int address, String v) {
- if(arrays.containsKey(k)) {
- String[] array = arrays.get(k);
- if(address > array.length - 1) {
- array = Arrays.copyOf(array, address + 1);
- }
- array[address] = v;
- arrays.put(k, array);
- }
- else if(parent != null)
- parent.putArrayElement(k, address, v);
- }
- public void declareArray(String k) {
- arrays.put(k, new String[0]);
- }
- }
- package sqript.engine;
- import java.util.ArrayList;
- import java.util.Arrays;
- class Operations {
- public static String[] splitArgs(String s, char c) {
- String[] args = new String[0];
- ArrayList<Integer> splitPoints = new ArrayList<Integer>();
- char[] charArray = s.toCharArray();
- int brackets = 0;
- for(int i = 0 ; i < s.length() ; i++)
- if(charArray[i] == c && brackets == 0)
- splitPoints.add(i);
- else if(charArray[i] == '(')
- brackets++;
- else if(charArray[i] == ')')
- brackets--;
- String arg = "";
- int i = 0;
- while(i < s.length()) {
- while(i < s.length() && !splitPoints.contains(i)) {
- arg = arg + charArray[i];
- i++;
- }
- i++;
- args = Arrays.copyOf(args, args.length + 1);
- args[args.length - 1] = arg;
- arg = "";
- }
- return args;
- }
- }
- package sqript.run;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.Arrays;
- import sqript.engine.Function;
- import sqript.engine.Sqript;
- public class Run {
- @SuppressWarnings("resource")
- public static void main(String[] args) {
- Function.init();
- try {
- BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("script.sq"))));
- String[] lines = new String[0];
- String s;
- while((s = br.readLine()) != null) {
- lines = Arrays.copyOf(lines, lines.length + 1);
- lines[lines.length - 1] = s;
- }
- new Sqript(lines, null).execute();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement