2008-08-29 27 views
16

Tôi đã được giao một công việc dịch 'một ngôn ngữ' sang ngôn ngữ khác. Nguồn là quá linh hoạt (phức tạp) cho một dòng đơn giản bằng cách tiếp cận dòng với regex. Tôi có thể tìm hiểu thêm về phân tích cú pháp và phân tích cú pháp ở đâu?Phân tích cú pháp, nơi tôi có thể tìm hiểu về nó

Trả lời

2

Gần đây, tôi đã làm việc với PLY là triển khai thực hiện lex và yacc bằng Python. Nó khá dễ dàng để bắt đầu với nó và có một số ví dụ đơn giản trong tài liệu. Phân tích cú pháp có thể nhanh chóng trở thành một chủ đề rất kỹ thuật và bạn sẽ thấy rằng bạn có thể sẽ không cần biết tất cả các chi tiết của thuật toán phân tích cú pháp nếu bạn đang sử dụng trình tạo phân tích cú pháp như PLY.

8

Hãy thử ANLTR:

ANTLR, một công cụ cho ngôn ngữ Recognition, là một công cụ ngôn ngữ mà cung cấp một khuôn khổ cho việc xây dựng recognizers, phiên dịch, biên dịch, và dịch từ ngữ pháp giới thiệu chứa hành động trong a nhiều ngôn ngữ đích.

Có một số book cho nó.

alt text

1

Nếu bạn thích công cụ Java dựa, Java Compiler Compiler, javacc, là một phân tích cú pháp đẹp/máy quét. Đó là tập tin cấu hình hướng, và sẽ tạo ra mã java mà bạn có thể bao gồm trong chương trình của bạn. Tôi đã không sử dụng nó một vài năm mặc dù, vì vậy tôi không chắc chắn làm thế nào phiên bản hiện tại. Bạn có thể tìm hiểu thêm tại đây: https://javacc.dev.java.net/

11

Nếu bạn muốn nhận được "cảm xúc" về chủ đề này, hãy chọn một bản sao của "The Dragon Book". Đó là thường là văn bản trong khóa học thiết kế trình biên dịch. Nó chắc chắn sẽ đáp ứng nhu cầu của bạn "tìm hiểu thêm về phân tích cú pháp và phân tích cú pháp" cũng như một loạt các công cụ thú vị khác!

IMH (umble) O, tiết kiệm cho mình một cánh tay và/hoặc chân và mua một phiên bản cũ - nó sẽ lấp đầy thông tin mong muốn của bạn.

1

flex và bò rừng là lex và yacc mới. Cú pháp cho BNF thường bị xáo trộn vì có một chút khó hiểu. Một số người đã chuyển sang ANTLR và Ragel vì lý do này.

Nếu bạn không thực hiện nhiều bản dịch, bạn có thể rút một lần bằng cách sử dụng các regex đa dòng với Perl hoặc Ruby. Viết một ngữ pháp BNF tương thích cho một ngôn ngữ hiện có không phải là một nhiệm vụ được đưa ra một cách nhẹ nhàng.

Mặt khác, hoàn toàn có thể tận dụng bất kỳ tệp .l và .y nào của ngôn ngữ đã cho nếu chúng có sẵn dưới dạng nguồn mở. Sau đó, bạn có thể tạo mã mới từ cây phân tích hiện có.

1

Lexing/Parsing + typecheck + thế hệ mã là một CS tập thể dục tuyệt vời, tôi sẽ giới thiệu nó cho bất cứ ai muốn một cơ sở vững chắc, vì vậy tôi là tất cả cho Rồng Sách

1

Một sách giáo khoa khác cần xem xét là Programming Language Pragmatics. Tôi thích nó hơn cuốn sách Dragon, nhưng YMMV.

Nếu bạn đang sử dụng Perl, một công cụ khác cần xem xét là Parse::RecDescent.

