JavaParser
まだ構文解析しか作っていないのに、しかも開発途中なのに、クラスの数が100を超えた。
JavaってCやC++、VBよりシンプルなハズなんだけれど、それでもコレだけのクラスが必要なのか。
作っていて感じたのだけれど、C++に似せているせいで作りづらいところがありますね。
例えばラベル付きステートメント。
Identifier : Statement
Identifierから始まる文は多いので、コロンまで読み込まないとラベル付きステートメントかどうかがわからないです。
結局、先読みし、コロンがないと読み戻す処理をしなければならないです。
もし仮にJavaが以下のように予約語が先頭にあればとてもラクに実装できます。
label Identifier:
他にも作りづらいところがあるのだけれど、極めつけがコレ。
System.out.println("Hello Java"); java.util.ArrayList = new ArrayList(); point.x = 100;
どれも、Identifier.Identifierと続いているけれど、文法上はどれも全然違うもの。
上から、メソッド呼び出し。ローカル変数宣言、代入式。
これもどれかに決めて先読みし、違ったら読み戻して別の文法として解析しなおさなければなりません。
Pascalとかよく考えられた言語なら、callとか、varとか、letとかキーワードが先頭にあったので、
すぐにわかったのですが、Javaはそれができません。
ほかに作りづらいのは、著名クラスとか、For文とか、ローカル変数宣言などです。
Thread thread = new Thread() { public void run() { hoge(); }}; for (int i=0, count=0; true; i++,count++) ... int x = 0, y = 0;
つ、作りづらい。
エレガントさを保ちながらこれらを実現するにはどうしたらいいものか・・・。