irof文が実装できたよ。そう、Javaでもね!

この記事はいろふ Advent Calendar 201320日目の記事です.
昨日は@mao_instantlifeさんの「いろふインスタンスの生成原理について考察してみる #irof_history」でした.
明日は@s_kozakeさんです.

まさかの二回目の記事です.
鬼のような所業にあってしまいました.

タイトルの元ネタは,昨年のいろふ Advent Calendarの4日目の記事の「irof文が実装できたよ。そう、Scalaならね!」(@daiksyさん)です.
daiksyさんの記事ではScalaでirof構文を実装していました.
今回はJavaでirof構文を実装してみました.
決してネタかぶりではありません.決してネタかぶりではありません.*1

irof文って?

irof文というのはif文のことです.
elseに対応するelofも存在しています.
詳しくはdaiksyさんの記事を参考してください.

Javaでirof文

Scalaでの実装の際はライブラリとしてのサポートでした.
Javaではif文などと同様の文法でメソッドなどを呼び出す事ができないためライブラリでのサポートはできません.

ですので言語処理系でサポートしてしまいましょう!

今回はirof文とerof文,そしてfor文と同等のfori文*2を実装します.
ついでに,interfaceと同義のinef,instanceofと同義のinofも実装しています.

ちなみに今回の記事は僕が所属している立命館コンピュータクラブで行なった「Javaの予約語を日本語化した」というLTの時の実装をベースとしています.

実装方法について軽く説明します.
まず,Javaでは予約語トークンはトークンと予約語が1対1対応するように宣言されています.
例えば,PRIVATEというトークンは「private」という予約語と,STATICというトークンは「static」という予約語に対応しています.
当然,IFというトークンは「if」と,ELSEというトークンは「else」と,FORというトークンは「for」と対応しています.
そこで1対n対応に実装を変えて,IFというトークンが「if」と「irof」に対応するようにします.

そんなふうに実装を変更したリポジトリこちらになります.

こんなふうにトークンに複数の対応を持たせています.

        ELSE("else", "elof"),
        FOR("for", "fori"),
        IF("if", "irof"),
        INSTANCEOF("instanceof", "inof"),
        INTERFACE("interface", "inef"),

こうしてできたirof構文を使ってFizzBuzzを書いてみます.*3

public inef Main // interfaceの定義
{
    public static void main(String[] args)
    {
        fori (int i = 0; i < 100; i++)
        {
            irof (i % 15 == 0)
            {
                System.out.println("FizzBuzz");
            }
            elof irof (i % 3 == 0)
            {
                System.out.println("Fizz");
            }
            elof irof (i % 5 == 0)
            {
                System.out.println("Buzz");
            }
            elof
            {
                System.out.println(i);
            }
        }
    }
}

このプログラムは上記のリポジトリのjavacを使えば実際にコンパイルできますのでぜひ試してみたください.
ちなみに,JDK8のリポジトリをベースにしているのでinterface内にstaticメソッドが定義できています.

*1:大事なことなので(ry

*2:irofを逆にしたもの

*3:Streamは使っていません