Nếu bạn chỉ cần thực hiện bản dịch này một lần và không biết gì về công nghệ trình biên dịch, tôi khuyên bạn nên thực hiện một số bản dịch khá đơn giản và sau đó sửa nó bằng tay. Vâng, đó là rất nhiều công việc. Nhưng nó ít làm việc hơn là học một chủ đề phức tạp và mã hóa giải pháp phù hợp cho một công việc. Điều đó nói rằng, bạn vẫn nên tìm hiểu các chủ đề, nhưng không cho phép không biết nó là một rào cản để hoàn thành dự án hiện tại của bạn.

1

tôi tìm thấy trang web này hữu ích:

Lex and YACC primer/HOWTO

Lần đầu tiên tôi sử dụng lex/yacc là cho một dự án tương đối đơn giản. Hướng dẫn này là tất cả những gì tôi thực sự cần. Khi tôi tiếp cận các dự án phức tạp hơn sau đó, sự quen thuộc tôi có được từ hướng dẫn này và một dự án đơn giản cho phép tôi xây dựng một thứ gì đó huyền ảo hơn.

1

Sau khi chụp (khá) một vài lớp trình biên dịch, tôi đã sử dụng cả hai The Dragon BookC&T. Tôi nghĩ rằng C & T thực hiện công việc tốt hơn để làm cho trình biên dịch xây dựng được tiêu hóa. Không lấy bất cứ thứ gì từ cuốn Dragon Book, nhưng tôi nghĩ C & T là một cuốn sách thực tế hơn rất nhiều.

Ngoài ra, nếu bạn thích viết bằng Java, tôi khuyên bạn nên sử dụng JFlexBYACC/J cho nhu cầu lexing và phân tích cú pháp của bạn.

2

Rất nhiều người đã giới thiệu sách. Đối với nhiều điều này hữu ích hơn nhiều trong môi trường có cấu trúc với các bài tập và ngày hoàn thành và vv. Ngay cả khi không, có vật liệu được trình bày theo một cách khác có thể giúp ích rất nhiều.

(a) Bạn có cân nhắc đến một trường học có chương trình học CS tốt không?
(b) Có rất nhiều bài giảng trực tuyến, chẳng hạn như MIT's Open Courseware. EE/CS section của họ có nhiều khóa học liên quan đến phân tích cú pháp, mặc dù tôi không thể thấy bất kỳ khóa học nào về phân tích cú pháp. Nó thường được giới thiệu là một trong những khóa học lý thuyết đầu tiên như phân loại ngôn ngữ và automata là trung tâm của nhiều lý thuyết CS.

+0

+1 cho ocw của mit, tôi luôn sử dụng nó cho toán học. Vì một lý do nào đó, việc lên lớp trên lịch trình của tôi tốt hơn rất nhiều so với việc dậy lúc 6:30. – Shawn

1

Parsing Techniques - A Practical Guide bởi Dick Grune và Ceriel J.H. Jacobs

Cuốn sách này (tự do sẵn có dưới dạng PDF) cung cấp tổng quan về các kỹ thuật/thuật toán phân tích cú pháp khác nhau. Nếu bạn thực sự muốn hiểu các thuật toán phân tích cú pháp khác nhau, IMO này là một tham chiếu tốt hơn cuốn sách Dragon Book (như Parsing Techniques tập trung hoàn toàn vào phân tích cú pháp, trong khi Dragon Book chỉ phân tích cú pháp như một phần quan trọng của quá trình xây dựng trình biên dịch) .

+0

Liên kết của bạn dường như bị hỏng – Shawn

+0

Tôi đã sửa liên kết: tệp PDF thực sự (cho ấn bản đầu tiên) có thể được tải xuống tại đây: http://dickgrune.com/Books/PTAPG_1st_Edition/BookBody.pdf; một ấn bản mới và ấn bản rộng rãi hơn của cuốn sách bây giờ cũng có sẵn trên Amazon – Gio

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