Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.21 KB | None | 0 0
  1. package main;
  2.  
  3. import tp6.analysis.Analysis;
  4. import tp6.node.*;
  5.  
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import java.util.Scanner;
  9. import java.util.Stack;
  10.  
  11.  
  12. public class Interpreter extends AbstractInterpreter implements Analysis {
  13.     private static Map<String, Integer> variables = new HashMap<>();
  14.     private static Stack<Integer> stack = new Stack<>();
  15.    
  16.     @Override
  17.     public void caseAAssignment(AAssignment node) {
  18.         node.getRhs().apply(this);
  19.         variables.put(node.getVar().toString().trim(), stack.pop());
  20.     }
  21.  
  22.     @Override
  23.     public void caseABinexpression(ABinexpression node) {
  24.         String op = node.getOperator().toString().trim();
  25.         node.getLExp().apply(this);
  26.         int var1 = stack.pop();
  27.  
  28.         if((node.getRExp() instanceof ABinexpressionExpression) && (op.equals("/") || op.equals("*") || op.equals("%"))) {
  29.             ABinexpression node2 = (ABinexpression) ((ABinexpressionExpression) node.getRExp()).getBinexpression();
  30.             node2.getLExp().apply(this);
  31.             int var2 = stack.pop();
  32.             doCalcul(op, var1, var2);
  33.             node2.setLExp(new AIntegervalueUniexpression(new AIntegervalue(new TNumber(stack.pop() + ""))));
  34.             node2.apply(this);
  35.         }
  36.         else {
  37.             node.getRExp().apply(this);
  38.             int var2 = stack.pop();
  39.             doCalcul(op, var1, var2);
  40.         }
  41.     }
  42.  
  43.     private void doCalcul(String op, int var1, int var2) {
  44.         switch (op) {
  45.             case "+":
  46.                 stack.push(var1 + var2);
  47.                 break;
  48.             case "-":
  49.                 stack.push(var1 - var2);
  50.                 break;
  51.             case "*":
  52.                 stack.push(var1 * var2);
  53.                 break;
  54.             case "/":
  55.                 stack.push(var1 / var2);
  56.                 break;
  57.             case "%":
  58.                 stack.push(var1 % var2);
  59.                 break;
  60.             case "==":
  61.                 stack.push(var1 == var2 ? 1 : 0);
  62.                 break;
  63.             case ">":
  64.                 stack.push(var1 > var2 ? 1 : 0);
  65.                 break;
  66.             case "<":
  67.                 stack.push(var1 < var2 ? 1 : 0);
  68.                 break;
  69.             default:
  70.                 System.err.println("Operation not allowed : " + var1 + " " + op + " " + var2);
  71.                 System.exit(1);
  72.         }
  73.     }
  74.  
  75.     @Override
  76.     public void caseAVariableref(AVariableref node) {
  77.         if(!variables.containsKey(node.getIdentifier().toString().trim())) {
  78.             System.err.println("Variable " + node.getIdentifier().toString().trim() + " doesn't exist.");
  79.             System.exit(1);
  80.         }
  81.         else {
  82.             stack.push(variables.get(node.getIdentifier().toString().trim()));
  83.         }
  84.     }
  85.  
  86.     @Override
  87.     public void caseAIntegervalue(AIntegervalue node) {
  88.         stack.push(Integer.parseInt(node.getNumber().toString().trim()));
  89.     }
  90.  
  91.     @Override
  92.     public void caseABlock(ABlock node) {
  93.         for(PStatement s : node.getStatement()) {
  94.             s.apply(this);
  95.         }
  96.     }
  97.  
  98.     @Override
  99.     public void caseAConditional(AConditional node) {
  100.         node.getCond().apply(this);
  101.         int cond = stack.pop();
  102.         if(cond == 1) {
  103.             node.getThenpart().apply(this);
  104.         }
  105.         else if(!node.getElse().toString().isEmpty()) {
  106.             node.getElsepart().apply(this);
  107.         }
  108.     }
  109.  
  110.     @Override
  111.     public void caseAWhileS(AWhileS node) {
  112.         while (true) {
  113.             node.getCond().apply(this);
  114.             int cond = stack.pop();
  115.             if(cond == 1) {
  116.                 node.getBody().apply(this);
  117.             }
  118.             else {
  119.                 break;
  120.             }
  121.         }
  122.     }
  123.  
  124.     @Override
  125.     public void caseAPrintS(APrintS node) {
  126.         if(variables.containsKey(node.getValue().toString().trim())) {
  127.             System.out.println(variables.get(node.getValue().toString().trim()));
  128.         }
  129.         else {
  130.             System.out.println(node.getValue().toString().trim());
  131.         }
  132.     }
  133.  
  134.  
  135.     @Override
  136.     public void caseAReadS(AReadS node) {
  137.         Scanner input = new Scanner(System.in);
  138.         System.out.print(node.getVar() + " ? ");
  139.         Integer read = input.nextInt();
  140.         variables.putIfAbsent(node.getVar().toString().trim(), read);
  141.     }
  142.  
  143.     /*
  144.      * ignored
  145.      */
  146.  
  147.     @Override
  148.     public void caseAMinusOperatorarith(AMinusOperatorarith node) {}
  149.  
  150.     @Override
  151.     public void caseAMultiplierOperatorarith(AMultiplierOperatorarith node) {}
  152.  
  153.     @Override
  154.     public void caseAPlusOperatorarith(APlusOperatorarith node) {}
  155.  
  156.     @Override
  157.     public void caseADiviserOperatorarith(ADiviserOperatorarith node) {}
  158.  
  159.     @Override
  160.     public void caseAModuloOperatorarith(AModuloOperatorarith node) {}
  161.  
  162.     @Override
  163.     public void caseASupOperatorlogique(ASupOperatorlogique node) {}
  164.  
  165.     @Override
  166.     public void caseAEqualOperatorlogique(AEqualOperatorlogique node) {}
  167.  
  168.     @Override
  169.     public void caseAInfOperatorlogique(AInfOperatorlogique node) {}
  170.    
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement