Guest User

Untitled

a guest
Oct 22nd, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.03 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. import java.awt.*;
  4.  
  5.  
  6.  
  7. public class RobotProgram {
  8.  
  9.     private boolean validProgramLoaded;
  10.  
  11.     private ArrayList<ENode> roots = new ArrayList<ENode>();
  12.  
  13.     public boolean validProgramLoaded() {
  14.  
  15.         return this.validProgramLoaded;
  16.  
  17.     }
  18.  
  19.  
  20.  
  21.     public boolean parse(Scanner program) {
  22.  
  23.         //System.out.println("TODO: Load a progam from the Scanner " +
  24.  
  25.         //"provided using a Parse Tree representation of your own design.");
  26.  
  27.         this.validProgramLoaded = true;
  28.  
  29.         while(program.hasNext()) {
  30.  
  31.             ENode n = parseInstruction(program);
  32.  
  33.            
  34.  
  35.            
  36.  
  37.             if(n == null) {
  38.  
  39.                 validProgramLoaded = false;
  40.  
  41.                 break;
  42.  
  43.             }
  44.  
  45.             if(!program.hasNext()) {
  46.  
  47.                 validProgramLoaded = false;
  48.  
  49.                 break;
  50.  
  51.             }
  52.  
  53.    
  54.  
  55.            
  56.  
  57.         roots.add(n);
  58.  
  59.         }
  60.  
  61.        
  62.  
  63.        
  64.  
  65.         return this.validProgramLoaded;
  66.  
  67.     }
  68.  
  69.    
  70.  
  71.     public ENode parseInstruction(Scanner s) {
  72.  
  73.         if(!s.hasNext()) return null;
  74.  
  75.         String token = s.next();
  76.  
  77.         ENode n = null;
  78.  
  79.         System.out.println(token);
  80.  
  81.         ArrayList<ENode> children = new ArrayList<ENode>();
  82.  
  83.         children.add(new TerminalNode(token));
  84.  
  85.         if(token.equalsIgnoreCase("MOVE") || token.equalsIgnoreCase("TURN")) {
  86.  
  87.         children = parseN(s, children);
  88.  
  89.  
  90.             if(!validVarName(name)) // If the variable contains special characters
  91.  
  92.                 return null;
  93.  
  94.             children = parseN(s,children);
  95.  
  96.         }else if(varMap.containsKey(token)) {
  97.  
  98.             s.next(); // Skip Equals
  99.  
  100.             children = parseN(s, children);
  101.  
  102.         }
  103.  
  104.        
  105.  
  106.         if(children == null) return new TerminalNode(token);
  107.  
  108.         n = new ExpressionNode(children);
  109.  
  110.         return n;
  111.  
  112.     }
  113.  
  114.     public boolean execute(int robotID, World world, Graphics g) {
  115.  
  116.         if (this.validProgramLoaded) {
  117.  
  118.             System.out.println("TODO: Execute a program using your parse tree representation.");
  119.  
  120.             Scanner scan;
  121.  
  122.             for(ENode e: roots) {
  123.  
  124.                 String str = e.toString();
  125.  
  126.                 System.out.println(str);
  127.  
  128.                 scan = new Scanner(str);
  129.  
  130.                 String temp = scan.next();
  131.  
  132.                 if(temp.equalsIgnoreCase("DROP"))
  133.  
  134.                     world.drop(robotID, g);
  135.  
  136.                 else if(temp.equalsIgnoreCase("PICKUP"))
  137.  
  138.                     world.pickUp(robotID, g);
  139.  
  140.                 else if(temp.equalsIgnoreCase("MOVE")) {
  141.  
  142.                     world.moveRobot(robotID, getNumber(e, world, robotID), g);
  143.  
  144.                 }
  145.  
  146.  
  147.                 }else if(temp.equals("TURN_TOWARDS_FIRST_BOX")) {
  148.  
  149.                     world.turnTowardsFirstBox(robotID, g);
  150.  
  151.                 }else if(temp.equalsIgnoreCase("TURN_TOWARDS_FIRST_THING")) {
  152.  
  153.                     world.turnTowardsFirstThing(robotID, g);
  154.  
  155.                 }
  156.  
  157.                 else {
  158.  
  159.                     ExpressionNode en = (ExpressionNode) e;
  160.  
  161.                     //TODO Deal with Var assignment;
  162.  
  163.                    
  164.  
  165.                 }
  166.  
  167.             }
  168.  
  169.  
  170.  
  171.             return true;
  172.  
  173.         } else {
  174.  
  175.             return false;
  176.  
  177.         }
  178.  
  179.     }
  180.  
  181.     private int getNumber(ENode n, World w, int robotID) {
  182.  
  183.         String str = n.toString();
  184.  
  185.         System.out.println(str);
  186.  
  187.         Scanner scan = new Scanner(str);
  188.  
  189.         scan.next(); // Skip Token
  190.  
  191.         if(scan.hasNextInt())
  192.  
  193.             return scan.nextInt();
  194.  
  195.  
  196.        
  197.  
  198.             else {
  199.  
  200.                 return varMap.get(scan.next());
  201.  
  202.             }
  203.  
  204.                
  205.  
  206.        
  207.  
  208.     }
  209.  
  210.     private boolean condParser(ENode a, ENode b) {
  211.  
  212.         return true;
  213.  
  214.     }
  215.  
  216.     private boolean condParser(ENode a) {
  217.  
  218.         return true;
  219.  
  220.     }
  221.  
  222.     public boolean validVarName(String var) {
  223.  
  224.        
  225.  
  226.         if(var.contains("`")||var.contains("~")||var.contains("!")||
  227.  
  228.                 var.contains("@")||var.contains("#")||var.contains("$")
  229.  
  230.                 || var.contains("%")||var.contains("^")|| var.contains("&")||
  231.  
  232.                 var.contains("*")||var.contains("(")||var.contains(")")||var.contains("-")
  233.  
  234.                 || var.contains("_")|| var.contains("=")||var.contains("+")||var.contains("[")
  235.  
  236.                 || var.contains("]")||var.contains("{")||var.contains("}")||var.contains("\\")
  237.                 ||var.contains(".")||var.contains("?")||var.contains("/")||Character.isDigit(var.charAt(0)))
  238.  
  239.             return false;
  240.  
  241.         else
  242.  
  243.             return true;
  244.  
  245.     }
  246.  
  247.     public ArrayList<ENode> parseN(Scanner s, ArrayList<ENode> children) {
  248.  
  249.     if(s.hasNextInt()) {
  250.  
  251.             int i = s.nextInt();
  252.  
  253.         children.add(new TerminalNode(""+i));
  254.  
  255.         return children;
  256.  
  257.         }
  258.  
  259.     else if(s.hasNext()) {
  260.  
  261.         String token = s.next();
  262.  
  263.         if(token.equalsIgnoreCase("NUMBER_OF_THINGS_NOT_IN_BOXES")|| token.equalsIgnoreCase("DISTANCE_TO_FIRST_THING") ||
  264.  
  265.             token.equalsIgnoreCase("DISTANCE_TO_FIRST_BOX")) {
  266.  
  267.             children.add(new TerminalNode(token));
  268.  
  269.             return children;
  270.  
  271.     }
  272.  
  273.         else {
  274.  
  275.             if(validVarName(token) && varMap.containsKey(token)) {
  276.  
  277.                 children.add(new TerminalNode(""+varMap.get(token)));
  278.  
  279.                 }
  280.  
  281.            
  282.  
  283.         } }
  284.  
  285.         return null;
  286.  
  287.            
  288.  
  289.        
  290.  
  291.        
  292.  
  293.     }
  294.  
  295.     interface ENode {public String toString();}
  296.  
  297.     class ExpressionNode implements ENode {
  298.  
  299.         private ArrayList<ENode>children; // IN ORDER
  300.  
  301.         public ExpressionNode(ArrayList<ENode> children) {
  302.  
  303.             this.children = children;
  304.  
  305.         }
  306.  
  307.         public String toString() {
  308.  
  309.             String result = "";
  310.  
  311.             for(ENode n: children) {
  312.  
  313.                 result+=n.toString() + " ";
  314.  
  315.             }
  316.  
  317.             return result;
  318.  
  319.         }
  320.  
  321.     }
  322.  
  323.     class TerminalNode implements ENode {
  324.  
  325.         private String value;
  326.  
  327.         public TerminalNode(String value) {
  328.  
  329.             this.value = value;
  330.  
  331.         }
  332.  
  333.         public String toString() {
  334.  
  335.             return this.value;
  336.  
  337.         }
  338.  
  339.     }
  340.  
  341. }
Add Comment
Please, Sign In to add comment