PL/0'コンパイラのJavaCC版


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が 処理した結果生成されたものです。


サンプルプログラム


戻る