這些解析和精細執行:Ruby:爲什麼等號登錄文字regexp會導致解析錯誤?
"=".scan(/=/)
"=".scan (/=/)
這會導致 「未結束的正則表達式符合文件的末尾」:
"=".scan /=/
如果我插入=
之前一些錯誤消失:
"=".scan /^=/
發生了什麼事?
這些解析和精細執行:Ruby:爲什麼等號登錄文字regexp會導致解析錯誤?
"=".scan(/=/)
"=".scan (/=/)
這會導致 「未結束的正則表達式符合文件的末尾」:
"=".scan /=/
如果我插入=
之前一些錯誤消失:
"=".scan /^=/
發生了什麼事?
我猜你打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 /=/
被看作是隨後的起動正則表達式字面(/
)分頻賦值運算符(/=
)。
你有這個(略有不同種類的)麻煩:
' ='.scan/=/
但不是這樣的:
' ='.scan(/ =/)
有經常模棱兩可,當一個方法調用沒有括號。在這種情況下,我認爲運營商優先規則適用,這不是您所期望的。
我傾向於在我所有的方法調用中放置圓括號,因爲我太老了,胡思亂想,不想擔心解析器的行爲。
但顯然不是太老,胡思亂想,通過C代碼篩選:)。呃,''='。scan/= /'是另一個彎路。我認爲它解析就像用'= /'分開。 – Kelvin
或者陳舊而胡思亂想,想要對我的猜測進行辯解,並且老舊而胡思亂想,讓C被燒進我的大腦:)我認爲你對如何解析'/ = /'是正確的。 –
+1「我傾向於在我所有的方法調用中加上括號,因爲我太老了,胡思亂想,不想擔心解析器的行爲。」我在代碼評論中反覆強調這一點。只是因爲我們可以忽略括號*有時候*並不意味着我們應該這樣做。 –
我認爲它解析爲(「=」。scan)/(= /) –
注意到'「=」。scan/\ = /'也可以。 –
@FrederickCheung:我猜'('='。scan)/ =(/)'並且解析器中的op =特殊情況是猜錯了。也許不是。 –