Advertisement
Guest User

final

a guest
Dec 9th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.16 KB | None | 0 0
  1.  
  2. /*Anureet Kaur
  3.  * CSC 135: Hw5 Interpreter
  4.  */
  5. import java.util.Scanner;
  6. import java.io.File;
  7. import java.io.FileNotFoundException;
  8. import java.io.IOException;
  9.  
  10. public class Hw5Interpreter {
  11.  
  12.     private static LexerSingleCharTokens lex;
  13.  
  14.     static int index = 0;
  15.     static byte[] array = new byte[30000];
  16.  
  17.     public static void main(String[] args) {
  18.         String prog = "";
  19.         try {
  20.             Scanner file = new Scanner(new File("helloworld.txt"));
  21.             while (file.hasNextLine())
  22.                 prog = prog + file.nextLine();
  23.             prog = prog.replaceAll("[^-+<>,\\.\\[\\]]", ""); // Deletes all non-bf chars
  24.         } catch (FileNotFoundException e) {
  25.             System.out.println("File bf.txt could not be read");
  26.             return;
  27.         }
  28.         lex = new LexerSingleCharTokens(prog);
  29.         try {
  30.             ParseTreeNode tree = parseS();
  31.             treeWalk(tree);
  32.         } catch (IllegalArgumentException e) {
  33.             System.out.println("Error");
  34.         }
  35.     }
  36.  
  37.     private static ParseTreeNode parseS() throws IllegalArgumentException {
  38.         if (!lex.hasNext()) {
  39.             ParseTreeNode c = new ParseTreeNode("", null, null, null);
  40.             return new ParseTreeNode("S", c, null, null);
  41.         }
  42.         switch (lex.next()) {
  43.         case ">":
  44.         case "<":
  45.         case "+":
  46.         case "-":
  47.         case ",":
  48.         case ".":
  49.             return new ParseTreeNode("S", parseC(), parseS(), null);
  50.         case "[":
  51.             return new ParseTreeNode("S", parseL(), parseS(), null);
  52.         case "]":
  53.             ParseTreeNode c = new ParseTreeNode("", null, null, null);
  54.             return new ParseTreeNode("S", c, null, null);
  55.         default:
  56.             System.out.println("Parse Error: S " + lex.next());
  57.             return null;
  58.         }
  59.     }
  60.  
  61.     private static ParseTreeNode parseC() throws IllegalArgumentException {
  62.         if (!lex.hasNext())
  63.             throw new IllegalArgumentException();
  64.         switch (lex.next()) {
  65.         case "+":
  66.             lex.match("+");
  67.             return new ParseTreeNode("C", new ParseTreeNode("+", null, null, null), null, null);
  68.         case "-":
  69.             lex.match("-");
  70.             return new ParseTreeNode("C", new ParseTreeNode("-", null, null, null), null, null);
  71.         case "<":
  72.             lex.match("<");
  73.             return new ParseTreeNode("C", new ParseTreeNode("<", null, null, null), null, null);
  74.         case ">":
  75.             lex.match(">");
  76.             return new ParseTreeNode("C", new ParseTreeNode(">", null, null, null), null, null);
  77.         case ",":
  78.             lex.match(",");
  79.             return new ParseTreeNode("C", new ParseTreeNode(",", null, null, null), null, null);
  80.         case ".":
  81.             lex.match(".");
  82.             return new ParseTreeNode("C", new ParseTreeNode(".", null, null, null), null, null);
  83.         default:
  84.             throw new IllegalArgumentException();
  85.         }
  86.     }
  87.  
  88.     private static ParseTreeNode parseL() throws IllegalArgumentException {
  89.         if (!lex.hasNext())
  90.             throw new IllegalArgumentException();
  91.         switch (lex.next()) {
  92.         case "[":
  93.             lex.match("[");
  94.             ParseTreeNode returnNode = new ParseTreeNode("L", new ParseTreeNode("[", null, null, null), parseS(),
  95.                     new ParseTreeNode("]", null, null, null));
  96.             if (!lex.match("]")) {
  97.                 System.out.println("Error" + lex.next());
  98.                 return null;
  99.             }
  100.             return returnNode;
  101.         default:
  102.             throw new IllegalArgumentException();
  103.         }
  104.     }
  105.  
  106.     private static void printTree(ParseTreeNode t) {
  107.         if (t.firstChild == null)
  108.             System.out.print(t.type);
  109.         else {
  110.             printTree(t.firstChild);
  111.             if (t.secondChild != null)
  112.                 printTree(t.secondChild);
  113.             if (t.thirdChild != null)
  114.                 printTree(t.thirdChild);
  115.         }
  116.     }
  117.  
  118.     public static void treeWalk(ParseTreeNode node) {
  119.         if (node == null)
  120.             return;
  121.         switch (node.type) {
  122.         case "+":
  123.             array[index]++;
  124.             break;
  125.         case "-":
  126.             array[index]--;
  127.             break;
  128.         case "<":
  129.             index--;
  130.             break;
  131.         case ">":
  132.             index++;
  133.             break;
  134.         case ".":
  135.             System.out.print((char) array[index]);
  136.             break;
  137.         case ",":
  138.             try {
  139.                 array[index] = ((byte) System.in.read());
  140.             } catch (Exception e) {
  141.                 System.out.println("Failure: Unable to read byte.");
  142.             }
  143.             break;
  144.         case "L":
  145.             while (array[index] != 0) {
  146.                 treeWalk(node.firstChild);
  147.                 treeWalk(node.secondChild);
  148.                 treeWalk(node.thirdChild);
  149.             }
  150.             break;
  151.         // the following accounts for the case where if the node is an S or a C, then we just continue
  152.         default:
  153.             treeWalk(node.firstChild);
  154.             treeWalk(node.secondChild);
  155.             treeWalk(node.thirdChild);
  156.             break;
  157.         }
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement