2010-08-06 44 views
14

Tôi muốn viết một trình phân tích cú pháp thành ngữ cho một ngôn ngữ đánh dấu như Markdown. Phiên bản của tôi sẽ hơi khác một chút, nhưng tôi nhận thấy ít nhất là một nhu cầu nhỏ đối với một cái gì đó như thế này trong Clojure, và tôi muốn nhận được nó.Viết trình phân tích cú pháp (cho ngôn ngữ đánh dấu): Lý thuyết & Thực hành

Tôi không muốn sử dụng một loạt các RegExes (mặc dù tôi nhận ra một số có thể sẽ là cần thiết), và Tôi muốn tạo ra một thứ gì đó mạnh mẽ và độc đáo Clojure.

Tôi đã bắt đầu một vài nỗ lực khác nhau (chủ yếu là trên giấy), nhưng tôi rất vui với họ, vì tôi cảm thấy như thể tôi chỉ đang ứng biến. Điều đó sẽ ổn, nhưng tôi đã thực hiện rất nhiều khám phá bằng ngôn ngữ của Clojure trong một hoặc hai tháng qua, và muốn, ít nhất là một phần, đi theo con đường của những người khổng lồ.

Tôi muốn một số gợi ý hoặc đề xuất hoặc tài nguyên (sách từ O'Reilly sẽ rất tuyệt vời - yêu tôi một số sách điện tử - nhưng Amazon hoặc ở bất cứ nơi nào cũng sẽ tuyệt vời). Bất cứ điều gì bạn có thể cung cấp.

EDIT Brian Carper có bài đăng thú vị trên using ANTLR from Clojure.

Ngoài ra còn có clojure-pgfnparse, là trình tạo trình phân tích cú pháp Clojure. fnparse thậm chí có vẻ như nó có một số tài liệu phong nha.

Vẫn đang tìm kiếm tài nguyên vv! Chỉ cần nghĩ rằng tôi muốn cập nhật những điều này với một số phát hiện của riêng tôi.

+1

Câu hỏi về tài nguyên trình biên dịch chuẩn là [Học cách viết trình biên dịch] (http://stackoverflow.com/questions/1669/learning-to-write-a-compiler) có lẽ là địa chỉ * một số * câu hỏi của bạn .. – dmckee

+0

Ah cảm ơn bạn vì lời nhắc đó - đó là một chủ đề hay, nhưng nó có thể bao gồm một * bit * nhiều hơn tôi quan tâm đến cho các mục đích của dự án này. Mặc dù tôi đã tìm kiếm một cái cớ để đọc/thực hành Dragon Book & co. – Isaac

+0

Cụm từ thông dụng không bao giờ cần thiết. – strager

Trả lời

5

Ngoài ra còn có clj-peg dự án, cho phép xác định PEG ngữ pháp cho dữ liệu phân tích

+0

Ah, điều đó khá gọn gàng. Nice tìm! Tôi đang xem xét điều đó. – Isaac

+0

Tôi đã bắt đầu kiểm tra nguồn, (sau khi đã xem qua các tài liệu), và điều này có vẻ như nó có thể là câu trả lời. Nó chưa được cập nhật, theo như tôi thấy, kể từ tháng Hai. Tôi đã gửi email cho anh chàng đã viết nó, và hỏi anh ta liệu anh ấy có muốn quan tâm đến GitHub không. Cảm ơn vì tiền hỗ trợ! – Isaac

+0

Anh ấy đã gửi lại email cho tôi, nói rằng sẽ có một cập nhật/viết lại lớn sắp xuất hiện! FYI – Isaac

6

Điều tốt nhất tôi có thể nghĩ là Terrence Parr - anh chàng dẫn đầu số ANTLR parser generator - đã viết một ngôn ngữ đánh dấu được ghi là here. Dù sao, có mã nguồn ở đó để xem xét.

+0

Thú vị – Tôi sẽ phải kiểm tra điều đó. Than ôi, viết bằng Java, nhưng một số ý tưởng chắc chắn sẽ được áp dụng, ngay cả khi phong cách không phải là. (Chú ý tấn của các lớp "phụ", nhưng hey, đó là cách bạn làm điều đó - chỉ khó khăn hơn để khái niệm hóa trong một ngôn ngữ chức năng.) – Isaac

+0

Vâng, clojure của nó phải không? Java-interop là tuyệt vời, tại sao không viết một API clojure cho ANTLR? Có vẻ như một dự án nhiều người sẽ hưởng lợi từ ... – mcpeterson

+0

Đó là sự thật, mọi người có thể, nhưng tôi đã có nhiều hơn chia sẻ của tôi về gói libs Java trong tháng qua. Thời gian cho một chút nữa Chỉ cần Clojure ™. Đó chắc chắn là điều mà tôi phải ghi nhớ! – Isaac

2

Hai dịch giả đánh dấu chức năng là;

+0

Cảm ơn! Đó là một số tài nguyên tốt. Haskell của tôi là một chút yếu, nhưng tôi có thể làm cho một số ý nghĩa của nó, nhưng OCamle của tôi là không tồn tại. Cảm ơn! – Isaac

4

Một chưa được đề cập ở đây là clarsec, một cổng của thư viện phân tích cú pháp của Haskell.

Gần đây tôi đã có một nhiệm vụ tương tự để xây dựng trình phân tích cú pháp trong Clojure. Tôi đã đi khá xa xuống con đường fnparse, đặc biệt bằng cách sử dụng (chưa phát hành) fnparse 3 mà bạn có thể tìm thấy trong chi nhánh develop trên github. Nó được chia làm hai dạng: hound (đặc biệt cho LL (1) các trình phân tích cú pháp lookahead đơn) và cat, là một trình phân tích cú pháp gói. Cả hai đều là các trình phân tích cú pháp chức năng được xây dựng trên các monads (như clarsec). fnparse có một số công việc ấn tượng - khả năng tạo tài liệu cho trình phân tích cú pháp của bạn, xây dựng các thông báo lỗi, v.v. là gọn gàng. Tài liệu về nhánh phát triển không tồn tại mặc dù không phải là tài liệu chức năng, mà thực sự khá tốt. Cuối cùng, tôi đánh một số khối đường với cố gắng làm cho LL (k) làm việc. Tôi nghĩ rằng nó có thể làm cho nó hoạt động, nó chỉ là khó mà không có một bộ phong nha của các ví dụ về cách làm cho backtracking hoạt động tốt. Tôi cũng rất quen thuộc với các trình phân tích cú pháp phân chia lexing và phân tích cú pháp mà tôi khó nghĩ theo cách đó. Tôi vẫn rất quan tâm đến điều này như một giải pháp tốt trong tương lai.

Trong thời gian chờ đợi, tôi đã quay trở lại Antlr, rất mạnh mẽ, được truyền đi tốt, được ghi chép đầy đủ (trong 2 cuốn sách), v.v. Nó không có bản sao của Clojure nhưng tôi hy vọng trong tương lai, điều này sẽ làm cho việc phân tích cú pháp thực sự tốt đẹp. Tôi đang sử dụng nó cho lexing, phân tích cú pháp, chuyển đổi cây, và templating qua StringTemplate. Nó đã không hoàn toàn không có va chạm, nhưng tôi đã có thể tìm ra giải pháp khả thi cho mọi vấn đề cho đến nay. Thuật toán phân tích cú pháp LL (*) độc đáo của Antlr cho phép bạn viết các ngữ pháp thực sự có thể đọc được nhưng vẫn làm cho chúng khá hiệu quả (và tinh chỉnh dần dần nếu chúng không).

+0

Rất thú vị – Tôi cũng sẽ xem xét điều đó. Tôi sẽ xem xét lại Antlr, nhưng tôi nghĩ rằng tôi muốn giúp làm cho một trình phân tích cú pháp Clojure hiện có tốt hơn. – Isaac

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