parser.rb
Racc の生成するパーサはすべて Parser クラスを継承します。
Parser クラスにはパース中に使用するメソッドがいくつかあり、
そのようなメソッドをオーバーロードすると、パーサの初期化などができます。
逆に言うと、これらのメソッドを変に再定義すると挙動がおかしく
なるわけですから注意してください。
ファイル
racc/parser.rb
スーパークラス
Object
定数
プリフィックス "Racc_" がついた定数はパーサの予約定数です。
そのような定数は使わないでください。動作不可能になります。
メソッド
- do_parse
-
このメソッドを呼ぶことによってパースが開始します。また、
トークンが必要になった時は next_token を呼び出します。
- next_token [abstract]
-
パーサが次のトークンを読みこむ時に使います。[トークンシンボル,その値]
の形式の配列を返してください。トークンシンボルの値は、デフォルトでは
- 文法中、引用符でかこまれていないもの
→その名前の文字列を intern して得られるシンボル(たとえば:ATOM)
- 引用符でかこまれているもの
→その文字列そのまま(たとえば、'=')
です。これを変更する方法については、
文法リファレンスを参照してください。
また、もう送るシンボルがなくなったときには、[false,なにか] を返してください。
これを忘れるとわけのわからないパースエラーになります。(一回送れば十分です)
また、このメソッドは抽象メソッドなので、do_parse を使う場合は
必ず下位クラスで再定義する必要があります。定義しないまま
パースを始めると例外が発生します。
- yyparse( recv, mid )
-
このメソッドを呼ぶことによってパースが開始します。
このメソッドでは始めてトークンが必要になった時点で recv に対して
mid メソッドを呼び出し、そのブロックからトークンを得ます。
つまり、recv#mid というメソッドを用意して yyparse(recv,mid) とすれば
recv#mid からトークンを yield して渡すことができます。yield するのは
next_token と同じ形式の [記号, 値] です。ちなみにこれは Ruby の特性から
「yield 記号, 値」と同じです。
少し注意が必要なのは、recv#mid が呼び出されるのは始めてトークンが
必要になった時点であるということで、つまりその時点でもうパースが
進行中だということです。よって、recv#mid の最初でパースの初期化を
するとうまくいかない場合があります。また false を渡したらそれ以上は
yield しないでください。その場合には例外が発生します。
それから、recv#mid では必ず yield してください。しない場合は
どうなっても知りません。
- on_error( err_tok, err_val, _values )
-
パースエラーを検出したとき、よびだされます(yyerror)。
メッセージを出すなり、例外を発生するなりしてください。
このメソッドからもどったあとは、パーサはエラー回復モードに移行します。
引数は、err_tok がパースエラーをおこしたシンボルトークン(内部表現の整数)、
err_val がその値、_values はその時点の値スタックです。
デフォルトでは、例外 ParseError を発生します。
- yyerror
-
アクション中で呼びだすとエラー回復モードに入ります。
このとき on_error は呼ばれません。
- yyerrok
-
アクション中で呼びだすとエラー回復モードから復帰します。
- yyaccept
-
このメソッドを呼びだすとすぐに値スタックの先頭の値を返して
do_parse を抜けます。
Copyright (c) 1999-2001 Minero Aoki
<aamine@dp.u-netsurf.ne.jp>