2012-10-09 32 views
6

Bunlar ayrıştırma ve ince yürütün:Ruby: eşittir neden eşit regexp neden ayrıştırma hatası neden olur?

Bu neden
"=".scan(/=/) 
"=".scan (/=/) 

"sonlandırılmamış regexp'in dosyasının sonuna karşılamaktadır": Ne = önce bir şeyler eklerseniz

"=".scan /=/ 

Hata kaybolduktan:

"=".scan /^=/ 

Neler oluyor?

+0

Sanırım onu ​​ayrıştırma ("=". Scan)/(= /) –

+0

"" = ". Scan/\ = /' nin de çalıştığına dikkat edin. –

+1

@FrederickCheung: Ben tahmin ediyorum ('='. Tarama)/= (/) 've op = ayrıştırıcıdaki özel durum yanlış tahmin ediyor. Belki de değil. –

cevap

3

Sana this in the parser isabet olduğunuzu tahmin ediyorum:

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; 
    } 

Not ikinci if içinde nextc() çek. referans tOP_ASGN is için:

%token <id> tOP_ASGN /* +=, -= etc. */ 

bu yüzden operatör atama simgeleri için kullanılır.

Bu, /=/

'='.scan /=/ 

bir başlangıç ​​regex-hazır ( /) takip bölme atayabilir operatör ( /=) olarak görülmektedir düşündürmektedir.

Bu işle (biraz farklı bir tür) sorun olur:

' ='.scan/=/ 

ancak bu: Bir yöntem çağrısı parantez bulunmayan belirsizlik genellikle yoktur

' ='.scan(/ =/) 

. Bu durumda, operatör önceliği kurallarının geçerli olduğunu düşünüyorum ve beklediğiniz şey bu değil.

Tüm yöntem çağrılarımda parantezler koymayı tercih ediyorum çünkü ayrıştırıcının nasıl davranacağı konusunda endişelenmek için çok yaşlı ve huysuzum.

+0

Ama açıkça C kodu ile elemek için çok eski ve huysuz değil :). Ugh, ''' 'tarama/= /' başka bir beynin bükücüydü. '=/'Ile bölündüğünü sanıyorum. – Kelvin

+0

Ya da tahminlerimin ve C'nin beynimin yanmasına yetecek kadar yaşlı ve kıkırdamak için gerekçelendirmek için yaşlı ve kıkırdar :) Sanırım, '/ =/'nasıl ayrıştırıldığına dair haklısınız. –

+1

+1 "Tüm yöntem çağrılarımda parantezler koymayı tercih ediyorum çünkü ayrıştırıcının nasıl davranacağı konusunda endişelenmek için çok yaşlı ve huysuzum." Bunu kod gözden geçirmelerde tekrar tekrar yapıyorum. Sadece parantezi göz ardı edemeyeceğimiz için * bazı zamanlar * yapmamız gerektiği anlamına gelmez. –

İlgili konular