2009-03-23 11 views
7

Tôi cần viết trình biên dịch. Đó là bài tập về nhà tại trường đại học. Giáo viên nói với chúng tôi rằng chúng tôi có thể sử dụng bất kỳ API nào mà chúng tôi muốn thực hiện phân tích mã, miễn là nó là một mã tốt. Bằng cách đó chúng ta có thể tập trung nhiều hơn vào JVM mà chúng ta sẽ tạo ra.Làm cách nào để phân tích mã để xây dựng trình biên dịch trong Java?

Vì vậy, có, tôi sẽ viết trình biên dịch trong Java để tạo Java.

Bạn có biết API nào tốt cho điều này không? Tôi có nên sử dụng regex không? Tôi thường viết các trình phân tích cú pháp của chính mình bằng tay, mặc dù nó không được khuyến khích trong kịch bản này.

Mọi trợ giúp sẽ được đánh giá cao.

+0

Tôi không chắc chắn về 1,6, nhưng lên đến 1,4 trình phân tích cú pháp cho javac trong JDK mặt trời đã được viết bằng tay. –

Trả lời

13

Regex rất tốt để sử dụng trong trình biên dịch, nhưng chỉ để nhận dạng mã thông báo (nghĩa là không có cấu trúc đệ quy).

Cách cổ điển của văn bản một trình biên dịch là có một từ vựng phân tích cho thẻ nhận, một máy phân tích cú pháp công nhận cấu trúc, một ngữ nghĩa phân tích công nhận ý nghĩa, một trung gian tạo mã, một ưu và cuối cùng là trình tạo mã đích. Bất kỳ bước nào trong số đó có thể được hợp nhất hoặc bỏ qua hoàn toàn, nếu làm cho trình biên dịch dễ viết hơn.

Đã có nhiều công cụ được phát triển để trợ giúp quá trình này. Cho Java, bạn có thể nhìn vào

+1

Mmm và mayby ​​một phân tích ngữ nghĩa? Để kiểm tra những thứ không thể được kiểm tra trong phân tích cú pháp? –

+0

Trong tâm trí của tôi, một trình phân tích cú pháp là cú pháp và phân tích ngữ nghĩa. Tôi đã cập nhật câu trả lời để tách riêng hai khái niệm. –

9

Hãy xem JavaCC, trình phân tích cú pháp ngôn ngữ cho Java. Nó rất dễ sử dụng và nhận được hang của

6

Đi cổ điển - Lex + Yacc. Trong Java, nó sẽ đánh số JAXjavacc. Javacc thậm chí có một số Java grammars sẵn sàng để kiểm tra.

10

Tôi muốn giới thiệu ANTLR, chủ yếu do khả năng tạo đầu ra của nó thông qua StringTemplate.

Điều gì là tốt hơn là Terence Parr's book trên cùng là bởi đến nay một trong những cuốn sách tốt hơn hướng tới việc viết trình biên dịch với trình tạo trình phân tích cú pháp.

Sau đó, bạn có ANTLRWorks cho phép bạn nghiên cứu và gỡ lỗi ngữ pháp của bạn khi đang di chuyển.

Để đầu nó tất cả, ANTLR wiki + documentation, (mặc dù không đủ toàn diện theo ý thích của tôi), là một nơi tốt để bắt đầu cho bất kỳ người mới bắt đầu. Nó đã giúp tôi làm mới kiến ​​thức về viết trình biên dịch trong một tuần.

2

Tôi đã sử dụng SableCC trong khóa học trình biên dịch của tôi, mặc dù không phải do sự lựa chọn.

Tôi nhớ rằng việc tìm kiếm nó rất cồng kềnh và nặng ký, chú trọng hơn đến độ sạch hơn so với tiện lợi (không ưu tiên nhà điều hành hoặc bất kỳ điều gì; bạn phải nêu rõ điều đó trong ngữ pháp).

Tôi có thể muốn sử dụng thứ gì đó khác nếu tôi có lựa chọn. Kinh nghiệm của tôi với yacc (cho C) và hạnh phúc (cho Haskell) đều dễ chịu.

2

Bộ phối hợp phân tích cú pháp là một lựa chọn tốt. Việc triển khai Java phổ biến là JParsec.

3

JFlex là trình tạo máy quét, theo manual, được thiết kế để hoạt động với trình tạo trình phân tích cú pháp CUP.

Một trong những mục tiêu thiết kế chính của JFlex là tạo giao diện với trình tạo phân tích cú pháp Java miễn phí dễ dàng như có thể [sic].

Nó cũng có support cho BYACC/J, như tên gọi của nó, là một cổng của Berkeley YACC để tạo mã Java.

Tôi đã sử dụng chính JFlex và thích nó. Howeveer, dự án tôi đã làm là đủ đơn giản mà tôi đã viết các phân tích cú pháp bằng tay, vì vậy tôi không biết làm thế nào tốt hoặc CUP hoặc BYACC/J là.

1

Tôi khuyên bạn nên xem xét nguồn của BeanShell. Nó có một trình biên dịch cho Java và khá đơn giản để đọc.