2009-04-30 34 views
19

Tôi đã hy vọng viết highlighter cú pháp của riêng mình cho một dự án mùa hè, tôi đang nghĩ đến việc làm nhưng tôi không biết cách viết highlighter cú pháp của riêng mình.Viết highlighter cú pháp

Tôi biết rằng có rất nhiều triển khai trên mạng nhưng tôi muốn tìm hiểu về các biểu thức chính quy và cách làm nổi bật cú pháp hoạt động.

Làm nổi bật cú pháp hoạt động như thế nào và một số tài liệu tham khảo tốt để phát triển nó là gì? Liệu highlighter cú pháp có quét từng ký tự khi nó được đánh máy hay nó quét toàn bộ tài liệu/vùng văn bản sau mỗi ký tự được gõ?

Mọi thông tin chi tiết sẽ được đánh giá cao.

Cảm ơn.

PS: Tôi đã lên kế hoạch viết nó trong ActionScript

Trả lời

17

Tô sáng cú pháp có thể hoạt động theo hai cách rất chung chung. Việc đầu tiên thực hiện một lexer đầy đủ và phân tích cú pháp cho (các) ngôn ngữ được đánh dấu, xác định chính xác từng loại mã thông báo (từ khóa, tên lớp, tên cá thể, loại biến, chỉ thị tiền xử lý ...). Điều này cung cấp tất cả các thông tin cần thiết để làm nổi bật chính xác mã theo một số đặc điểm kỹ thuật (các từ khóa có màu đỏ, tên lớp màu xanh dương, những gì có bạn).

Cách thứ hai giống như việc sử dụng một lexer/parser cho mỗi ngôn ngữ, một vài trình phân tích cú pháp rất chung được sử dụng có thể làm tốt trên hầu hết các cú pháp. Ví dụ, trình đánh dấu này sẽ có thể phân tích cú pháp và đánh dấu một cách hợp lý bất kỳ ngôn ngữ nào giống như C, bởi vì từ khoá/trình phân tích cú pháp của nó có thể xác định các thành phần chung của các loại ngôn ngữ đó.

Điều này cũng có lợi thế là kết quả là bạn không cần xác định rõ ngôn ngữ, vì động cơ sẽ tự xác định trình phân tích cú pháp chung nào có thể thực hiện công việc tốt nhất. Nhược điểm của khóa học là làm nổi bật là ít hoàn hảo hơn khi một trình phân tích ngôn ngữ cụ thể được sử dụng.

+3

Bạn bắt đầu nói rằng tô màu làm việc theo hai cách chung nhưng sau đó trừ khi tôi hiểu lầm, bạn không giải thích cách thứ hai. – Marplesoft

+6

@Marplesoft như tôi đã hiểu, viết lexer & parser cho mỗi ngôn ngữ là cách đầu tiên, và viết lexer chung & phân tích cú pháp là thứ hai. – yasar

2

Bạn nên xử lý toàn bộ tài liệu ban đầu. Tôi nghĩ rằng (không phải là một chuyên gia) bạn muốn phá vỡ mọi mã thông báo và tạo ra một cây phân tích.

Sau đó, nếu bạn có tất cả thiết lập, trước tiên bạn có thể chạy trình phân tích cú pháp mỗi khi bạn nhập một ký tự mới. Điều đó có thể đủ tốt cho hệ thống của bạn, nhưng nếu bạn muốn giữ mọi thứ nhanh chóng, bạn sẽ cần phải sửa đổi trong cây phân tích khi bạn nhận được nhiều thông tin hơn.

+0

Những gì bạn đang về cơ bản xây dựng, được gọi là một lexer (Tôi tin) – Evert

+0

tôi đồng ý rằng các tài liệu cần được điều trị như một toàn thể tại đầu tiên, nhưng rất khó để nói nếu điều này đáp ứng các thông số kỹ thuật dựa trên mô tả mơ hồ của dự án – Tony

3

Điều này có thể hữu ích nếu bạn giải thích ý nghĩa của công cụ đánh dấu cú pháp này. Nếu bạn đang viết nó trong ActionScript, là ý tưởng của bạn để có một hộp văn bản trong một bộ phim flash và làm nổi bật cú pháp sau khi một nút gửi được đẩy? Hay bạn muốn đọc văn bản từ một số dịch vụ web và sau đó hiển thị cú pháp được đánh dấu? ... thật khó cho tôi để giúp đỡ, bởi vì thật khó cho tôi để tưởng tượng những gì bạn đang làm

Tuy nhiên, một cú pháp highlighter đọc văn bản, sau đó so sánh các dòng mã với một số regex giúp con trỏ tô sáng cú pháp hiểu ý nghĩa của từ đó. Ví dụ, nó có thể đọc được chữ "chức năng" hoặc "int" như từ dành riêng, và thay thế bằng văn bản html:

<span class="reserved">function</span>, <span class="reserved"></span> 

giả sử bạn có css và muốn từ dành riêng trong màu đỏ,

.reserved{ 
    color: #ff0000; 
} 

Đây là khái niệm cơ bản và bạn có thể muốn lấy ý tưởng từ geshi vì bạn có thể xem nguồn.

+0

Xin lỗi tôi đã không làm rõ thêm. Tôi đang lên kế hoạch triển khai trình soạn thảo văn bản cộng tác trong Adobe Flex. Điều tôi muốn là có một TextArea hoặc một thành phần nhập văn bản tương tự ... sau đó khi người dùng gõ, ví dụ mã Java, mã mà họ đang gõ sẽ trở thành cú pháp được tô sáng. Giống như bất kỳ IDE nào có đánh dấu cú pháp. –

4

Trong StackOverflow podcast number 50 Steve Yegge nói một chút về dự án của mình để tạo ra một số cơ chế làm nổi bật chung. Không phải là một sản phẩm hoàn chỉnh và có lẽ tinh vi hơn bạn đang tìm kiếm, nhưng có thể có một cái gì đó quan tâm.

2

Unfortunatelly, tôi chưa bao giờ sử dụng Actionscript, vì vậy tôi không thể trợ giúp với phần đó.

Nhưng ngoài ra, một khởi đầu tốt để viết một công cụ đánh dấu cú pháp sẽ là xem xét những cái hiện có. Ví dụ: vim có tệp cú pháp dưới dạng tệp văn bản thông thường, vì vậy bạn có thể xem các tệp đó để bắt đầu. Có một loạt các biểu thức thông thường ở đó (các biểu thức thông thường có nhiều hương vị, nhưng chúng không khác nhau lắm ...), vì vậy bạn có thể xem lướt qua một số cuốn sách.

Cá nhân, tôi đã tìm thấy Beginning regular expressions để trở thành người đẹp. Mastering regular expressions cũng tốt cho các đối tượng nâng cao hơn. Regular expressions pocket reference là mặt khác tốt đẹp để xác định sự khác biệt trong các hương vị được đề cập ở trên, vì nó bao gồm một chương về regex của vim là tốt.

1

Tôi đã đăng tải một công cụ màu mã SQL trên blog của tôi một thời gian trước: http://gruchalski.com/2009/04/26/flex-textrange-performance-issue-on-linux/

Bạn có thể tìm thấy một liên kết đến sqlcodecoloring.zip với nguồn. Nó được thực hiện bằng cách sử dụng tokenizer và một lớp TextRange.

liên kết khác, mã sql màu như là một phần của ứng dụng nguyên mẫu: http://github.com/radekg/mysqlinterface/tree/master

2

Một khởi đầu tốt cho một cách tiếp cận này là Udacity course CS262. Tiêu đề là xây dựng một trình duyệt web, nhưng thực sự lớp học tập trung vào chính xác những vấn đề bạn đang tìm kiếm - làm thế nào để phân tích và lex một tập hợp các văn bản. Trong trường hợp của bạn, bạn sẽ sử dụng thông tin đó để làm nổi bật. Tôi chỉ lấy nó và nó rất tốt. Khóa học đã hết giờ, nhưng video và bài tập thực hành/bài tập về nhà vẫn được cập nhật và có sẵn để xem.

+0

khóa học tuyệt vời, ty! – nimrod

2

Xây dựng công cụ đánh dấu cú pháp là tất cả về việc tìm các từ khóa cụ thể trong mã và cung cấp cho chúng một phong cách cụ thể (phông chữ, kiểu phông chữ, màu sắc vv). Để đạt được điều này, bạn cần xác định danh sách các từ khóa cụ thể cho ngôn ngữ lập trình mà mã được viết và sau đó phân tích cú pháp văn bản (ví dụ: sử dụng cụm từ thông dụng), tìm mã cụ thể và thay thế chúng bằng đúng kiểu Thẻ HTML.

Một highligher rất cơ bản viết bằng JavaScript sẽ trông như thế này:

var keywords = [ "public", "class", "private", "static", "return", "void" ]; 
for (var i = 0; i < keywords.length; i++) 
{ 
     var regex = new RegExp("([^A-z0-9])(" + keywords[i] + ")([^A-z0-9])(?![^<]*>|[^<>]*</)", "g"); 
     code = code.replace(regex, "$1<span class='rm-code-keyword'>$2</span>$3"); 
} 
Các vấn đề liên quan