File: //usr/share/doc/racc/ja/parser.ja.html
<?xml version="1.0" ?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>rdoc/ja/parser.ja</title>
</head>
<body>
<h1><a name="label-0" id="label-0">class Racc::Parser</a></h1><!-- RDLabel: "class Racc::Parser" -->
<p>Racc の生成するパーサはすべて Racc::Parser クラスを継承します。
Racc::Parser クラスにはパース中に使用するメソッドがいくつかあり、
そのようなメソッドをオーバーロードすると、パーサを初期化したり
することができます。</p>
<h2><a name="label-1" id="label-1">Super Class</a></h2><!-- RDLabel: "Super Class" -->
<p>Object</p>
<h2><a name="label-2" id="label-2">Constants</a></h2><!-- RDLabel: "Constants" -->
<p>プリフィクス "Racc_" がついた定数はパーサの予約定数です。
そのような定数は使わないでください。動作不可能になります。</p>
<h2><a name="label-3" id="label-3">Instance Methods</a></h2><!-- RDLabel: "Instance Methods" -->
<p>ここに載っているもののほか、プリフィクス "racc_" および "_racc_" が
ついたメソッドはパーサの予約名です。そのようなメソッドは使わないで
ください。</p>
<dl>
<dt><a name="label-4" id="label-4">do_parse -> Object</a></dt><!-- RDLabel: "do_parse -> Object" -->
<dd>
<p>パースを開始します。
また、トークンが必要になった時は #next_token を呼び出します。</p>
<pre>--
# Example
---- inner
def parse
@q = [[1,1],
[2,2],
[3,3],
[false, '$']]
do_parse
end
def next_token
@q.shift
end
--</pre>
</dd>
<dt><a name="label-5" id="label-5">next_token -> [Symbol, Object]</a></dt><!-- RDLabel: "next_token -> [Symbol, Object]" -->
<dd>
<p>[abstract method]</p>
<p>パーサが次のトークンを読みこむ時に使います。
[記号, その値] の形式の配列を返してください。
記号はデフォルトでは</p>
<ul>
<li>文法中、引用符でかこまれていないもの
→ その名前の文字列のシンボル (例えば :ATOM )</li>
<li>引用符でかこまれているもの<br>
→ その文字列そのまま (例えば '=' )</li>
</ul>
<p>で表します。これを変更する方法については、
文法リファレンスを参照してください。</p>
<p>また、もう送るシンボルがなくなったときには
[false, なにか] または nil を返してください。</p>
<p>このメソッドは抽象メソッドなので、#do_parse を使う場合は
必ずパーサクラス中で再定義する必要があります。
定義しないままパースを始めると例外 NotImplementedError が
発生します。</p>
</dd>
<dt><a name="label-6" id="label-6">yyparse( receiver, method_id )</a></dt><!-- RDLabel: "yyparse( receiver, method_id )" -->
<dd>
<p>パースを開始します。このメソッドでは始めてトークンが
必要になった時点で receiver に対して method_id メソッドを
呼び出してトークンを得ます。</p>
<p>receiver の method_id メソッドはトークンを yield しなければ
なりません。形式は #next_token と同じで [記号, 値] です。
つまり、receiver の method_id メソッドの概形は以下のように
なるはずです。</p>
<pre>--
def method_id
until end_of_file
:
yield 記号, 値
:
end
end
--</pre>
<p>少し注意が必要なのは、method_id が呼び出されるのは始めて
トークンが必要になった時点であるということです。method_id
メソッドが呼び出されたときは既にパースが進行中なので、
アクション中で使う変数を method_id の冒頭で初期化すると
まず失敗します。</p>
<p>トークンの終端を示す [false, なにか] を渡したらそれ以上は
yield しないでください。その場合には例外が発生します。</p>
<p>最後に、method_id メソッドからは必ず yield してください。
しない場合は何が起きるかわかりません。</p>
</dd>
<dt><a name="label-7" id="label-7">on_error( error_token_id, error_value, value_stack )</a></dt><!-- RDLabel: "on_error( error_token_id, error_value, value_stack )" -->
<dd>
<p>パーサコアが文法エラーを検出すると呼び出します (yacc の yyerror)。
エラーメッセージを出すなり、例外を発生するなりしてください。
このメソッドから正常に戻った場合、パーサはエラー回復モード
に移行します。</p>
<p>error_token はパースエラーを起こした記号の内部表現 (整数) です。
#token_to_str で文法ファイル上の文字列表現に直せます。</p>
<p>error_value はその値です。</p>
<p>value_stack はエラーの時点での値スタックです。
value_stack を変更してはいけません。</p>
<p>on_error のデフォルトの実装は例外 ParseError を発生します。</p>
</dd>
<dt><a name="label-8" id="label-8">token_to_str( t ) -> String</a></dt><!-- RDLabel: "token_to_str( t ) -> String" -->
<dd>
<p>Racc トークンの内部表現 (整数)
を文法ファイル上の記号表現の文字列に変換します。</p>
<p>t が整数でない場合は TypeError を発生します。
t が範囲外の整数だった場合は nil を返します。</p>
</dd>
<dt><a name="label-9" id="label-9">yyerror</a></dt><!-- RDLabel: "yyerror" -->
<dd>
エラー回復モードに入ります。このとき #on_error は呼ばれません。
アクション以外からは呼び出さないでください。
</dd>
<dt><a name="label-10" id="label-10">yyerrok</a></dt><!-- RDLabel: "yyerrok" -->
<dd>
エラー回復モードから復帰します。
アクション以外からは呼び出さないでください。
</dd>
<dt><a name="label-11" id="label-11">yyaccept</a></dt><!-- RDLabel: "yyaccept" -->
<dd>
すぐに値スタックの先頭の値を返して #do_parse、#yyparse を抜けます。
</dd>
</dl>
</body>
</html>