Ruby:为什么equals签名文字regexp导致解析错误?

Kel*_*vin 6 ruby regex parsing

这些解析并执行正常:

"=".scan(/=/)
"=".scan (/=/)
Run Code Online (Sandbox Code Playgroud)

这导致"未终止的正则表达式符合文件末尾":

"=".scan /=/
Run Code Online (Sandbox Code Playgroud)

如果我=在错误消失之前插入了一些内容:

"=".scan /^=/
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

mu *_*ort 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;
    }
Run Code Online (Sandbox Code Playgroud)

注意nextc()第二个中的检查if。作为参考,tOP_ASGN

%token <id> tOP_ASGN    /* +=, -=  etc. */
Run Code Online (Sandbox Code Playgroud)

因此它用于操作员分配令牌。

这表明,/=/

'='.scan /=/
Run Code Online (Sandbox Code Playgroud)

被视为除法赋值运算符 ( /=) 后跟一个起始正则表达式文字 ( /)。

你会遇到(稍微不同的)问题:

' ='.scan / =/
Run Code Online (Sandbox Code Playgroud)

但不是这个:

' ='.scan(/ =/)
Run Code Online (Sandbox Code Playgroud)

当方法调用没有括号时,通常会出现歧义。在这种情况下,我认为运算符优先规则适用,但这不是您所期望的。

我倾向于在所有方法调用上加上括号,因为我太老了,脾气暴躁,不想担心解析器的行为方式。