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.
Creo que es analizarlo como ("=". Scan)/(= /) –
Teniendo en cuenta que '" = ". Scan/\ = /' también funciona. –
@FrederickCheung: supongo que '('='. Scan)/= (/)' y que el op = caso especial en el analizador está adivinando mal. Quizás no sin embargo. –