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

时间:2012-10-09 16:20:54

标签: ruby regex parsing

这些解析并执行正常:

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

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

"=".scan /=/

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

"=".scan /^=/

发生了什么事?

1 个答案:

答案 0 :(得分: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;
    }

请注意第二个nextc()中的if项检查。供参考,tOP_ASGN is

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

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

这表明

中的/=/
'='.scan /=/

被视为除法运算符(/=),后跟start-regex-literal(/)。

你会遇到麻烦(略有不同):

' ='.scan / =/

但不是这样:

' ='.scan(/ =/)

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

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