Sana this in the parser isabet olduğunuzu tahmin ediyorum:
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;
}
Not ikinci if
içinde nextc()
çek. referans tOP_ASGN
is için:
%token <id> tOP_ASGN /* +=, -= etc. */
bu yüzden operatör atama simgeleri için kullanılır.
Bu, /=/
'='.scan /=/
bir başlangıç regex-hazır (
/
) takip bölme atayabilir operatör (
/=
) olarak görülmektedir düşündürmektedir.
Bu işle (biraz farklı bir tür) sorun olur:
' ='.scan/=/
ancak bu: Bir yöntem çağrısı parantez bulunmayan belirsizlik genellikle yoktur
' ='.scan(/ =/)
. Bu durumda, operatör önceliği kurallarının geçerli olduğunu düşünüyorum ve beklediğiniz şey bu değil.
Tüm yöntem çağrılarımda parantezler koymayı tercih ediyorum çünkü ayrıştırıcının nasıl davranacağı konusunda endişelenmek için çok yaşlı ve huysuzum.
Sanırım onu ayrıştırma ("=". Scan)/(= /) –
"" = ". Scan/\ = /' nin de çalıştığına dikkat edin. –
@FrederickCheung: Ben tahmin ediyorum ('='. Tarama)/= (/) 've op = ayrıştırıcıdaki özel durum yanlış tahmin ediyor. Belki de değil. –