Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.13 KB | None | 0 0
  1. package kompilatory_cv2;
  2. import com.sun.org.apache.xpath.internal.SourceTree;
  3. import javafx.util.Pair;
  4.  
  5. import java.sql.SQLOutput;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.Stack;
  9.  
  10. /**
  11.  *
  12.  * @author Gooogle
  13.  */
  14. public class LispInterpreter {
  15.  
  16.     private String[] tokens;
  17.     private Stack<String> stack;
  18.     private HashMap<String,String> macroList;
  19.     private HashMap<String,String> variableList;
  20.  
  21.     public LispInterpreter(String[] intputCode) {
  22.         printInputCode(intputCode);
  23.         this.tokens = intputCode;
  24.         this.macroList = new HashMap<>();
  25.         this.variableList = new HashMap<>();
  26.     }
  27.  
  28.     public void Work() {
  29.         stack = new Stack<String>();
  30.         for (int i = 0; i < tokens.length; i++) {
  31.             stack.push(tokens[i]);
  32.             if (tokens[i].equals(")")) {
  33.                 Interprete();
  34.             }
  35.         }
  36.  
  37.         System.out.println("Defined macros in code" + macroList.toString());
  38.         System.out.println("Defined variables in code" + variableList.toString());
  39.     }
  40.  
  41.     private void Interprete() {
  42.         String tok;
  43.         Stack<String> callStack = new Stack<String>();
  44.         tok = stack.pop();
  45.         /* This is the ) character */
  46.         while (!stack.isEmpty() && !(tok = stack.pop()).equals("(")) {
  47.             callStack.push(tok);
  48.         }
  49.         Call(callStack);
  50.     }
  51.  
  52.     private void Call(Stack<String> callStack) {
  53.         String func = callStack.pop();
  54.         if (func.equals("+")) {
  55.             double result = Plus(callStack);
  56.             stack.push(String.valueOf(result));
  57.         }
  58.  
  59.         if (func.equals("-")) {
  60.             double result = Minus(callStack);
  61.             stack.push(String.valueOf(result));
  62.         }
  63.         if (func.equals("List")) {
  64.             String result = LispList(callStack);
  65.             stack.push(String.valueOf(result));
  66.         }
  67.  
  68.         if (func.equals("defmacro")) {
  69.             Pair<String,String> macro = getMacro(callStack);
  70.             macroList.put(macro.getKey(),macro.getValue());
  71.             stack.push(String.valueOf(macro));
  72.         }
  73.  
  74.         if (func.equals("defvar")) {
  75.             Pair<String,String> var = getVariable(callStack);
  76.             variableList.put(var.getKey(),var.getValue());
  77.             stack.push(String.valueOf(var));
  78.         }
  79.     }
  80.  
  81.     private double Plus(Stack<String> callStack) {
  82.         ArrayList<Double> list = new ArrayList<>();
  83.         for (int i = 0; i < callStack.size(); i++) {
  84.             i = addValueToProcessList(callStack, list, i);
  85.         }
  86.         double ret = 0;
  87.         for (int i = 0; i < list.size(); i++) {
  88.             ret += list.get(i);
  89.         }
  90.         System.out.println("Calculate from "+list.toString()+" with Operation plus value is " + ret);
  91.         return ret;
  92.     }
  93.  
  94.     private double Minus(Stack<String> callStack) {
  95.         ArrayList<Double> list = new ArrayList<>();
  96.         for (int i = 0; i < callStack.size(); i++) {
  97.             i = addValueToProcessList(callStack, list, i);
  98.         }
  99.         double ret = 0;
  100.         for (int i = 0; i < list.size(); i++) {
  101.             if (i == 0) {
  102.                 ret = list.get(i);
  103.             } else {
  104.                 ret -= list.get(i);
  105.             }
  106.         }
  107.         System.out.println("Calculate from "+list.toString()+" with Operation minus value is " + ret);
  108.         return ret;
  109.     }
  110.  
  111.     private String getMacroValue(String pop) {
  112.         if (macroList.containsKey(pop)) {
  113.             pop = macroList.get(pop);
  114.         }
  115.         return pop;
  116.     }
  117.  
  118.     private String getVariableValue(String pop) {
  119.         if (variableList.containsKey(pop)) {
  120.             pop = variableList.get(pop);
  121.         }
  122.         return pop;
  123.     }
  124.  
  125.     private String LispList(Stack<String> callStack) {
  126.         ArrayList<Double> list = new ArrayList<>();
  127.         for (int i = 0; i < callStack.size(); i++) {
  128.             i = addValueToProcessList(callStack, list, i);
  129.         }
  130.         System.out.println("Processed list with values " + list);
  131.         return list.toString();
  132.     }
  133.  
  134.     private int addValueToProcessList(Stack<String> callStack, ArrayList<Double> list, int i) {
  135.         String pop = callStack.pop();
  136.         pop = getMacroValue(pop);
  137.         pop = getVariableValue(pop);
  138.         list.add(Double.parseDouble(pop));
  139.         i--;
  140.         return i;
  141.     }
  142.  
  143.     private Pair<String,String> getVariable(Stack<String> callStack) {
  144.         return new Pair<String,String>(callStack.pop(),callStack.pop());
  145.     }
  146.     private Pair<String,String> getMacro(Stack<String> callStack) {
  147.         String macroName = callStack.pop();
  148.         String macroStart = callStack.pop();
  149.         String macroExpression = "";
  150.         while (!callStack.empty()) {
  151.             macroExpression += callStack.pop();
  152.         }
  153.         return new Pair<String,String>(macroName,macroExpression);
  154.     }
  155.  
  156.  
  157.  
  158.     private void printInputCode(String[] intputCode) {
  159.         String print = "";
  160.         for (String s : intputCode) {
  161.             s=s.replace('\'','\0');
  162.             print += " "+s;
  163.         }
  164.         System.out.println("Input code: " + print);
  165.     }
  166.  
  167.  
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement