equal
deleted
inserted
replaced
20 // |
20 // |
21 // Scala-cli is another REPL for scala. Unfortunately |
21 // Scala-cli is another REPL for scala. Unfortunately |
22 // fastparse used in this file is not yet supported |
22 // fastparse used in this file is not yet supported |
23 // under ammonite. |
23 // under ammonite. |
24 |
24 |
25 |
|
26 //> using toolkit latest |
|
27 //> using file compile_arrays2.sc |
25 //> using file compile_arrays2.sc |
28 import compile_arrays2._ |
26 import compile_arrays2._ |
29 |
27 |
30 def time_needed[T](i: Int, code: => T) = { |
28 def time_needed[T](i: Int, code: => T) = { |
31 val start = System.nanoTime() |
29 val start = System.nanoTime() |
118 P( P(Fa ~ "*" ~ Te).map{ case (l, r) => Aop("*", l, r)} |
116 P( P(Fa ~ "*" ~ Te).map{ case (l, r) => Aop("*", l, r)} |
119 | Fa ) |
117 | Fa ) |
120 def Fa[$ : P]: P[AExp] = |
118 def Fa[$ : P]: P[AExp] = |
121 P( "(" ~ AExp ~ ")" |
119 P( "(" ~ AExp ~ ")" |
122 | P (Ident ~ "[" ~ AExp ~ "]").map{Ref(_, _)} |
120 | P (Ident ~ "[" ~ AExp ~ "]").map{Ref(_, _)} |
123 | P(Number).map{Num} |
121 | P(Number).map{Num(_)} |
124 | P(Ident).map{Var} ) |
122 | P(Ident).map{Var(_)} ) |
125 |
123 |
126 // boolean expressions |
124 // boolean expressions |
127 def BExp[$ : P]: P[BExp] = |
125 def BExp[$ : P]: P[BExp] = |
128 P( P(AExp ~ "=" ~ AExp).map{ case (x, z) => Bop("=", x, z)} |
126 P( P(AExp ~ "=" ~ AExp).map{ case (x, z) => Bop("=", x, z)} |
129 | P(AExp ~ "!=" ~ AExp).map{ case (x, z) => Bop("!=", x, z)} |
127 | P(AExp ~ "!=" ~ AExp).map{ case (x, z) => Bop("!=", x, z)} |
139 | P(Ident ~ ":=" ~ AExp).map{Assign(_, _)} |
137 | P(Ident ~ ":=" ~ AExp).map{Assign(_, _)} |
140 | P(Ident ~ "[" ~ AExp ~ "]" ~ ":=" ~ AExp).map{AssignA(_, _, _)} |
138 | P(Ident ~ "[" ~ AExp ~ "]" ~ ":=" ~ AExp).map{AssignA(_, _, _)} |
141 | P("if" ~ BExp ~ "then" ~ Block ~ "else" ~ Block).map{If(_, _, _)} |
139 | P("if" ~ BExp ~ "then" ~ Block ~ "else" ~ Block).map{If(_, _, _)} |
142 | P("while" ~ BExp ~ "do" ~ Block).map{While(_, _)} |
140 | P("while" ~ BExp ~ "do" ~ Block).map{While(_, _)} |
143 | P("new(" ~ Ident ~ "[" ~ Number ~ "])").map{ArrayDef(_, _)} |
141 | P("new(" ~ Ident ~ "[" ~ Number ~ "])").map{ArrayDef(_, _)} |
144 | P("write(" ~ Ident ~ ")").map{Write} ) |
142 | P("write(" ~ Ident ~ ")").map{Write(_)} ) |
145 |
143 |
146 def Stmts[$ : P]: P[Block] = |
144 def Stmts[$ : P]: P[Block] = |
147 P( P(Stmt ~ ";" ~ Stmts).map{ case (x, z) => x :: z } |
145 P( P(Stmt ~ ";" ~ Stmts).map{ case (x, z) => x :: z } |
148 | P(Stmt).map{s => List(s)} ) |
146 | P(Stmt).map{s => List(s)} ) |
149 |
147 |
190 case '>' => "ptr := ptr + 1;" |
188 case '>' => "ptr := ptr + 1;" |
191 case '<' => "ptr := ptr - 1;" |
189 case '<' => "ptr := ptr - 1;" |
192 case '+' => "mem[ptr] := mem[ptr] + 1;" |
190 case '+' => "mem[ptr] := mem[ptr] + 1;" |
193 case '-' => "mem[ptr] := mem[ptr] - 1;" |
191 case '-' => "mem[ptr] := mem[ptr] - 1;" |
194 case '.' => "x := mem[ptr]; write x;" |
192 case '.' => "x := mem[ptr]; write x;" |
195 //case ',' => "XXX" // "ptr = getchar();\n" |
|
196 case '[' => "while (mem[ptr] != 0) do {" |
193 case '[' => "while (mem[ptr] != 0) do {" |
197 case ']' => "skip};" |
194 case ']' => "skip};" |
198 case _ => "" |
195 case _ => "" |
199 } |
196 } |
200 |
197 |
320 // |
317 // |
321 //@doc(" All benchmarks.") |
318 //@doc(" All benchmarks.") |
322 //@main |
319 //@main |
323 def all() = { bfc0(); bfc1(); bfc2(); bfc3(); bfc4() } |
320 def all() = { bfc0(); bfc1(); bfc2(); bfc3(); bfc4() } |
324 |
321 |
325 all() |
322 //all() |
326 |
323 bfc4() |
327 |
324 |
328 |
325 |
329 |
326 |
330 |
327 |
331 // old way to run it with Ammonite |
328 // old way to run it with Ammonite |