2012-10-09 9 views
6

これらの解析と罰金を実行します。Ruby:equalsが正規表現の正規表現でなぜ解析エラーを引き起こすのですか?

"=".scan(/=/) 
"=".scan (/=/) 

をこれが "終端されていない正規表現は、ファイルの終わりを満たしている" 原因:

"=".scan /=/ 

私は=前に何かを挿入すると、エラーが消える:

"=".scan /^=/ 

何が起こっているのですか?

+0

( "="スキャン)/(= /) –

+0

"" = "。scan/\ = = /"ということにも注意してください。 –

+1

@FrederickCheung:私は '( '='。scan)/ =(/)'と推測し、パーサのop =特殊な場合は間違っていると推測しています。多分そうではありません。 –

答えて

3

私はあなたがthis in the parserを打っていることを推測している:

case '/': 
    if (IS_BEG()) { 
     lex_strterm = NEW_STRTERM(str_regexp, '/', 0); 
     return tREGEXP_BEG; 
    } 
    if ((c = nextc()) == '=') { 
     set_yylval_id('/'); 
     lex_state = EXPR_BEG; 
     return tOP_ASGN; 
    } 

は、第二ifnextc()チェックに注意してください。参考のために、tOP_ASGN is

%token <id> tOP_ASGN /* +=, -= etc. */ 

オペレータ割り当てのトークンに使用されます。

これは、それが/=/

'='.scan /=/ 

に開始正規表現リテラル(/)、続いて分周割当演算子(/=)として見られていることを示唆しています。

あなたはこれで(わずかに異なる種類の)悩みがあります:

' ='.scan/=/ 

が、ではなく、この:メソッド呼び出しは、括弧を持っていない曖昧さがしばしばあり

' ='.scan(/ =/) 

。この場合、私は演算子の優先順位のルールが適用され、それはあなたが期待しているものではないと思います。

私は、パーザがどのように動作するのか心配したいと思うには、私が古すぎ、気難しいので、私のすべてのメソッド呼び出しにかっこを入れる傾向があります。

+0

しかし、明らかにあまりにも古く、厄介ではないCコードを選別する:)。うん、 ''='。スキャン/ = /'は別のマインドベンダーだった。私はそれが '= /'で割るように解析していると仮定します。 – Kelvin

+0

または私の推測の正当化とCが私の脳の中に燃え尽きるほど奇妙なことを正当化するのに十分な古いとクランキー:)あなたは '/ = /'がどのように解析されるかについて正しいと思います。 –

+1

+1 "パーサーがどのように動作するのか心配したいと思うには、私は年を取って窮屈なので、私はすべてのメソッド呼び出しにかっこを入れる傾向があります。私はコードレビューでこれを繰り返しています。括弧を無視することができます*いくつかの*我々はそれを行う必要があることを意味しません。 –

関連する問題