From: KIMURA Koichi <hogemuta@...>
Date: 2008-09-23T14:43:17+09:00
Subject: [ruby-dev:36478] ripper dose't recognize '__ENCODING__' keyword

木村です。

とりあえず ruby-devで訊きますが、必要があれば redmineへの登録もします。

Rubyについて Part 32
http://pc11.2ch.net/test/read.cgi/tech/1215531152/589

で触れられている

require 'ripper'
p Ripper.lex("puts __ENCODING__")

>[Ripper FATAL] unknown token 306 (RuntimeError)

なんでだろか

ruby 1.9.0 (2008-08-26 revision 18849) [i686-linux]

ですが、直後の590氏の推測通り、フォローすべき変更をripperでやっていない
ためのようです。

現在 keywords ファイルには

struct kwtable;
%%
__ENCODING__, {keyword__ENCODING__, keyword__ENCODING__}, EXPR_END
__LINE__, {keyword__LINE__, keyword__LINE__}, EXPR_END
__FILE__, {keyword__FILE__, keyword__FILE__}, EXPR_END
BEGIN, {keyword_BEGIN, keyword_BEGIN}, EXPR_END


と __ENCODING__ がありますが、ext/ripper/eventids2.cにある
テーブル

static const struct token_assoc {
    int token;
    ID *id;
} token_to_eventid[] = {

に __ENCODING__ に対応すると思われるものはありません。

    {keyword_yield,	&ripper_id_kw},
    {keyword__FILE__,	&ripper_id_kw},
    {keyword__LINE__,	&ripper_id_kw},
    {keyword_BEGIN,	&ripper_id_kw},
    {keyword_END,	&ripper_id_kw},
    {tAMPER,		&ripper_id_op},

とあるので、この辺に keyword__ENCODING__ のエントリを追加
してやれば良いかとも思うのですが確認していません。

少なくともこのファイルはkeywords等の変更に従って自動生成されるもの
ではないようなので、手で修正する必要があると思われます。

-- 
木村浩一/KIMURA Koichi
 I thought what I'd do was, I'd pretend I was one of those deaf-mutes or
shoud I?
 mail kbk at kt.rim.or.jp
 web  www.kt.rim.or.jp/~kbk/zakkicho/index.html