2010-09-23 8 views
9

Tôi đang cố gắng triển khai ngôn ngữ (hoặc họ ngôn ngữ) có ngữ pháp có thể được thay đổi động. Tôi đã không tìm thấy ví dụ nào là trường hợp nghiên cứu.Sử dụng ngữ pháp thích ứng

Bạn có thể cho tôi một số tham chiếu đến bất kỳ thực tế nào được sử dụng trong thế giới thực (thậm chí từ thế giới học thuật) không?

Có ý nghĩa khi triển khai Ngôn ngữ cụ thể theo miền với ngữ pháp động không?

+0

Bạn có nghĩa là ngôn ngữ mà bạn chỉ có thể xác định cấu trúc điều khiển mới khi đang di chuyển? Đó là loại kỳ lạ. Bạn có một ví dụ về các loại điều bạn muốn làm mà bạn nghĩ rằng bạn cần loại chức năng này? – Welbog

+0

Lisp có phù hợp với mô tả của bạn không? – Starkey

+0

Vì tất cả các trình biên dịch đều được xây dựng với các công cụ (như Yacc và Lex và Bison) hơn tất cả các ngôn ngữ được biên dịch là "thích nghi" theo định nghĩa này. Câu hỏi này quá mơ hồ để trả lời. –

Trả lời

9

Ngôn ngữ hiện tại nổi tiếng nhất có cú pháp động là Perl6. Ví dụ nổi tiếng nhất nói chung có lẽ là Smalltalk-72.

Bạn cũng có thể muốn xem xét OMeta và phần còn lại của STEPS project từ Alan Kay's Viewpoints Research Institute, cũng như Val của Schorre gốc META II.

Cũng thú vị: π programming language.

XL (Extensible Language) cũng cho phép thao tác mạnh mẽ cú pháp.

+1

+1 cho ngôn ngữ π, tuyệt vời! – yassin

+1

[EnglishScript] (https://github.com/pannous/english-script) cũng có một cú pháp động, nhưng nó vẫn là một công việc đang được tiến hành. –

+0

Câu trả lời này cần làm rõ một số. Tại sao cú pháp của Perl 6 được coi là "động"? –

8

Ngôn ngữ lập trình Katahdin cung cấp cú pháp và thay đổi ngữ nghĩa khi chạy. Đó là một ngôn ngữ luận án không được hỗ trợ vì vậy đừng mong đợi sử dụng nó trong sản xuất. Tuy nhiên, thesis của Chris Seaton có thể là một tài nguyên tốt để triển khai các ý tưởng tương tự bằng ngôn ngữ của riêng bạn.

Ghế được trích dẫn trong this paper mô tả hệ thống macro cho ngôn ngữ lập trình Fortress. Mục tiêu của tác giả là làm cho phần mở rộng cú pháp không thể phân biệt cú pháp chính.

+0

Làm thế nào tôi có thể quên đi Katahdin! Ngoài ra còn có một cái tên tương tự, có liên quan, tên tôi đã trốn thoát vào lúc này. –

+1

+1 để trích dẫn Katahdin – yassin

0

Tôi thực sự thích cú pháp của Agda, cực kỳ linh hoạt. Nó cho phép các toán tử distfix tùy ý mà về cơ bản cho phép, trông giống như các tính năng ngôn ngữ mới.

Mặc dù tôi chưa xem kỹ công việc của mình nhưng tôi biết Annika Aasa đã thực hiện một số công việc để cho phép các lập trình viên chỉ định cú pháp mới. Bạn sẽ tìm thấy tác phẩm của mình trên Google Scholar.

Fwiw, tôi nghĩ rằng việc phát triển các ngôn ngữ dành riêng cho miền là một thư viện bằng ngôn ngữ với một cú pháp rất linh hoạt có ý nghĩa rất lớn. Đôi khi nó được gọi là nhúng ngôn ngữ dành riêng cho miền, trong trường hợp bạn không biết.

0

Katahdin là một lựa chọn hiển nhiên. Ngoài ra còn có PFront và các macro phân tích cú pháp cũ tốt trong Common Lisp.

+0

Liên kết tới PFront dường như bị hỏng ngay bây giờ. –

+0

@AndersonGreen, đã chỉnh sửa: liên kết đến một bài viết vẫn hoạt động, không chắc chắn liên kết tải xuống ngay bây giờ ở đâu. –

0

Tôi đang làm việc trên cùng một điều.

Tôi nên có một vài thư viện trình phân tích cú pháp có thể mở rộng mà mọi người có thể sử dụng sớm. Tôi đã thực hiện lexer và tôi đang bận rộn với việc phân tích cú pháp.

Thư viện đầu tiên được viết bằng Ruby và tôi dự định dịch nó sang Java khi hoàn thành. Tôi đã thử một phiên bản Java đầu tiên, nhưng tôi đã bị sa lầy trong các chi tiết ngu ngốc vì vậy tôi chuyển sang Ruby để ngôn ngữ sẽ không nhận được theo cách của tôi trong khi tôi vẫn còn suy nghĩ.

Tôi hài lòng với cách tiếp cận của mình cho phép chuyển đổi giữa nhiều lexers và nhiều loại biểu thức với toán tử distfix. Các lexers chỉ là một chuỗi các biểu thức regex.

Việc phân tích cú pháp là ưu tiên toán tử đơn giản bên ngoài các phần distfix của sản phẩm và LL (1) bên trong. Chúng tôi sẽ xem nếu tôi thấy tôi muốn bất cứ điều gì mạnh mẽ hơn.