main_templates5/bf.scala
changeset 399 b17a98b0c52f
parent 347 4de31fdc0d67
child 400 e48ea8300b2d
equal deleted inserted replaced
398:7d9b765d4012 399:b17a98b0c52f
     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