6

これらは正常に解析および実行されます。

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

これにより、「終了していない正規表現がファイルの終わりに達します」が発生します。

"=".scan /=/

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

"=".scan /^=/

どうしたの?

4

1 に答える 1

3

パーサーでこれを打っていると思います:

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;
    }

nextc()2 番目のチェックに注意してくださいif。参考までtOP_ASGN

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

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

これは/=/

'='.scan /=/

/=除算代入演算子 ( ) の後に start-regex-literal ( ) が続くと見なされ/ます。

これで(少し異なる種類の)問題が発生します:

' ='.scan / =/

しかし、これではありません:

' ='.scan(/ =/)

メソッド呼び出しに括弧がない場合、あいまいさが生じることがよくあります。この場合、演算子の優先順位規則が適用されると思いますが、それはあなたが期待しているものではありません。

私は年を取りすぎて気難しいので、パーサーがどのように動作するかを心配したくないので、すべてのメソッド呼び出しに括弧を付ける傾向があります。

于 2012-10-09T17:12:04.567 に答える