2012-10-09 49 views
6

Estos analizar y ejecutar bien:Ruby: ¿Por qué el signo igual en literal regexp causa un error de análisis?

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

Esto hace que "expresión regular sin terminar cumple final del archivo":

"=".scan /=/ 

Si inserto algo antes de la = el error desaparece:

"=".scan /^=/ 

¿Qué está pasando?

+0

Creo que es analizarlo como ("=". Scan)/(= /) –

+0

Teniendo en cuenta que '" = ". Scan/\ = /' también funciona. –

+1

@FrederickCheung: supongo que '('='. Scan)/= (/)' y que el op = caso especial en el analizador está adivinando mal. Quizás no sin embargo. –

Respuesta

3

supongo que usted está golpeando 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; 
    } 

Nota del nextc() de verificación en la segunda if. Como referencia, tOP_ASGN is:

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

por lo que se utiliza para los tokens por el operador de asignación.

Esto sugiere que /=/ que en

'='.scan /=/ 

está siendo visto como el operador de división de asignación (/=) seguido de una puesta en expresiones regulares literal (/).

Vas a tener problemas (de un tipo ligeramente diferente) con esto:

' ='.scan/=/ 

pero no esto:

' ='.scan(/ =/) 

A menudo hay ambigüedad cuando una llamada al método no tiene paréntesis . En este caso, creo que se aplican las reglas de precedencia del operador y eso no es lo que estás esperando.

Tiendo a poner paréntesis en todas mis llamadas a métodos porque soy demasiado viejo y de mal humor para querer preocuparme sobre cómo se comportará el analizador.

+0

Pero obviamente no es demasiado viejo y malhumorado para pasar por el código C :). Ugh, ''='. Scan/= /' era otra forma de pensar. Supongo que está sintiendo como dividiendo por '= /'. – Kelvin

+0

O lo suficientemente viejo y malhumorado como para querer justificación para mis conjeturas y viejo y lo suficientemente irritable como para tener C grabado en mi cerebro :) Creo que tienes razón en cómo '/ = /' se analiza. –

+1

+1 "Tiendo a poner paréntesis en todas mis llamadas a métodos porque soy demasiado viejo y de mal humor para querer preocuparme sobre cómo se comportará el analizador". Arpa en esto repetidamente en revisiones de código. El hecho de que podamos ignorar los paréntesis * algunas veces * no significa que debamos hacerlo. –

Cuestiones relacionadas