PL/0'コンパイラをJavaで書いたものをもとにして、JavaCCでparserを作り直したものです.
JavaCCでは、字句規則と構文規則を一つのファイルに記述します。構文規則は、recursive descent parserを記述するような形で書けばよく、その構文規則の途中に意味規則を書いていけばよいです。
各非終端記号には1つのrecursiveな関数が対応します。
それをPL/0'用に書いたものがpl0.jjです。
yaccのようなLRパーサ生成系では、基本的には合成属性しか使えず、相続属性が書きにくいです。
それに対して、recursive descent parserでは、相続属性は非終端記号に対応する関数の引数とすればよいです。
さらに、recursive descent parserとする場合は、構文規則を正規右辺文法の形で書くことができるので、
圧縮した形で書くことができます。
なお、JavaCCはLL(k)文法を扱うことができますが、デフォルトではlookaheadは1つしかしていません。
したがって、LL(1)文法になっていない部分についてはlookaheadの仕方を指定する必要があります。
PL/0'の文法では、非終端記号factorについて2トークンのlookaheadが必要ですので、
factorメソッドでそれを指定しています。
このPL/0'では、変数名などの識別子に日本語の名前が使えるようになっています。
そのためにはpl0.jjの最初に
options {
UNICODE_INPUT=true;
}
としておいて、識別子の定義の中で
"\u3041"-"\u3093","\u4e00"-"\u9fa5"
などとして、平仮名や漢字のUNICODEの範囲を書けばよいです。
Java版のプログラムファイルのうちTable.javaとCodeGen.java, CodeGenB.javaはほとんどそのまま使い、
GetSource.javaはそれらから使われている部分だけを残して、それ以外は削除しました。
ただし、JavaCCが生成するメソッドはstaticメソッドなので、それにあわせてTable.javaとGetSource.java
のメソッドはstaticとしました。CodeGen.javaとCodeGenB.javaはそのどちらかのインスタンスを作る
ことになるので、それらのメソッドはインスタンスメソッドのままとしました。
使い方はJava版と同じで
$ java pl0/PL0 オプション指定 ソースファイル名
です.parser generatorを使うとJava版のようなきめ細かいエラーチェックや出力が難しいので、
それらは省略しています。
オプション指定は'-'で始まる1つの文字列で,その中に
このうち、Compile.java以降のファイルはpl0.jjをJavaCCが 処理した結果生成されたものです。