2012-10-09 41 views
6

Những phân tích cú pháp và thực hiện tốt:Ruby: Tại sao bằng dấu trong regexp chữ gây ra lỗi phân tích cú pháp?

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

Điều này gây ra "regexp unterminated gặp cuối tập tin":

"=".scan /=/ 

Nếu tôi chèn một cái gì đó trước khi = lỗi biến mất:

"=".scan /^=/ 

Điều gì đang xảy ra?

+0

Tôi nghĩ rằng nó phân tích cú pháp dưới dạng ("=". Scan)/(= /) –

+0

Lưu ý rằng '" = ". Scan/\ = /' cũng hoạt động. –

+1

@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. –

Trả lời

3

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.

+0

Nhưng rõ ràng là không quá già và cáu kỉnh để sàng lọc thông qua mã C :). Ugh, ''='. Scan/= /' là một tâm hồn khác. Tôi giả sử nó phân tích cú pháp như thể chia cho '= /'. – Kelvin

+0

Hoặc cũ và cáu kỉnh đủ để muốn biện minh cho các dự đoán của tôi và đủ tuổi và cáu kỉnh để có C đốt cháy trong não của tôi :) Tôi nghĩ rằng bạn đang đúng về cách '/ = /' được phân tích cú pháp. –

+1

+1 "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". Tôi băn khoăn về điều này nhiều lần trong các đánh giá mã. Chỉ vì chúng ta có thể bỏ qua dấu ngoặc đơn * một số lần * không có nghĩa là chúng ta nên làm điều đó. –

Các vấn đề liên quan