racc.rb


全体の目次

Raccクラスは(Rubyの)文字列をうけとり、(Rubyの)文字列をかえすことしかできません。 つまり、実際にソースコードを得るには、だれかが文字列を与え、またその結果を適切な 形で書きだす(または、evalする)必要があります。
その「ひとつの実装形態」がracc.rbです。ここでは、racc.rbのやっていることと、 使いかたについて書きます。


racc.rbがしていること

racc.rbは、コマンドラインで与えられたファイル(おそらくRaccの文法ファイル)の内容を すべて読んで、Raccクラスに渡します。
Raccクラスはそれをコンパイルして、パーサクラスの初期化コードを返します。racc.rbが それをうけとって、クラス宣言などをつけ、Rubyのソースコードとしての体裁をととのえ、 ファイルに出力します。

また、racc.rbでは、特別なユーザーコードの名前 としてdriver prepare innerの3つを使います。それぞれの役割は以下のとおりです。

inner
クラス定義の「中」の先頭に転写されるコード
prepare
クラス定義の外、クラス定義の「前に」転写されるコード
driver
クラス定義の外、クラス定義の「後に」転写されるコード
また、これらのコードはすべて省略することも、コマンドラインから別のファイルを 指定することもできます。

段階別のファイル出力

通常は文法ファイル名を与えてやるだけで目的のファイルが生成されますが、その場合 コマンド発行のたびに最初から全ての段階が実行されます。inner を少し変更しただけでも また文法解析がされるわけです。これは小さな文法ならたいしたことはありませんが、 大きな文法になってくるとかなりの無駄が生じます。
このような場合、-c フラグと -l フラグを組みあわせて使うことで、文法解析とファイルの 接続を別々にやることができます。

-c フラグは、raccが生成したコードだけを出力して、ユーザーコードを捨てます。 -l フラグは、-c で生成したコードと、文法ファイルから、最終的な結果を出力します。 -p -i -d などのフラグもききます。


コマンドラインオプション

racc.rb [-clvhgP] [--version] [--help] [-ooutfile] [-epath] [-nclassname] [-iinner] [-pprepare] [-ddriver] filename [corefile]

filename
Raccの文法ファイルを指定します。拡張子は好きなものにしてください。
-ooutfile
作成するクラスをかきこむファイル名を指定します。デフォルトは.tab.rbです。
-epath
実行可能ファイルを生成します。pathはRuby本体のパスです。
-v
verbose mode。"filename".outputファイルに詳細な解析情報を出力します。
-g
出力するコードにデバッグ用コードを加えます。 これにくわえて、生成したパーサのinitializeあたりで@__debug__をtrueに セットすることで、デバッグ用のコードが出力されるようになります。
くりかえしますが、-gをつけるだけでは何もおこりませんので注意してください。
-nclassname
作成するクラスの名前を指定します。文法中の指定を上書きします。
-iinner
文法ファイル中の「inner」コードのかわりに、指定したファイルの内容を使った ソースコードを出力します。
-pprepare
文法ファイル中の「prepare」コードのかわりに、指定したファイルの内容を 使ったソースコードを出力します。
-ddriver
文法ファイル中の「driver」コードのかわりに、指定したファイルの内容を使います。
-c
racc の生成したコード部分(corefile)のみを出力して、残りの部分を捨てます。
-l
与えられたファイル名を -c フラグで出力されたファイル(corefile)の名前と仮定して、 残りのコードとの連結をおこないます。クラス名などもつけます。このとき、racc ソースを 同時に与えてやるとそこからクラス名やinner prepare などの情報を取得します。
-P
実行段階ごとの所要時間を出力します。
-Ssuper_cls
パーサのスーパークラスをsuper_clsに変更します。
-Xreqfile
通常のparser.rbのかわりにreqfileをrequireするコードを出力します。
-Rreqfile
通常のlibracc.rbのかわりにreqfileをロードします。デバッグ用です。
--version
Raccのバージョンを出力して終了します。
--help
オプションの簡単な説明を出力して終了します。

Copyright(c) 1998-1999 Minero Aoki