1 // Core Part about an Interpreter for |
1 // Main Part 5 about an Interpreter for |
2 // the Brainf***++ language |
2 // the Brainf*** language |
3 //============================================== |
3 //============================================== |
4 |
4 |
5 |
5 |
6 object CW10a { |
6 object M5a { |
7 |
7 |
8 |
8 |
9 // representation of Bf memory |
9 // representation of BF memory |
10 |
10 |
11 type Mem = Map[Int, Int] |
11 type Mem = Map[Int, Int] |
12 |
12 |
13 |
13 |
14 // (1) Write a function that takes a file name as argument and |
14 // (1) Write a function that takes a file name as argument and |
22 def load_bff(name: String) : String = ??? |
22 def load_bff(name: String) : String = ??? |
23 |
23 |
24 |
24 |
25 |
25 |
26 // (2) Complete the functions for safely reading |
26 // (2) Complete the functions for safely reading |
27 // and writing brainf***++ memory. Safely read should |
27 // and writing brainf*** memory. Safely read should |
28 // Return the value stored in the Map for a given memory |
28 // Return the value stored in the Map for a given memory |
29 // pointer, provided it exists; otherwise it Returns 0. The |
29 // pointer, provided it exists; otherwise it Returns 0. The |
30 // writing function generates a new Map with the |
30 // writing function generates a new Map with the |
31 // same data, except at the given memory pointer the |
31 // same data, except at the given memory pointer the |
32 // value v is stored. |
32 // value v is stored. |
37 def write(mem: Mem, mp: Int, v: Int) : Mem = ??? |
37 def write(mem: Mem, mp: Int, v: Int) : Mem = ??? |
38 |
38 |
39 |
39 |
40 |
40 |
41 // (3) Implement the two jumping instructions in the |
41 // (3) Implement the two jumping instructions in the |
42 // brainf***++ language. In jumpRight, given a program and |
42 // brainf*** language. In jumpRight, given a program and |
43 // a program counter move the program counter to the right |
43 // a program counter move the program counter to the right |
44 // until after the *matching* ]-command. Similarly, |
44 // until after the *matching* ]-command. Similarly, |
45 // jumpLeft implements the move to the left to just after |
45 // jumpLeft implements the move to the left to just after |
46 // the *matching* [-command. |
46 // the *matching* [-command. |
47 |
47 |
58 //jumpRight("""--[..[[-]+>[.]]--,>,++""", 3, 0) // => 22 (outside) |
58 //jumpRight("""--[..[[-]+>[.]]--,>,++""", 3, 0) // => 22 (outside) |
59 //jumpLeft("""[******]***""", 7, 0) // => -1 (outside) |
59 //jumpLeft("""[******]***""", 7, 0) // => -1 (outside) |
60 |
60 |
61 |
61 |
62 |
62 |
63 // (4) Complete the compute function that interprets (runs) a brainf***++ |
63 // (4) Complete the compute function that interprets (runs) a brainf*** |
64 // program: the arguments are a program (represented as a string), a program |
64 // program: the arguments are a program (represented as a string), a program |
65 // counter, a memory counter and a brainf***++ memory. It Returns the |
65 // counter, a memory counter and a brainf*** memory. It Returns the |
66 // memory at the stage when the execution of the brainf***++ program |
66 // memory at the stage when the execution of the brainf*** program |
67 // finishes. The interpretation finishes once the program counter |
67 // finishes. The interpretation finishes once the program counter |
68 // pc is pointing to something outside the program string. |
68 // pc is pointing to something outside the program string. |
69 // If the pc points to a character inside the program, the pc, |
69 // If the pc points to a character inside the program, the pc, |
70 // memory pointer and memory need to be updated according to |
70 // memory pointer and memory need to be updated according to |
71 // rules of the brainf***++ language. Then, recursively, the compute |
71 // rules of the brainf*** language. Then, recursively, the compute |
72 // function continues with the command at the new program |
72 // function continues with the command at the new program |
73 // counter. |
73 // counter. |
74 // |
74 // |
75 // Implement the run function that calls compute with the program |
75 // Implement the run function that calls compute with the program |
76 // counter and memory counter set to 0. |
76 // counter and memory counter set to 0. |
80 |
80 |
81 def run(prog: String, m: Mem = Map()) = ??? |
81 def run(prog: String, m: Mem = Map()) = ??? |
82 |
82 |
83 |
83 |
84 |
84 |
85 // some sample bf/bf++-programs collected from the Internet |
85 // some sample bf-programs collected from the Internet |
86 //========================================================== |
86 //===================================================== |
87 |
87 |
88 |
88 |
89 // some contrived (small) programs |
89 // some contrived (small) programs |
90 //--------------------------------- |
90 //--------------------------------- |
91 |
91 |
100 //run("[>>+>>+<<<<-]", Map(0 -> 42)) // Map(0 -> 0, 2 -> 42, 4 -> 42) |
100 //run("[>>+>>+<<<<-]", Map(0 -> 42)) // Map(0 -> 0, 2 -> 42, 4 -> 42) |
101 |
101 |
102 |
102 |
103 // prints out numbers 0 to 9 |
103 // prints out numbers 0 to 9 |
104 //run("""+++++[->++++++++++<]>--<+++[->>++++++++++<<]>>++<<----------[+>.>.<+<]""") |
104 //run("""+++++[->++++++++++<]>--<+++[->>++++++++++<<]>>++<<----------[+>.>.<+<]""") |
105 |
|
106 // bf++ program calculating the cube-function, 10 * 10 * 10 = 1000 |
|
107 //run("""++++++++++#>+***#""") // Map(0 -> 10, 1 -> 1000) |
|
108 |
|
109 |
|
110 // bf++ program copies 3 from 0-cell to to cells 1, 4, 5, 6 and 7 |
|
111 // (note that because of how the program wprks cell 1 will contain 7) |
|
112 //run("""+++>+@+@+@+@+@""") // Map(0 -> 3, 1 -> 7, 4 -> 3, 5 -> 3, 6 -> 3, 7 -> 3) |
|
113 |
|
114 |
105 |
115 |
106 |
116 // some more "useful" programs |
107 // some more "useful" programs |
117 //----------------------------- |
108 //----------------------------- |
118 |
109 |