Ich vermute, dass Sie schlagen 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;
}
Notiere die nextc()
Prüfung in der zweiten if
. Als Referenz tOP_ASGN
is:
%token <id> tOP_ASGN /* +=, -= etc. */
so wird es für die Bedienungsperson-assign Tokens verwendet.
Dies legt nahe, dass diese in /=/
'='.scan /=/
als Geteilt-assign Operator (/=
) durch ein Start-regex-Literal (/
) gefolgt gesehen zu werden.
Sie werden Schwierigkeiten haben (von einem etwas anderen Art) mit diesem:
' ='.scan/=/
aber nicht so:
' ='.scan(/ =/)
Es häufig Unklarheit ist, wenn ein Methodenaufruf nicht Klammern hat . In diesem Fall denke ich, dass Vorrangregeln für Operatoren gelten, und das ist nicht das, was Sie erwarten.
Ich setze Klammern auf alle meine Methodenaufrufe, weil ich zu alt und verschroben bin, um mir Sorgen zu machen, wie sich der Parser verhalten wird.
Ich denke, es ist es zu analysieren als ("=". Scan)/(= /) –
Beachten Sie, dass "" =. Scan/\ =/'funktioniert auch. –
@FrederickCheung: Ich würde '('='. Scan)/= (/)' erraten und dass der op = Sonderfall im Parser falsch rät. Vielleicht nicht. –