2012-10-09 22 views
6

這些解析和精細執行:Ruby:爲什麼等號登錄文字regexp會導致解析錯誤?

"=".scan(/=/) 
"=".scan (/=/) 

這會導致 「未結束的正則表達式符合文件的末尾」:

"=".scan /=/ 

如果我插入=之前一些錯誤消失:

"=".scan /^=/ 

發生了什麼事?

+0

我認爲它解析爲(「=」。scan)/(= /) –

+0

注意到'「=」。scan/\ = /'也可以。 –

+1

@FrederickCheung:我猜'('='。scan)/ =(/)'並且解析器中的op =特殊情況是猜錯了。也許不是。 –

回答

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 /=/ 

被看作是隨後的起動正則表達式字面(/)分頻賦值運算符(/=)。

你有這個(略有不同種類的)麻煩:

' ='.scan/=/ 

但不是這樣的:

' ='.scan(/ =/) 

有經常模棱兩可,當一個方法調用沒有括號。在這種情況下,我認爲運營商優先規則適用,這不是您所期望的。

我傾向於在我所有的方法調用中放置圓括號,因爲我太老了,胡思亂想,不想擔心解析器的行爲。

+0

但顯然不是太老,胡思亂想,通過C代碼篩選:)。呃,''='。scan/= /'是另一個彎路。我認爲它解析就像用'= /'分開。 – Kelvin

+0

或者陳舊而胡思亂想,想要對我的猜測進行辯解,並且老舊而胡思亂想,讓C被燒進我的大腦:)我認爲你對如何解析'/ = /'是正確的。 –

+1

+1「我傾向於在我所有的方法調用中加上括號,因爲我太老了,胡思亂想,不想擔心解析器的行爲。」我在代碼評論中反覆強調這一點。只是因爲我們可以忽略括號*有時候*並不意味着我們應該這樣做。 –

相關問題