2012-10-09 9 views
6

Diese Parse und führen fein:Ruby: Warum verursacht Gleichheitszeichen in Literal Regexp Ursache Analysefehler?

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

Dies bewirkt, dass "ungekündigten regexp trifft das Ende der Datei":

"=".scan /=/ 

Wenn ich etwas vor dem = einfügen geht der Fehler weg:

"=".scan /^=/ 

Was ist los?

+0

Ich denke, es ist es zu analysieren als ("=". Scan)/(= /) –

+0

Beachten Sie, dass "" =. Scan/\ =/'funktioniert auch. –

+1

@FrederickCheung: Ich würde '('='. Scan)/= (/)' erraten und dass der op = Sonderfall im Parser falsch rät. Vielleicht nicht. –

Antwort

3

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.

+0

Aber offensichtlich nicht zu alt und launisch, um C-Code zu durchforsten :). Ugh, ''='. Scan/= /' war ein weiterer Geistesblitz. Ich gehe davon aus, dass es so parsiert, als würde es durch '= /' dividieren. – Kelvin

+0

Oder alt und verschroben genug, um Rechtfertigung für meine Vermutungen zu haben und alt und verschroben genug, um C in mein Gehirn gebrannt zu haben :) Ich denke, du hast Recht, wie '/ = /' geparst wird. –

+1

+1 "Ich setze alle meine Methodenaufrufe in Klammern, weil ich zu alt und verschroben bin, um mir Sorgen zu machen, wie sich der Parser verhalten wird." Ich harre immer wieder in Code-Reviews darüber. Nur weil wir Klammern * manchmal * ignorieren können, heißt das nicht, dass wir es tun sollten. –

Verwandte Themen