PageRenderTime 45ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/brainfuck_vm.d

http://github.com/koko1000ban/brainfuck_d
D | 101 lines | 90 code | 11 blank | 0 comment | 8 complexity | 671b5889990d13be2368ef7f9005895d MD5 | raw file
  1. #!/usr/bin/env dmd -run
  2. import std.stdio;
  3. import std.conv;
  4. import std.array;
  5. struct code {
  6. char op;
  7. int jump;
  8. }
  9. code[] parse(string source) {
  10. code[] codes;
  11. auto codeapp = appender(codes);
  12. int[] stack;
  13. foreach(op; source){
  14. code code;
  15. code.op=op;
  16. final switch(code.op){
  17. case '>', '<', '+', '-', '.', ',':
  18. codeapp.put(code);
  19. break;
  20. case '[':
  21. stack ~= to!int(codeapp.data.length);
  22. codeapp.put(code);
  23. break;
  24. case ']':
  25. auto start = stack.back();
  26. stack.popBack();
  27. codeapp.data[start].jump = to!int(codeapp.data.length);
  28. code.jump = start - 1;
  29. codeapp.put(code);
  30. break;
  31. }
  32. }
  33. code c;
  34. c.op='\0';
  35. codeapp.put(c);
  36. return codeapp.data;
  37. }
  38. void execute(code[] codes) {
  39. byte[30000] bytes;
  40. int ptr;
  41. for(int i=0;;++i) {
  42. code c = codes[i];
  43. final switch(c.op){
  44. case '>':
  45. ++ptr;
  46. break;
  47. case '<':
  48. --ptr;
  49. break;
  50. case '+':
  51. ++bytes[ptr];
  52. break;
  53. case '-':
  54. --bytes[ptr];
  55. break;
  56. case '.':
  57. write(to!char(bytes[ptr]));
  58. break;
  59. case ',':
  60. bytes[ptr] = to!byte(std.c.stdio.getchar());
  61. break;
  62. case '[':
  63. if (bytes[ptr] == 0) {
  64. i=c.jump;
  65. }
  66. break;
  67. case ']':
  68. if (bytes[ptr] != 0) {
  69. i=c.jump;
  70. }
  71. break;
  72. case '\0':
  73. return;
  74. }
  75. }
  76. }
  77. int main(string[] args) {
  78. if (args.length == 1) {
  79. writef("usage: %s <SOURCE FILE>\n", "brainfuck_vm.d");
  80. return 1;
  81. }
  82. auto fpath = args[1];
  83. if (!std.file.exists(fpath)) {
  84. writef("file not found:%s\n", fpath);
  85. return 1;
  86. }
  87. auto codes = parse(std.file.readText(fpath));
  88. execute(codes);
  89. return 0;
  90. }