<a name="parser">Racc::Parserクラス</a>

# 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_tok は `token_to_str` で文法ファ イル上の表現に直せます。また `_values` を変更してはいけません。

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

`token_to_str( t )`

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

`yyerror`

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

yyerrok

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

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