Tôi đoán rằng bạn đang đánh 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;
}
Lưu ý nextc()
dấu check ở mục thứ hai if
. Để tham khảo, tOP_ASGN
is:
%token <id> tOP_ASGN /* +=, -= etc. */
vì vậy nó được sử dụng cho thẻ hành động gán.
Điều này cho thấy rằng /=/
trong
'='.scan /=/
đang được xem như là các nhà điều hành chia-assign (/=
) tiếp theo là một sự khởi đầu-regex-đen (/
).
Bạn sẽ gặp khó khăn (của một loại hơi khác nhau) với điều này:
' ='.scan/=/
nhưng không này:
' ='.scan(/ =/)
thường có sự nhập nhằng khi một lời gọi phương thức không có dấu ngoặc . Trong trường hợp này, tôi nghĩ rằng các quy tắc ưu tiên của toán tử được áp dụng và đó không phải là những gì bạn mong đợi.
Tôi có xu hướng đặt dấu ngoặc đơn trên tất cả các cuộc gọi phương thức của mình vì tôi quá già và cáu kỉnh muốn lo lắng về cách trình phân tích cú pháp sẽ hoạt động.
Nguồn
2012-10-09 17:12:04
Tôi nghĩ rằng nó phân tích cú pháp dưới dạng ("=". Scan)/(= /) –
Lưu ý rằng '" = ". Scan/\ = /' cũng hoạt động. –
@FrederickCheung: Tôi đoán '('='. Scan)/= (/)' và rằng trường hợp op = đặc biệt trong trình phân tích cú pháp được đoán sai. Có lẽ không. –