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)
这是怎么回事?
我猜你在解析器中遇到了这个:
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)
当方法调用没有括号时,通常会出现歧义。在这种情况下,我认为运算符优先规则适用,但这不是您所期望的。
我倾向于在所有方法调用上加上括号,因为我太老了,脾气暴躁,不想担心解析器的行为方式。
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |