parser.rb


Racc::Parserクラス

Racc の生成するパーサはすべて Parser クラスを継承します。 Parser クラスにはパース中に使用するメソッドがいくつかあり、 そのようなメソッドをオーバーロードすると、パーサの初期化などができます。 逆に言うと、これらのメソッドを変に再定義すると挙動がおかしく なるわけですから注意してください。

ファイル

racc/parser.rb

スーパークラス

Object

定数

プリフィックス "Racc_" がついた定数はパーサの予約定数です。 そのような定数は使わないでください。動作不可能になります。

メソッド

do_parse
このメソッドを呼ぶことによってパースが開始します。また、 トークンが必要になった時は next_token を呼び出します。
next_token [abstract]
パーサが次のトークンを読みこむ時に使います。[トークンシンボル,その値] の形式の配列を返してください。トークンシンボルの値は、デフォルトでは です。これを変更する方法については、 文法リファレンスを参照してください。

また、もう送るシンボルがなくなったときには、[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>