うまる言語（Brainf*ck + java）

いまさらながら、[ジョジョ言語](http://d.hatena.ne.jp/toyoshi/20100208/1265587511)などを見てやりたくなったので...

## 完成コード
https://gist.github.com/hmhmsh/7f8cc583bd1ffa7dbdbb127af3e008aa

## Brainf*ck
正式名称はあれなので、伏字ですが...
（わからない方は[こちら](https://ja.wikipedia.org/wiki/Brainfuck)を）

有名な8つの命令だけでかける言語ですね！
これを使っていきます

## Brainf*ckの機能をJavaで
ここが一番苦労しました....

### 処理フロー
`File読み込み -> 文字列作成 -> 各文字の読み込み -> 各文字に対する処理`

大まかに4つです

- `File読み込み`は`compileFile`メソッド
- `文字列作成`と`各文字の読み込み`は`compileString`メソッド
- `各文字に対する処理`は`compile`メソッド

コード貼ると長くなってしまうので、省略します...ごめんなさい...
詳細は`ClearBrain.java`に書いてあります

## 継承クラス作成
うまる言語なので、`Umaru`クラスをw

```Umaru.java
public class Umaru extends ClearBrain {
    public static void main(String[] args) {
        Umaru cb = new Umaru(args[0]);
    }

    public Umaru(String str) {
        super(str);
    }

    @Override
    public void initTokenList() {
        Token.NEXT.text = "あーーーーっと！！ここで出ました！！うまる選手必殺のスクリューー泳法ー！！";
        Token.PREVIOUS.text = "だらけるのも楽じゃないんだよ！お兄ちゃん！！";
        Token.INC.text = "お兄ちゃん！";
        Token.DEC.text = "お願いお兄ちゃん！！コンビニで買ってきて？";
        Token.GET.text = "ウへへ。。。";
        Token.PUT.text = "うまる…きかーーん！！";
        Token.LOOP.text = "いちまんえん!!! 何どうしたの!? うまるにワイロは効かないよ!!";
        Token.JUMP.text = "人生に、無駄も必要だと考えるうまるです。";
    }
}
```
実行時に引数として、言語のファイルを指定すると、`main`メソッドの引数として、取得できます
また、`initTokenList`を`Override`すれば、実質なんでもいけますw

## うまる言語ファイル

```helloworld.umaru
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
いちまんえん!!! 何どうしたの!? うまるにワイロは効かないよ!!
あーーーーっと！！ここで出ました！！うまる選手必殺のスクリューー泳法ー！！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
あーーーーっと！！ここで出ました！！うまる選手必殺のスクリューー泳法ー！！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
あーーーーっと！！ここで出ました！！うまる選手必殺のスクリューー泳法ー！！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
だらけるのも楽じゃないんだよ！お兄ちゃん！！
だらけるのも楽じゃないんだよ！お兄ちゃん！！
だらけるのも楽じゃないんだよ！お兄ちゃん！！
お願いお兄ちゃん！！コンビニで買ってきて？
人生に、無駄も必要だと考えるうまるです。
あーーーーっと！！ここで出ました！！うまる選手必殺のスクリューー泳法ー！！
うまる…きかーーん！！
あーーーーっと！！ここで出ました！！うまる選手必殺のスクリューー泳法ー！！
お兄ちゃん！
お兄ちゃん！
うまる…きかーーん！！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
うまる…きかーーん！！
うまる…きかーーん！！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
うまる…きかーーん！！
あーーーーっと！！ここで出ました！！うまる選手必殺のスクリューー泳法ー！！
お願いお兄ちゃん！！コンビニで買ってきて？
うまる…きかーーん！！
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
うまる…きかーーん！！
だらけるのも楽じゃないんだよ！お兄ちゃん！！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
うまる…きかーーん！！
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
うまる…きかーーん！！
お兄ちゃん！
お兄ちゃん！
お兄ちゃん！
うまる…きかーーん！！
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
うまる…きかーーん！！
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
お願いお兄ちゃん！！コンビニで買ってきて？
うまる…きかーーん！！
あーーーーっと！！ここで出ました！！うまる選手必殺のスクリューー泳法ー！！
お兄ちゃん！
うまる…きかーーん！！
```
長すぎるw
（お兄ちゃんを入れすぎて、うるさくなってますねw）

## 実行
なにはともあれ、実行です

```
$ javac Umaru.java
$ java Umaru hellworld.umaru
```
同時にやるなら

```
$ javac Umaru.java; java Umaru hellworld.umaru
```
でいけます

## 結果

おわかりのとおり...w

```
Hello, world!
```

## 追記
継承クラスはなんでもいけると思って、ジョジョ言語をやって気づいたのですが、定義されてない文字が来た時に無限ループになってしまいます...
（あとで修正せねば...）

## 参考
[プログラミング言語Tippy(Brainf*ckのGroovy実装)](http://qiita.com/ligun/items/720d26849542105a1da7)
GitHub : [brainf*ck-java](https://github.com/fabianishere/brainfuck-java)
[Hello_worldプログラムの一覧](https://ja.wikipedia.org/wiki/Hello_worldプログラムの一覧#Brainfuck)