import java.io.IOException; public class A2 { public static void main(String[] args) { Simulator sim = new Simulator(); // syntactically correct program try { Code code = sim.parse( " { f "+ " declare x int 5 ;"+ " declare y real 6 ;"+ " { h"+ " declare x real 25 ;"+ " declare w real 26 ;"+ " print x ;"+ " print y ;"+ " print w ;"+ " }"+ " { g"+ " declare y real 15 ;"+ " declare v real 16 ;"+ " call h ;"+ " print x ;"+ " print y ;"+ " print v ;"+ " }"+ " call g ;"+ " call h ;"+ " print x ;"+ " print y ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // syntactically correct program try { Code code = sim.parse( " { f "+ " declare x int 3 ;"+ " declare y real 4 ;"+ " { g"+ " declare x real 5 ;"+ " declare z real 6 ;"+ " call f ;"+ " call g ;"+ " print x ;"+ " print y ;"+ " print z ;"+ " }"+ " print x ;"+ " print y ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // syntactically correct program try { Code code = sim.parse( " { f "+ " declare x int 7 ;"+ " declare y real 8 ;"+ " declare w int 9 ;"+ " { g"+ " declare x real 17 ; "+ " declare z real 18 ;"+ " { h"+ " declare y int 27 ;"+ " declare z real 28 ;"+ " print w ;"+ " print x ;"+ " print y ;"+ " print z ;"+ " }"+ " call h ;"+ " print w ;"+ " print x ;"+ " print y ;"+ " print z ;"+ " }"+ " call g ;"+ " print x ;"+ " print y ;"+ " print w ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // inaccessible variable in g try { Code code = sim.parse( " { f "+ " declare x int 5 ;"+ " declare y real 6 ;"+ " { h"+ " declare x real 25 ;"+ " declare w real 26 ;"+ " print x ;"+ " print y ;"+ " print w ;"+ " }"+ " { g"+ " declare y real 15 ;"+ " declare v real 16 ;"+ " call h ;"+ " print x ;"+ " print y ;"+ " print w ;"+ " }"+ " call g ;"+ " call h ;"+ " print x ;"+ " print y ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // inaccessible function in f try { Code code = sim.parse( " { f "+ " declare x int 7 ;"+ " declare y real 8 ;"+ " declare w int 9 ;"+ " { g"+ " declare x real 17 ;"+ " declare z real 18 ;"+ " { h"+ " declare y int 27 ;"+ " declare z real 28 ;"+ " print w ;"+ " print x ;"+ " print y ;"+ " print z ;"+ " }"+ " call h ;"+ " print w ;"+ " print x ;"+ " print y ;"+ " print z ;"+ " }"+ " call h ;"+ " print x ;"+ " print y ;"+ " print w ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // no initial value for variable in g try { Code code = sim.parse( " { f "+ " declare x int 5 ;"+ " declare y real 6 ;"+ " { h"+ " declare x real 25 ;"+ " declare w real 26 ;"+ " print x ;"+ " print y ;"+ " print w ;"+ " }"+ " { g"+ " declare y real ;"+ " declare v real 16 ;"+ " call h ;"+ " print x ;"+ " print y ;"+ " print v ;"+ " }"+ " call g ;"+ " call h ;"+ " print x ;"+ " print y ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // attempt to call a nonfunction try { Code code = sim.parse( " { f "+ " declare x int 5 ;"+ " declare y real 6 ;"+ " { h"+ " declare x real 25 ;"+ " declare w real 26 ;"+ " print x ;"+ " print y ;"+ " print w ;"+ " }"+ " { g"+ " declare y real 15 ;"+ " declare v real 16 ;"+ " call h ;"+ " print x ;"+ " print y ;"+ " print v ;"+ " }"+ " call g ;"+ " call x ;"+ " print x ;"+ " print y ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // attempt to print a function try { Code code = sim.parse( " { f "+ " declare x int 5 ;"+ " declare y real 6 ;"+ " { h"+ " declare x real 25 ;"+ " declare w real 26 ;"+ " print x ;"+ " print y ;"+ " print w ;"+ " }"+ " { g"+ " declare y real 15 ;"+ " declare v real 16 ;"+ " call h ;"+ " print x ;"+ " print h ;"+ " print v ;"+ " }"+ " call g ;"+ " call h ;"+ " print x ;"+ " print y ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // analogs to test cases with syntatic errors from Assignment 1 // bad variable try { Code code = sim.parse( " { f "+ " declare x int 1 ;"+ " declare y real 1 ;"+ " { g"+ " declare x real 1 ;"+ " declare # real 1 ;"+ " call f ;"+ " call g ;"+ " }"+ " print x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // bad declaration try { Code code = sim.parse( " { f "+ " declare x int 1 ;"+ " declare y real 1 ;"+ " { g"+ " declare x real 1 ;"+ " declare z 1 ;"+ " call f ;"+ " call g ;"+ " }"+ " print x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // duplicate identifier try { Code code = sim.parse( " { f "+ " declare x int 1 ;"+ " declare y real 1 ;"+ " { g"+ " declare x real 1 ;"+ " declare z real 1 ;"+ " declare x real 1 ;"+ " call f ;"+ " call g ;"+ " }"+ " print x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // duplicate identifier try { Code code = sim.parse( " { f "+ " declare x int 1 ;"+ " declare y real 1 ;"+ " { y"+ " declare x real 1 ;"+ " declare z real 1 ;"+ " call f ;"+ " call g ;"+ " }"+ " print x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // program must begin with left brace try { Code code = sim.parse( " f "+ " declare x int 1 ;"+ " declare y real 1 ;"+ " { g"+ " declare x real 1 ;"+ " declare z real 1 ;"+ " call f ;"+ " call g ;"+ " }"+ " print x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // g should not be recognized as a block try { Code code = sim.parse( " { f "+ " declare x int 1 ;"+ " declare y real 1 ;"+ " g"+ " declare x real 1 ;"+ " declare z real 1 ;"+ " call f ;"+ " call g ;"+ " }"+ " print x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // bad statement try { Code code = sim.parse( " { f "+ " declare x int 1 ;"+ " declare y real 1 ;"+ " { g"+ " declare x real 1 ;"+ " declare z real 1 ;"+ " call f ;"+ " call g ;"+ " }"+ " << x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // missing right brace try { Code code = sim.parse( " { f "+ " declare x int 1 ;"+ " declare y real 1 ;"+ " { g"+ " declare x real 1 ;"+ " declare z real 1 ;"+ " call f ;"+ " call g ;"+ " print x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // program must end with right brace try { Code code = sim.parse( " { f "+ " declare x int 1 ; "+ " declare y real 1 ;"+ " { g"+ " declare x real 1 ;"+ " declare z real 1 ;"+ " call f ;"+ " call g ;"+ " }"+ " print x ;"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // missing semicolon in declaration try { Code code = sim.parse( " { f "+ " declare x int 1 ;"+ " declare y real 1 "+ " { g"+ " declare x real 1 ;"+ " declare z real 1 ;"+ " call f ;"+ " call g ;"+ " }"+ " print x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } System.out.println("---------------"); // missing semicolon in statement try { Code code = sim.parse( " { f "+ " declare x int 1 ;"+ " declare y real 1 ;"+ " { g"+ " declare x real 1 ;"+ " declare z real 1 ;"+ " call f ;"+ " call g "+ " }"+ " print x ;"+ " }"); System.out.println(code); code.execute(); } catch(IOException e) { System.out.println(e.getMessage()); } } }