class Racc::Parser
Racc
の生成するパーサはすべて Racc::Parser
クラスを継承します。
Racc::Parser
クラスにはパース中に使用するメソッドがいくつかあり、
そのようなメソッドをオーバーロードすると、パーサを初期化したり
することができます。
Super Class
Object
Constants
プリフィクス "Racc_"
がついた定数はパーサの予約定数です。
そのような定数は使わないでください。動作不可能になります。
ここに載っているもののほか、プリフィクス "racc_"
および "_racc_"
が
ついたメソッドはパーサの予約名です。そのようなメソッドは使わないで
ください。
do_parse
→ Object
パースを開始します。
また、トークンが必要になった時は #next_token
を呼び出します。
# Example ---- inner def parse @q = [[1,1], [2,2], [3,3], [false, '$']] do_parse end def next_token @q.shift end
next_token
→ [Symbol, Object]
[abstract method]
パーサが次のトークンを読みこむ時に使います。
[
記号, その値] の形式の配列を返してください。
記号はデフォルトでは
ATOM )
'=' )
で表します。これを変更する方法については、文法リファレンスを参照してください。また、もう送るシンボルがなくなったときには[false,
なにか] または nil
を返してください。このメソッドは抽象メソッドなので、#do_parse
を使う場合は必ずパーサクラス中で再定義する必要があります。定義しないままパースを始めると例外 NotImplementedError
が発生します。yyparse( receiver, method_id )
パースを開始します。このメソッドでは始めてトークンが
必要になった時点で receiver
に対して method_id
メソッドを
呼び出してトークンを得ます。
receiver
の method_id
メソッドはトークンを yield
しなければ
なりません。形式は #next_token
と同じで [
記号, 値] です。
つまり、receiver
の method_id
メソッドの概形は以下のように
なるはずです。
def method_id until end_of_file : yield 記号, 値 : end end
少し注意が必要なのは、method_id
が呼び出されるのは始めて
トークンが必要になった時点であるということです。method_id
メソッドが呼び出されたときは既にパースが進行中なので、
アクション中で使う変数を method_id
の冒頭で初期化すると
まず失敗します。
トークンの終端を示す [false,
なにか] を渡したらそれ以上は
yield
しないでください。その場合には例外が発生します。
最後に、method_id
メソッドからは必ず yield
してください。
しない場合は何が起きるかわかりません。
on_error( error_token_id, error_value, value_stack )
パーサコアが文法エラーを検出すると呼び出します (yacc
の yyerror)
。
エラーメッセージを出すなり、例外を発生するなりしてください。
このメソッドから正常に戻った場合、パーサはエラー回復モード
に移行します。
error_token
はパースエラーを起こした記号の内部表現 (整数) です。
#token_to_str
で文法ファイル上の文字列表現に直せます。
error_value
はその値です。
value_stack
はエラーの時点での値スタックです。
value_stack
を変更してはいけません。
on_error
のデフォルトの実装は例外 ParseError
を発生します。
token_to_str( t )
→ String
Racc
トークンの内部表現 (整数)
を文法ファイル上の記号表現の文字列に変換します。
t
が整数でない場合は TypeError
を発生します。
t
が範囲外の整数だった場合は nil
を返します。
yyerror
エラー回復モードに入ります。このとき #on_error
は呼ばれません。
アクション以外からは呼び出さないでください。
yyerrok
エラー回復モードから復帰します。 アクション以外からは呼び出さないでください。
yyaccept