这些解析并执行正常:
"=".scan(/=/)
"=".scan (/=/)
这会导致“未终止的正则表达式符合文件末尾”:
"=".scan /=/
如果我在=
错误消失之前插入了某些内容:
"=".scan /^=/
发生了什么事?
答案 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(/ =/)
当方法调用没有括号时,通常会有歧义。在这种情况下,我认为运营商优先规则适用,而这不是您所期望的。
我倾向于在我的所有方法调用上加上括号,因为我太老了,也不敢担心解析器的行为方式。