racc.rb
全体の目次
Raccクラスは(Rubyの)文字列をうけとり、(Rubyの)文字列をかえすことしかできません。
つまり、実際にソースコードを得るには、だれかが文字列を与え、またその結果を適切な
形で書きだす(または、evalする)必要があります。
その「ひとつの実装形態」が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