* on__eval_string_begin, on__eval_string_end, on__add_eval_string について これは#{ }による文字列内に展開する文字列を判定している on__eval_string_begin は #{ を、 on__eval_string_end は } を、 on__add_eval_string は その中身の文字列を、 それぞれ取得できる * on__string__* や on__eval_string_* における context について "<<" なら ヒアドキュメント "<<\'" ならヒアドキュメント(「'」つき) "\"" なら 普通の文字列 "\'" なら ''でくくった文字列 "%q!" なら %q! ! でくくった文字列 "/" なら正規表現 というようになる。 つまり文字列開始文字列が入っている * contextについて その2 on__new_string, on__new_xstring などの返値によって変化させることができる。 しかし、これを変えると parse の結果が変わるので注意 ただし変わりうるのは context と Qundefとを比較しているところのみ。 普通 context は Qundef にはならない よってこれをなんらかの情報の受渡しに利用できると思われる contextへの代入をしているのは new_*stringとnew_here_document、new_regexp、 new_words のみである。 * on_call などについて Klass#hoge= というメソッド呼びだしも hoge という引数で呼びだされる これはmlhs_nodeのようにすべきでは? callしてassignが呼ばれるので かまわないのか? * on__assignable 左辺値としてとれるのは変数の文字列そのままだが、これを on__IDENTIFIER を評価した結果としたいかも。 エラーチェックを回避する必要がある * s_dispatch について on__scan を呼ぶ -> on__* を呼ぶとなっているだけ。 * tok()について tok() == parser->token_buffer * newtok() トークンバッファのクリアをする * nextc() 次の文字を取ってくる * yacc の type(記号) について * f_args f_arg など.. メソッドの仮引数。 farglistがそれらを全てまとめたもの * opt_block_var ブロック (do || ... end )の仮引数 * primary .method としてメソッドを呼びだせるもの。ほとんどの文法要素が この範疇にあるようだ * block_call ブロック付メソッド呼びだし * operation 識別子 or 定数 or メソッド識別子 * arg primary + 代入文 + 演算子による演算、 メソッドの引数の一つとして使える * ripperのbug * rip_parse_quotedwords にて、word_spaceのよびだしで空白文字が一つすくない * on__scanでの、文字列中の \n のなどの挙動 (これは \nという文字列とすべきだろう) * on__*について lexerで呼びだされるもの(s_dispatchを使うものがほとんど)とparserで呼びだされる ものは区別しよう * Ripper#pointer lex_p - lex_pbeg * Ripper#lineno これは 1 から、 File.lineno は 0 から * 複数行にわたる#{}は利用できないということににしておこう * local variable の定義は * 代入の右辺 * メソッドの仮引数 * ブロックの仮引数 * block localのスコープは無視する (そのうち let とかでてくるとそうもいかないだろう) * 識別子の取り扱いについて * IDENTIFIER * 明らかに method call だとわかるもの(fcall,callなど)はmethodとみなす * 同じスコープで local variable の定義が存在し、 method call であるかどうか不明の時は local variable とみなる (Rubyの複雑なスコープ規則は無視して単純化する) * どれにもあてはまらないものは method call * CONSTANT * 明らかに method call だとわかるもの(fcall,callなど)はmethodとみなす * それ以外はすべて普通の定数として扱う * IVAR CVAR GVAR FID は自明 * IDENTIFIERの取り扱いを正確にしようとすれば、 local variable の定義を見るときに、ブロックスコープを見ることと、 使われている所より上のみを見ることとすればよい * on__begin_do と on__end_do、push_local と pop_local のような対について スコープの管理に利用できる。i.e. スコープの管理が楽できる * local_cnt f_block_argでも呼ぶようにした * on__sdef と on__def 引数をそろえたほうが良いと思う * on__block と on__end_do 一箇所呼ぶ順序が逆のところがある。 いれかえた * 要注意記号 variable (true,false,nil,selfなどを含む) fname (op,reswordを含む) * tSTAR opに含まれているのは何故? * 非終端記号「args」、「f_arg」、「f_optarg」は配列orリストを返す