クラス型の変数の宣言の構文

久々に言語話を。こんな宣言があったとき、

Hoge a;

Hogeが出てきた時点では、これがクラス名だか変数名だか関数名だか区別が付きません。

Hoge[] a;

だと、Hoge[まで見ても区別できないので、何も考えずに文法を書くとyaccはconflictを出します。
Cでは、「typedefした型はその時点でレキシカルアナライザ側のテーブルに登録する」という手が使えますが、これはCではtypedefを必ず使う前に書かなければならないからこそできる技で、Diksamでそうするのはいかにもダサいです。
今更ながら、DiksamもPascalみたいに型を後置する構文にしときゃ楽だったんですが、前置に決めてしまったもんなあ…
というわけで、例によってJavaの文法をパクります。

http://www.y-adagio.com/public/standards/tr_javalang/19.doc.htm#44543

でもこれだけでは解決しなくて、Diksam ver.0.2ではIDENTIFIERがprimary_no_new_arrayにあったのを、同じ理由でprimary_expressionに持ってこないといけないようです。ただ、下記を読むと、キャストを考えるとpostfix_expressionでなければならないようなのでそっちに移動しました。追記:これをやってしまうと、a = 10のようにいきなり識別子がくる式で、aが型名と間違えられたので修正。さらに追記:IDENTIFIERをprimary_expressionに持ってくるのなら、配列アクセスのほうでIDENTIFIER [ expression ]を別に書かないと、a[5]とかが文法エラーになります。Javaの構文規則のArrayAccessのとこ参照。

http://www.y-adagio.com/public/standards/tr_javalang/15.doc.htm#23302

該当箇所の説明を書くとき忘れないようにメモ。