2011-01-18 38 views
8

Tôi đang viết một trình mã thông báo javascript đơn giản phát hiện các loại cơ bản: Word, Number, String, RegExp, Operator, Comment và Newline. Mọi thứ đều ổn nhưng tôi không hiểu làm thế nào để phát hiện nếu ký tự hiện tại là toán tử phân tách RegExp hoặc toán tử phân chia. Tôi không sử dụng cụm từ thông dụng vì chúng quá chậm. Có ai biết cơ chế phát hiện nó không? Cảm ơn.Phân chia/xung đột RegExp trong khi mã hóa Javascript

Trả lời

6

Bạn có thể biết điều gì là mã thông báo trước ở trong luồng. Đi qua từng mã thông báo mà từ vựng của bạn phát ra và hỏi xem nó có thể được theo sau bởi dấu hiệu phân chia hay regexp hay không; bạn sẽ thấy rằng hai bộ kết quả của các thẻ là rời rạc. Ví dụ: (, [, {, ; và tất cả các toán tử nhị phân chỉ có thể được theo sau bởi một regexp. Tương tự, ), ], }, số nhận dạng và chuỗi ký tự chuỗi/số chỉ có thể được theo sau bằng dấu phân chia.

Xem phần 7 của ECMAScript spec để biết thêm chi tiết.

+2

Tôi đã viết một tokenizer một lần, và đây là những REs rằng phát hiện một "regex cò": '/ [{(\ [;,] /' '/ \ + \ + | - | ~ | && | \? |: | \ | \ || \\ $ | (<<|> >>? | ==? |! =? | [- <> + *% & \ | \^/]) =?/''/^ (? = \ s | \/| user123444555621

+4

Về mặt kỹ thuật, có một vài sự mơ hồ không thể tránh khỏi ở Ví dụ, '(a + b)/c' so với' if (x) /foo/.exec ('bar') '(close-paren có thể đứng trước cả hai) .Ngoài ra,' ++/foo/.abc' và 'a ++/b' (cộng-cộng có thể đứng trước cả hai). Cùng với' --' đây là những cái duy nhất tôi biết. – dgreensp

+0

@dgreensp Cảm ơn quan sát rất hữu ích !!! – Zo72

1

bạn phải kiểm tra ngữ cảnh khi gặp dấu gạch chéo. nếu dấu gạch chéo là sau một biểu thức, sau đó nó phải được phân chia, hoặc nó là một regexp bắt đầu.

để nhận ra ngữ cảnh, có thể bạn phải tạo trình phân tích cú pháp cú pháp.

ví dụ

function f() {} 
/1/g 
//this case ,the slash is after a function definition, so it's a refexp start 


var a = {} 
/1/g; 
//this case, the slash is after an object expression,so it's a division 
Các vấn đề liên quan