Racc::Parserクラス

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

スーパークラス

Object

定数

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

メソッド

ここに載っているもののほか、プリフィクス "racc_" および "_racc_" が ついたメソッドはパーサの予約名です。そのようなメソッドは使わないで ください。

do_parse

このメソッドを呼ぶことによってパースが開始します。また、トークンが必要 になった時は next_token を呼び出します。

next_token [abstract]

パーサが次のトークンを読みこむ時に使います。[記号, その値]の形式の配列 を返してください。記号はデフォルトでは

  • 文法中、引用符でかこまれていないもの
    →その名前の文字列のシンボル (たとえば :ATOM )
  • 引用符でかこまれているもの
    →その文字列そのまま(たとえば、'=')
で表します。これを変更する方法については、 文法リファレンスを参照してください。

また、もう送るシンボルがなくなったときには [false, なにか] を返してください。これを忘れるとわけのわからないパースエラーに なります (一回送れば十分です)。ただし 1.3.7 からは試験的に nil も終端として認めるようにしています。

このメソッドは抽象メソッドなので do_parse を使う場合は 必ず下位クラスで再定義する必要があります。定義しないままパー スを始めると例外 NotImplementedError が発生します。

yyparse( recv, mid )

このメソッドを呼ぶことによってパースが開始します。このメソッドでは始め てトークンが必要になった時点で recv に対して mid メソッドを呼び出し、そのブロックからトークンを得ます。つまり recv#midというメソッドを用意して yyparse(recv,mid) とすれば recv#mid からトー クンを yield して渡すことができます。yield するのは next_token と同じ形式の [記号, 値] です。さらに このような動作は Ruby の yield の特性から

yield 記号, 値
と書けます。いちおう書いておくと
yield [記号, 値]
は意図したのとは違って
yield()[記号, 値]
になります。

少し注意が必要なのは、recv#mid が呼び出されるのは始めてトー クンが必要になった時点であるということで、つまりその時点でもうパースが 進行中だということです。よって recv#mid の最初でパースの 初期化をするとうまくいかない場合があります。それから、トークンの終端を 示す[false, なにか] を渡したらそれ以上は yield しないでください。その場合には例外が発生します。

さらにさらに言うと、recv#mid では必ず yield してください。しない場合は何が起きても責任持てません。

on_error( err_tok, err_val, _values )

パーサコアが文法エラーを検出するとよびだします(yacc での yyerror)。エラーメッセージを出すなり、例外を発生するなり してください。このメソッドからもどったあとは、パーサはエラー回復モード に移行します。

引数は、err_tok がパースエラーをおこした記号(の内部表現の整 数)、err_val がその値、_values はその時点の値ス タックです。err_toktoken_to_str で文法ファ イル上の表現に直せます。また _values を変更してはいけません。

デフォルトでは例外 ParseError を発生します。

token_to_str( t )

Racc トークンの内部表現(整数)を文法ファイル上の記号表現の文字列に変換 します。t が整数でない場合は NameError を発生 します。t が範囲外の整数だった場合は nil を返 します。

yyerror

エラー回復モードに入ります。このとき on_error は呼ばれません。 アクション以外からは呼び出さないでください。

yyerrok

エラー回復モードから復帰します。アクション以外からは呼び出さないでくだ さい。

yyaccept
すぐに値スタックの先頭の値を返して do_parseyyparse を抜けます。

Copyright (c) 1999-2001 Minero Aoki <aamine@cd.xdsl.ne.jp>