c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

DartでのBrainfuckインタプリタ

習得しなくてもいいGoogle Dart。コンパイラではない。

// Runner.dart

interface Runner {
  String code, stdin, stdout;
  void execute();
}
// Barinfuck.dart

#library('brainfuck');

#source('Runner.dart');

class Brainfuck implements Runner {
  final List<int> memory;
  String code,
      stdin = '',
      stdout = '';
  int instructionPtr = 0,
      dataPtr = 0;

  Brainfuck() : memory = new List<int>(30000) {
    for (int i = 0; i < memory.length; ++i) memory[i] = 0;
  }

  void jumpToLoopEnd() {
    int count = 1;
    while (count > 0) {
      ++instructionPtr;
      switch (code[instructionPtr]) {
        case '[':
          ++count;
          break;
        case ']':
          --count;
          break;
      }
    }
    ++instructionPtr;
  }

  void jumpToLoopStart() {
    int count = 1;
    while (count > 0) {
      --instructionPtr;
      switch (code[instructionPtr]) {
        case '[':
          --count;
          break;
        case ']':
          ++count;
          break;
      }
    }
  }

  void step() {
    switch (code[instructionPtr]) {
      case '>':
        ++dataPtr;
        ++instructionPtr;
        break;
      case '<':
        --dataPtr;
        ++instructionPtr;
        break;
      case '+':
        ++memory[dataPtr];
        ++instructionPtr;
        break;
      case '-':
        --memory[dataPtr];
        ++instructionPtr;
        break;
      case '.':
        stdout = stdout.concat(new String.fromCharCodes([memory[dataPtr]]));
        ++instructionPtr;
        break;
      case ',':
        memory[dataPtr] = stdin.charCodeAt(0);
        stdin = stdin.substring(1);
        ++instructionPtr;
        break;
      case '[':
        if (memory[dataPtr] == 0) jumpToLoopEnd();
        else ++instructionPtr;
        break;
      case ']':
        if (memory[dataPtr] != 0) jumpToLoopStart();
        else ++instructionPtr;
        break;
      default:
        ++instructionPtr;
        break;
    }
  }

  void execute() {
    while (0 <= instructionPtr && instructionPtr < code.length) step();
  }
}

main()は、実装予定の他の言語が見えてしまうので省略。
[Brainfuck -サンプルコードを使って処理の流れを見てみよう。 http://hakugetu.so.land.to/program/brainfuck/1-4.php ]に有るの位いは支障なく動く。


Hello, world!

+++++++++[->++++++++>+++++++++++>+++++<<<]>.>++.+++++++..+++.>-.---------
---.<++++++++.--------.+++.------.--------.>+.

FizzBuzz

++++++[->++++>>+>+>-<<<<<]>[<++++>>+++>++++>>+++>+++++>+++++>>>>>>++>>++<
<<<<<<<<<<<<<-]<++++>+++>-->+++>->>--->++>>>+++++[->++>++<<]<<<<<<<<<<[->
-[>>>>>>>]>[<+++>.>.>>>>..>>>+<]<<<<<-[>>>>]>[<+++++>.>.>..>>>+<]>>>>+<-[
<<<]<[[-<<+>>]>>>+>+<<<<<<[->>+>+>-<<<<]<]>>[[-]<]>[>>>[>.<<.<<<]<[.<<<<]
>]>.<<<<<<<<<<<]

素数

>++++[<++++++++>-]>++++++++[<++++++>-]<++.<.>+.<.>++.<.>++.<.>>++[<--->-]
<..<.>.++.<.>--.>++[<+++>-]<.<.>>++[<--->-]<.>++[<++++>-]<.<.>>++[<--->-]
<-.+.<.>-.>+++[<++>-]<+.<.>>++[<--->-]<.--.<.>++.++++.<.>---.---.<.>++.-
.<.>+.+++.<.>--.--.<.>++.++++.<.>---.-----.<.>+++++.+.<.>.>++[<--->-]<.<.
>>++[<+++>-]<.----.<.>++++.++.<.>-.-----.<.>+++++.+.<.>.--.