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()第二个中的检查if。供参考,tOP_ASGN

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

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

这表明/=/

'='.scan /=/

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

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

' ='.scan / =/

但不是这个:

' ='.scan(/ =/)

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

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

于 2012-10-09T17:12:04.567 回答