Advertisement
Guest User

Interpreter

a guest
Nov 27th, 2015
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.93 KB | None | 0 0
  1. import CPP.Absyn.*;
  2. import java.util.LinkedList;
  3. import java.util.HashMap;
  4. import java.util.Scanner;
  5.  
  6. public class Interpreter {
  7.  
  8.     public static HashMap<String, DFun> signature = new HashMap<>();
  9.  
  10.     Scanner scn = new Scanner(System.in);
  11.  
  12.     public enum ValidType {
  13.         INTEGER,
  14.         DOUBLE,
  15.         BOOL,
  16.         VOID
  17.     }
  18.  
  19.     private abstract class Value<R> implements Comparable<Value<R>>{
  20.         public abstract R getValue();
  21.         public abstract void setValue(R value);
  22.         public abstract ValidType getType();
  23.         public abstract int compareTo(Value<R> obj);
  24.     }
  25.  
  26.     private class intValue extends Value<Integer> {
  27.         private Integer value;
  28.         private ValidType type = ValidType.INTEGER;
  29.  
  30.         public intValue(Integer value){
  31.             this.value = value;
  32.         }
  33.  
  34.         public Integer getValue(){
  35.             return this.value;
  36.         }
  37.         public void setValue(Integer value){
  38.             this.value = value;
  39.         }
  40.  
  41.         public ValidType getType(){
  42.             return this.type;
  43.         }
  44.  
  45.         public int compareTo(Value<Integer> obj){
  46.             return (this.value).compareTo(obj.getValue());
  47.         }
  48.         @Override
  49.         public boolean equals(Object o) {
  50.             if(o == null){
  51.                 return false;
  52.             }
  53.             if(o.getClass() != this.getClass()){
  54.                 return false;
  55.             }
  56.             intValue that = (intValue) o;
  57.  
  58.             return this.value.equals(that.getValue());
  59.         }
  60.     }
  61.  
  62.     private class doubleValue extends Value<Double> {
  63.         private Double value;
  64.         private ValidType type = ValidType.DOUBLE;
  65.  
  66.         public doubleValue(Double value){
  67.             this.value = value;
  68.         }
  69.  
  70.         public Double getValue(){
  71.             return this.value;
  72.         }
  73.         public void setValue(Double value){
  74.             this.value = value;
  75.         }
  76.  
  77.         public ValidType getType(){
  78.             return this.type;
  79.         }
  80.  
  81.         public int compareTo(Value<Double> obj){
  82.             return (this.value).compareTo(obj.getValue());
  83.         }
  84.  
  85.                 @Override
  86.         public boolean equals(Object o) {
  87.             if(o == null){
  88.                 return false;
  89.             }
  90.             if(o.getClass() != this.getClass()){
  91.                 return false;
  92.             }
  93.             doubleValue that = (doubleValue) o;
  94.  
  95.             return this.value.equals(that.getValue());
  96.         }
  97.     }
  98.  
  99.     private class boolValue extends Value<Boolean> {
  100.         private Boolean value;
  101.         private ValidType type = ValidType.BOOL;
  102.  
  103.         public boolValue(Boolean value){
  104.             this.value = value;
  105.         }
  106.  
  107.         public Boolean getValue(){
  108.             return this.value;
  109.         }
  110.         public void setValue(Boolean value){
  111.             this.value = value;
  112.         }
  113.  
  114.         public ValidType getType(){
  115.             return this.type;
  116.         }
  117.  
  118.         public int compareTo(Value<Boolean> obj){
  119.             return 0;
  120.         }
  121.     }
  122.  
  123.     private class Env {
  124.         public LinkedList<HashMap<String, Value>> contexts = new LinkedList<HashMap<String, Value>>();
  125.         public Env(HashMap<String, Value> funcArgs) {
  126.             contexts.add(funcArgs);
  127.         }
  128.  
  129.         public Env assignVar(String id, Value val) {
  130.             for(int i = contexts.size()-1; i >= 0; i--){
  131.                 if(contexts.get(i).containsKey(id)){
  132.                     contexts.get(i).put(id, val);
  133.                     return this;
  134.                 }
  135.             }
  136.             throw new RuntimeException("Variable not declared");
  137.         }
  138.  
  139.         public Env declareVar(String id) {
  140.             if(contexts.getLast().containsKey(id)){
  141.                 throw new RuntimeException("Variable already declared");
  142.             }
  143.             contexts.getLast().put(id, null);
  144.             return this;
  145.         }
  146.  
  147.         public Env newBlock(){
  148.             contexts.add(new HashMap<String, Value>());
  149.             return this;
  150.         }
  151.  
  152.         public Env exitBlock(){
  153.             contexts.pollLast();
  154.             return this;
  155.         }
  156.  
  157.         public Value lookupVar(String id) {
  158.             for(int i = contexts.size()-1; i >= 0; i--){
  159.                 if(contexts.get(i).containsKey(id)){
  160.                     return contexts.get(i).get(id);
  161.                 }
  162.             }
  163.             throw new RuntimeException("Variable not defined");
  164.         }
  165.  
  166.         public DFun lookupFun(String id){
  167.             if(signature.containsKey(id)){
  168.                 return signature.get(id);
  169.             }
  170.             else{
  171.                 throw new RuntimeException("Function not defined");
  172.             }
  173.         }
  174.     }
  175.     public void interpret(Program p) {
  176.         Env env = new Env(new HashMap<String, Value>());
  177.         PDefs defs = (PDefs) p;
  178.  
  179.         for(Def def : defs.listdef_){
  180.             DFun function = ((DFun) def);
  181.             signature.put(function.id_, function);
  182.         }
  183.  
  184.         for(Def def: defs.listdef_){
  185.             if((((DFun) def).id_).equals("main")){
  186.                 evalStms(env, ((DFun) def).liststm_);
  187.             }
  188.         }
  189.        
  190.     }
  191.  
  192.     public Value evalStms(Env env, ListStm stms){
  193.         for(Stm stm : stms){
  194.             Value retValue = evalStm(env, stm);
  195.             if(retValue != null){
  196.                 return retValue;
  197.             }
  198.         }
  199.         return null;
  200.     }
  201.     public Value evalStm(Env env, Stm stm) {
  202.         return stm.accept(new StmEvaluator(), env);
  203.     }
  204.  
  205.     private class StmEvaluator implements Stm.Visitor<Value, Env> {
  206.         public Value visit(SExp p, Env env){
  207.             evalExp(env, p.exp_);
  208.             return null;
  209.         }
  210.  
  211.         public Value visit(SDecls p, Env env){
  212.             for(String id : p.listid_){
  213.                 env.declareVar(id);
  214.             }
  215.             return null;
  216.         }
  217.  
  218.         public Value visit(SInit p, Env env){
  219.             env.declareVar(p.id_);
  220.             env.assignVar(p.id_, evalExp(env, p.exp_));
  221.             return null;
  222.         }
  223.  
  224.         public Value visit(SReturn p, Env env){
  225.             return evalExp(env, p.exp_);
  226.         }
  227.  
  228.         public Value visit(SWhile p, Env env){
  229.             while(((intValue) evalExp(env, p.exp_)).getValue().equals(new Integer(1))){
  230.  
  231.             evalStm(env, p.stm_);
  232.  
  233.             }
  234.             return null;
  235.         }
  236.  
  237.         public Value visit(SBlock p, Env env){
  238.             env.newBlock();
  239.             Value v = evalStms(env, p.liststm_);
  240.             env.exitBlock();
  241.             return v;
  242.         }
  243.  
  244.         public Value visit(SIfElse p, Env env){
  245.             if(((intValue) evalExp(env, p.exp_)).getValue().equals(new Integer(1))){
  246.                 return evalStm(env, p.stm_1);
  247.             }
  248.             else{
  249.                 return evalStm(env, p.stm_2);
  250.             }
  251.         }
  252.  
  253.     }
  254.  
  255.     public Value evalExp(Env env, Exp exp) {
  256.         return exp.accept(new ExpEvaluator(), env);
  257.     }
  258.  
  259.     private class ExpEvaluator implements Exp.Visitor<Value, Env> {
  260.         public Value visit(EPlus e, Env env) {
  261.             Value val1 = evalExp(env, e.exp_1);
  262.             Value val2 = evalExp(env, e.exp_2);
  263.  
  264.             if(val1.getType() == ValidType.INTEGER){
  265.                 return new intValue(((Integer)val1.getValue() + (Integer) val2.getValue()));
  266.             }
  267.             else{
  268.                 return new doubleValue(((Double)val1.getValue() + (Double) val2.getValue()));
  269.             }
  270.  
  271.         }
  272.  
  273.         public Value visit(ETrue e, Env env) {
  274.             return new intValue(1);
  275.  
  276.         }
  277.         public Value visit(EFalse e, Env env) {
  278.             return new intValue(0);
  279.            
  280.         }
  281.         public Value visit(EInt e, Env env) {
  282.             return new intValue(e.integer_);
  283.            
  284.         }
  285.         public Value visit(EDouble e, Env env) {
  286.             return new doubleValue(e.double_);
  287.            
  288.         }
  289.         public Value visit(EId e, Env env) {
  290.             return env.lookupVar(e.id_);
  291.            
  292.         }
  293.         public Value visit(EApp e, Env env) {
  294.             if(e.id_.equals("printInt")){
  295.                 System.out.println(evalExp(env, e.listexp_.get(0)).getValue());
  296.             }
  297.             else if(e.id_.equals("printDouble")){
  298.                 System.out.println(evalExp(env, e.listexp_.get(0)).getValue());
  299.             }
  300.             else if(e.id_.equals("readInt")){
  301.                 int x = scn.nextInt();
  302.                 return new intValue(x);
  303.             }
  304.             else if(e.id_.equals("readDouble")){
  305.                 double x = scn.nextDouble();
  306.                 return new doubleValue(x);
  307.             }
  308.             else{
  309.                 DFun function = env.lookupFun(e.id_);
  310.                 HashMap<String, Value> args = new HashMap<String, Value>();
  311.                 for(int i = 0; i < function.listarg_.size(); i++){
  312.                     args.put(((ADecl) function.listarg_.get(i)).id_, evalExp(env, e.listexp_.get(i)));
  313.                 }
  314.                 Env newEnv = new Env(args);
  315.  
  316.                 return evalStms(newEnv, function.liststm_);
  317.             }
  318.             return null;
  319.            
  320.         }
  321.         public Value visit(EPostIncr e, Env env) {
  322.             Value val = evalExp(env, e.exp_);
  323.  
  324.             if(val.getType() == ValidType.INTEGER) {
  325.                 intValue x = (intValue) val;
  326.                 x.setValue(x.getValue()+1);
  327.                 intValue newValue = new intValue(((Integer) x.getValue())-1);
  328.                 return newValue;
  329.             }
  330.             else{
  331.                 doubleValue x = (doubleValue) val;
  332.                 x.setValue(x.getValue()+1);
  333.                 doubleValue newValue = new doubleValue(((Double) x.getValue())-1);
  334.                 return newValue;
  335.             }
  336.            
  337.         }
  338.         public Value visit(EPostDecr e, Env env) {
  339.             Value val = evalExp(env, e.exp_);
  340.  
  341.             if(val.getType() == ValidType.INTEGER) {
  342.                 intValue x = (intValue) val;
  343.                 x.setValue(x.getValue()-1);
  344.                 intValue newValue = new intValue(((Integer) x.getValue())+1);
  345.                 return newValue;
  346.             }
  347.             else{
  348.                 doubleValue x = (doubleValue) val;
  349.                 x.setValue(x.getValue()-1);
  350.                 doubleValue newValue = new doubleValue(((Double) x.getValue())+1);
  351.                 return newValue;
  352.             }
  353.            
  354.         }
  355.         public Value visit(EPreIncr e, Env env) {
  356.             Value val = evalExp(env, e.exp_);
  357.  
  358.             if(val.getType() == ValidType.INTEGER){
  359.                 intValue x = (intValue) val;
  360.                 x.setValue(x.getValue()+1);
  361.                 return x;
  362.             }
  363.             else{
  364.                 doubleValue x = (doubleValue) val;
  365.                 x.setValue(x.getValue()+1);
  366.                 return x;
  367.             }
  368.         }
  369.         public Value visit(EPreDecr e, Env env) {
  370.             Value val = evalExp(env, e.exp_);
  371.  
  372.             if(val.getType() == ValidType.INTEGER){
  373.                 intValue x = (intValue) val;
  374.                 x.setValue(x.getValue()-1);
  375.                 return x;
  376.             }
  377.             else{
  378.                 doubleValue x = (doubleValue) val;
  379.                 x.setValue(x.getValue()-1);
  380.                 return x;
  381.             }
  382.            
  383.         }
  384.         public Value visit(ETimes e, Env env) {
  385.             Value val1 = evalExp(env, e.exp_1);
  386.             Value val2 = evalExp(env, e.exp_2);
  387.  
  388.             if(val1.getType() == ValidType.INTEGER){
  389.                 return new intValue(((Integer)val1.getValue() * (Integer) val2.getValue()));
  390.             }
  391.             else{
  392.                 return new doubleValue(((Double)val1.getValue() * (Double) val2.getValue()));
  393.             }
  394.            
  395.         }
  396.         public Value visit(EDiv e, Env env) {
  397.             Value val1 = evalExp(env, e.exp_1);
  398.             Value val2 = evalExp(env, e.exp_2);
  399.  
  400.             if(val1.getType() == ValidType.INTEGER){
  401.                 return new intValue(((Integer)val1.getValue() / (Integer) val2.getValue()));
  402.             }
  403.             else{
  404.                 return new doubleValue(((Double)val1.getValue() / (Double) val2.getValue()));
  405.             }
  406.            
  407.         }
  408.         public Value visit(EMinus e, Env env) {
  409.             Value val1 = evalExp(env, e.exp_1);
  410.             Value val2 = evalExp(env, e.exp_2);
  411.  
  412.             if(val1.getType() == ValidType.INTEGER){
  413.                 return new intValue(((Integer)val1.getValue() - (Integer) val2.getValue()));
  414.             }
  415.             else{
  416.                 return new doubleValue(((Double)val1.getValue() - (Double) val2.getValue()));
  417.             }
  418.            
  419.         }
  420.         public Value visit(ELt e, Env env) {
  421.             Value val1 = evalExp(env, e.exp_1);
  422.             Value val2 = evalExp(env, e.exp_2);
  423.  
  424.             if(val1.getType() == ValidType.INTEGER){
  425.                 int result = ((intValue) val1).compareTo(((intValue) val2));
  426.                 if(result == -1){
  427.                     return new intValue(1);
  428.                 }
  429.                 else{
  430.                     return new intValue(0);
  431.                 }
  432.             }
  433.             else{
  434.                 int result = ((doubleValue) val1).compareTo(((doubleValue) val2));
  435.                 if(result == -1){
  436.                     return new intValue(1);
  437.                 }
  438.                 else{
  439.                     return new intValue(0);
  440.                 }
  441.             }
  442.  
  443.         }
  444.         public Value visit(EGt e, Env env) {
  445.             Value val1 = evalExp(env, e.exp_1);
  446.             Value val2 = evalExp(env, e.exp_2);
  447.  
  448.             if(val1.getType() == ValidType.INTEGER){
  449.                 int result = ((intValue) val1).compareTo(((intValue) val2));
  450.                 if(result == 1){
  451.                     return new intValue(1);
  452.                 }
  453.                 else{
  454.                     return new intValue(0);
  455.                 }
  456.             }
  457.             else{
  458.                 int result = ((doubleValue) val1).compareTo(((doubleValue) val2));
  459.                 if(result == 1){
  460.                     return new intValue(1);
  461.                 }
  462.                 else{
  463.                     return new intValue(0);
  464.                 }
  465.             }
  466.            
  467.         }
  468.         public Value visit(ELtEq e, Env env) {
  469.             Value val1 = evalExp(env, e.exp_1);
  470.             Value val2 = evalExp(env, e.exp_2);
  471.  
  472.             if(val1.getType() == ValidType.INTEGER){
  473.                 int result = ((intValue) val1).compareTo(((intValue) val2));
  474.                 if(result <= 0){
  475.                     return new intValue(1);
  476.                 }
  477.                 else{
  478.                     return new intValue(0);
  479.                 }
  480.             }
  481.             else{
  482.                 int result = ((doubleValue) val1).compareTo(((doubleValue) val2));
  483.                 if(result <= 0){
  484.                     return new intValue(1);
  485.                 }
  486.                 else{
  487.                     return new intValue(0);
  488.                 }
  489.             }
  490.            
  491.         }
  492.         public Value visit(EGtEq e, Env env) {
  493.             Value val1 = evalExp(env, e.exp_1);
  494.             Value val2 = evalExp(env, e.exp_2);
  495.  
  496.             if(val1.getType() == ValidType.INTEGER){
  497.                 int result = ((intValue) val1).compareTo(((intValue) val2));
  498.                 if(result >= 0){
  499.                     return new intValue(1);
  500.                 }
  501.                 else{
  502.                     return new intValue(0);
  503.                 }
  504.             }
  505.             else{
  506.                 int result = ((doubleValue) val1).compareTo(((doubleValue) val2));
  507.                 if(result >= 0){
  508.                     return new intValue(1);
  509.                 }
  510.                 else{
  511.                     return new intValue(0);
  512.                 }
  513.             }
  514.            
  515.         }
  516.         public Value visit(EEq e, Env env) {
  517.             if (evalExp(env, e.exp_1).equals(evalExp(env, e.exp_2)))
  518.                 return new intValue(1);
  519.             return new intValue(0);
  520.            
  521.         }
  522.         public Value visit(ENEq e, Env env) {
  523.             if (!(evalExp(env, e.exp_1).equals(evalExp(env, e.exp_2))))
  524.                 return new intValue(1);
  525.             return new intValue(0);
  526.         }
  527.         public Value visit(EAnd e, Env env) {
  528.             intValue val1 = (intValue) evalExp(env, e.exp_1);
  529.  
  530.             if(val1.getValue() == 0){
  531.                 return new intValue(0);
  532.             }
  533.  
  534.             intValue val2 = (intValue) evalExp(env, e.exp_2);
  535.  
  536.             if(val2.getValue() == 0){
  537.                 return new intValue(0);
  538.             }
  539.             return new intValue(1);
  540.            
  541.         }
  542.         public Value visit(EOr e, Env env) {
  543.             intValue val1 = (intValue) evalExp(env, e.exp_1);
  544.            
  545.  
  546.             if(val1.getValue() == 1){
  547.                 return new intValue(1);
  548.             }
  549.  
  550.             intValue val2 = (intValue) evalExp(env, e.exp_2);
  551.  
  552.             if(val2.getValue() == 1){
  553.                 return new intValue(1);
  554.             }
  555.  
  556.             return new intValue(0);
  557.            
  558.         }
  559.         public Value visit(EAss e, Env env) {
  560.             env.assignVar(((EId) e.exp_1).id_, evalExp(env, e.exp_2));
  561.             //System.out.println("VALUE: " + ((intValue)env.lookupVar(((EId) e.exp_1).id_)).getValue().toString());
  562.             return env.lookupVar(((EId) e.exp_1).id_);
  563.            
  564.         }
  565.  
  566.     }
  567.  
  568. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement