2009-08-23 33 views
14

Tôi là người hâm mộ lớn về việc ghi lại hành vi đúng đắn của các tính năng IDE có tác động tinh tế nhưng quan trọng đối với luồng mã hóa - những thứ như lựa chọn tự động hoàn thànhmã nhận xét/uncommenting bạn có thể không nhận ra bạn tận dụng nhưng vào cuối ngày bạn đã làm được nhiều hơn một chút so với bạn có thể có. Tôi làm như vậy với hy vọng rằng các dịch vụ ngôn ngữ khác mà tôi phải sử dụng kết hợp (các) tính năng này, sau đó cải thiện cuộc sống mã hóa hàng ngày của tôi. "Indent thông minh" thực sự, tức là trình soạn thảo Visual Studio 2008 C#, là một trong những tính năng đó.Tài liệu thuật toán thông minh thụt lề?

Chấm lề mã khối cơ bản là hợp lý đơn giản và có thể bị tấn công cùng nhau trong một khoảng thời gian hợp lý đủ tốt để hoàn thành công việc. True Smart Indent, mặt khác, là một nhiệm vụ khó khăn nhất về mặt kỹ thuật mà tôi đã phải thực hiện trong IDE cho đến nay, và tôi đã thực hiện phần chia sẻ công bằng của mình. Thậm chí, định dạng mã tự động hoàn toàn tự động cũng dễ dàng hơn; nó chỉ chống lại Indent thông minh cho việc nâng hạng nặng.

Tôi đang tìm kiếm các cuộc thảo luận cấp cao về các thuật toán thông minh Indent mục đích chung. Cụ thể, tôi đang tìm kiếm một trong hai nghiên cứu về chiến lược thụt lề thông minh hoặc mô tả khách quan về tất cả các trường hợp thông thường và "cạnh" có thể được kiểm tra để đảm bảo kết quả lặp lại, không có lỗi. Cuối cùng, tôi muốn cung cấp cả quy trình chi tiết của chức năng, một nền tảng cụ thể để thực sự triển khai tính năng, và cuối cùng lắp ráp một phiên bản ngôn ngữ cụ thể từ đó và tích hợp nó vào các dịch vụ ngôn ngữ của tôi.

PS: Trình soạn thảo C# của Visual Studio 2010 có một số lỗi nhỏ trong tính năng này. Tự mình thực hiện, tôi hoàn toàn tôn trọng công việc cần thiết để đánh bóng nó.

Chỉnh sửa (8/25): Tôi đã quản lý write down a draft the rules vì cách tôi nghĩ mọi thứ sẽ được xử lý khi thụt lề thông minh nằm trong nhận xét mã. Có lẽ tôi sẽ làm việc từ góc độ C++/C# trên các quy tắc, nhưng sau đó chúng sẽ có thể được tham số hóa cho các khía cạnh của các ngôn ngữ khác.

+0

@Chris: Nếu không có hai liên kết tôi đặt lại, bạn không thể nói phạm vi của hai tính năng này và cách tôi đã suy nghĩ cẩn thận. –

+2

Với siêu liên kết, đây là spam imho. – ChrisW

+0

@ Chris: Đó là lý do tại sao tôi để lại một, nhưng không phải là hai chỉ là sơ đồ dòng mã trên blog của tôi –

Trả lời

1

Có thể tôi đang thiếu điều gì đó, nhưng "thụt lề thông minh" sẽ hoàn toàn bị ràng buộc trong đặc tả ngữ pháp của ngôn ngữ. Điều gần nhất với một bài báo học thuật mà tôi có thể tìm thấy sau một chút về google-fu, trên thực tế, một câu hỏi SO khác liên quan đến một ngôn ngữ cụ thể, here. Vì vậy, tôi sợ rằng tôi không thể cung cấp một câu trả lời về mặt kỹ thuật, vì tôi không tìm thấy bất kỳ tài liệu học thuật nào, nhưng như một loại siêu câu trả lời (thật đáng buồn, dưới hình thức một câu hỏi): có phải là bất kỳ câu trả lời nào hay không? khó hơn phân tích cú pháp ngôn ngữ? Tôi sử dụng thuật ngữ "khó khăn hơn" trong ý nghĩa tính toán phức tạp/mơ hồ, không đề cập đến thời gian/nỗ lực/nước mắt thực tế mà một người thực sự sẽ đặt vào.

Xem xét: thay đổi mức thụt lề, theo kinh nghiệm của tôi, trong một số phụ điều khoản. Nếu các câu lệnh, các vòng lặp, các lớp, các cấu trúc, v.v ... Tất cả những điều này đã được trình phân tích cú pháp phát hiện. Cũng giống như người ta có thể trang trí cây phân tích để xây dựng một cây ngữ nghĩa (đây là mảnh vỡ của một trường đại học ngẫu nhiên website), bạn không thể thay thế trang trí cây phân tích bằng "thông tin thụt lề"?

Tôi đoán tôi chỉ không nhìn thấy những gì các cuộc gọi cho các giấy tờ học tập là tất cả về. Trừ khi nếu, tất nhiên, có một cái gì đó tôi đang mất tích. Điều này hoàn toàn có thể, vì tôi chắc chắn không bao giờ dám thử điều này. Nhưng, từ điểm thuận lợi của tôi, có vẻ như việc thụt lề thông minh này có thể đơn giản bằng cách chạy trình phân tích cú pháp đã sửa đổi và thay vì báo cáo "lỗi phân tích", nó sẽ tự động định dạng lại mã để nó hợp lệ (giả sử rằng "thực "parser đã okays khối).Chạy trong thời gian thực chắc chắn sẽ gây ra các vấn đề và có các mức thụt lề không rõ ràng trong ngôn ngữ phụ thuộc vào khoảng trắng (như mức thụt lề phần cuối của khối).

Cuối cùng (thành thật mà nói, tôi sắp hoàn thành! :)) lưu ý: bản chỉnh sửa văn bản Emacs rất đáng kinh ngạc, theo kinh nghiệm của tôi. Tôi không biết nó hoạt động như thế nào, nhưng nếu tôi thử nó, đó sẽ là nơi đầu tiên tôi nhìn ... sau SO, tất nhiên. :))

+3

Tôi đã thay đổi câu hỏi thường xuyên (hoặc rất nhiều). Tôi đang có một thời gian rất lớn tạo ra một thủ tục kiểm tra để ngăn chặn hồi quy trong khi tôi sửa lỗi pesky. Nó khó hơn nhiều so với phân tích cú pháp vì 1) vấn đề tốc độ * thời gian lớn * và 2) tài liệu gần như không bao giờ có cú pháp chính xác tại thời điểm Smart Indent được gọi. –

+0

+1 cho "tài liệu gần như không bao giờ là cú pháp chính xác". Điều đó thực sự làm cho nó khó hơn. Bạn vẫn có thể làm tốt bằng cách phân tích cú pháp với sửa lỗi; chi phí sửa chữa ít nhất cho bạn biết những gì cần phải có được ở đó, và sau đó bạn có thể làm giảm vấn đề để prettyprinting một cây sạch. –

5

Hướng dẫn chế độ CC Emacs: Indentation Engine Basics.

Steve Yegge blog rant: js2-mode: a new JavaScript mode for Emacs.

Trích từ sau: "Thật ngạc nhiên, đáng ngạc nhiên, ngược lại, vấn đề thụt lề là gần như hoàn toàn trực giao để xác thực cú pháp và cú pháp."

+0

Blog của Steve có ý nghĩa hoàn toàn. Tôi hoàn toàn hiểu anh ta đến từ đâu. Một điều cần lưu ý: bài đăng trên blog của anh ấy thiếu một tấn trường hợp cần được xem xét, nhưng điều đó rất có thể do có quá nhiều danh sách. –

+0

Tôi sẽ thế. Sự an ủi duy nhất của tôi là Steve cũng tin rằng thật ngạc nhiên khi biết rằng vấn đề là trực giác để phân tích cú pháp. :) +1 – agorenst

+0

Ý kiến ​​cá nhân của tôi, dựa trên việc xây dựng các công cụ thực sự, là "sự thụt đầu dòng thông minh" yêu cầu bạn phân tích cú pháp mã, và sau đó đánh dấu. Xem những người chơi khác. –

3

Cụm từ tìm kiếm ma thuật bạn đang tìm kiếm có thể là "pretty print".

+1

Amen. +1 (Tôi có thể nhập 15 ký tự ở đây, chỉ để nói rằng tôi đã cho bạn một điểm). –

1

Giống như một ứng dụng trả lời khác, ý tưởng chính để thực hiện quyền này là đẹp, tức là tạo văn bản từ cấu trúc cú pháp trừu tượng của mã.

Về cơ bản, bạn tận dụng lợi thế của việc làm tổ của cây để tạo ra làm tổ của văn bản được in. Ý tưởng chính là khái niệm xây dựng các chuỗi nguyên thủy từ lá cây, dán các hộp ngang [hình chữ nhật của văn bản] với nhau từ các hộp khác từ subttrees để cung cấp thành phần nằm ngang, và dán các hộp lên nhau để có các hộp thẳng đứng lớn hơn.

Các phần khó khăn: tạo lại các ngôn ngữ langauge với thông tin định dạng từ lá cây (chỉ số lượng điểm số nhị phân hàng đầu có bao nhiêu?), xử lý tràn lề phải bằng cách cho phép bố cục hộp thay thế và quay ngược lại cấu trúc cây phức tạp để in ấn các cây đặc biệt theo cách đẹp (ví dụ, lồng nhau nếu-then-if-then-if ....)

Đây là a research paper về chủ đề (Full text PDF).

Đây là what we did for prettyprinting với DMS Software Reengineering Toolkit để tạo các AST được tạo bởi lập trình meta quy mô lớn.

+0

+1 Giấy đó chắc chắn sẽ hữu ích cho việc ghi lại hành vi Indent thông minh tổng quát. Tôi tin rằng bạn đang đánh giá thấp sự khó khăn của liên quan đến thụt lề thông minh với * bất kỳ thuật toán phân tích cú pháp thông thường nào. –

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