这些解析和执行很好:
"=".scan(/=/)
"=".scan (/=/)
这会导致“未终止的正则表达式遇到文件结尾”:
"=".scan /=/
=
如果我在错误消失之前插入一些东西:
"=".scan /^=/
这是怎么回事?
我猜你在解析器中遇到了这个问题:
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(/ =/)
当方法调用没有括号时,通常会产生歧义。在这种情况下,我认为运算符优先规则适用,这不是您所期望的。
我倾向于在我所有的方法调用上加上括号,因为我太老了而且脾气暴躁,不想担心解析器的行为方式。