2012-10-09 14 views
6

ये पार्स और ठीक निष्पादित करें:रुबी: शाब्दिक regexp कारण पार्सिंग त्रुटि में संकेत बराबर क्यों करता है?

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

यह कारण बनता है "समाप्त नहीं की गई regexp फ़ाइल के अंत मिलता है":

"=".scan /=/ 

अगर मैं = से पहले कुछ डालने त्रुटि दूर चला जाता है:

"=".scan /^=/ 

क्या चल रहा है?

+0

मुझे लगता है कि यह इसे ("=" स्कैन)/(= /) –

+0

के रूप में पार्स कर रहा है यह नोट करना कि '"=" स्कैन/\ =/'भी काम करता है। –

+1

@FrederickCheung: मुझे लगता है कि '(' = 'स्कैन)/= (/)' और यह है कि पार्सर में 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; 
    } 

नोट दूसरा if में nextc() जांच। संदर्भ, tOP_ASGN is के लिए:

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

तो यह ऑपरेटर असाइन टोकन प्रयोग किया जाता है।

यह पता चलता है कि कि /=/

में
'='.scan /=/ 

डिवाइड असाइन ऑपरेटर (/=) एक स्टार्ट-regex-शाब्दिक (/) द्वारा पीछा के रूप में देखा जा रहा है।

आप इस बात से (एक अलग तरह की) मुसीबत होगा:

' ='.scan/=/ 

लेकिन इस:

' ='.scan(/ =/) 

वहाँ अक्सर है अस्पष्टता एक विधि कॉल कोष्ठक नहीं है जब । इस मामले में, मुझे लगता है कि ऑपरेटर प्राथमिकता नियम लागू होते हैं और यह वह नहीं है जो आप उम्मीद कर रहे हैं।

मैं अपने सभी विधि कॉल पर ब्रांड्स डालता हूं क्योंकि मैं चिंता करने के लिए बहुत पुराना और क्रैकी हूं कि पार्सर कैसे व्यवहार कर रहा है।

+0

लेकिन स्पष्ट रूप से सी कोड के माध्यम से जाने के लिए बहुत पुराना और क्रैकी नहीं है :)। उह, '' = '। स्कैन/=/'एक और दिमाग-निविदा थी। मुझे लगता है कि यह पार्सिंग है जैसा कि '= /' से विभाजित है। – Kelvin

+0

या पुरानी और क्रैकी पर्याप्त मेरे अनुमानों के लिए औचित्य और पुरानी और क्रैकी पर्याप्त है जो सी को मेरे दिमाग में जला दिया गया है :) मुझे लगता है कि आप सही हैं कि कैसे///'पार्स हो जाता है। –

+1

+1 "मैं अपने सभी विधि कॉल पर ब्रांड्स डालता हूं क्योंकि मैं चिंता करने के लिए बहुत पुराना और क्रैकी हूं कि पार्सर कैसे व्यवहार करेगा।" मैं कोड समीक्षाओं में बार-बार इस पर वीणा करता हूं। सिर्फ इसलिए कि हम कुछ समय * कोष्ठक को अनदेखा कर सकते हैं * इसका मतलब यह नहीं है कि हमें इसे करना चाहिए। –