Tôi đang cố gắng xây dựng một công cụ phân tích tĩnh cho một dự án demo. Chúng tôi tự do lựa chọn ngôn ngữ để phân tích. Tôi bắt đầu bằng cách viết một trình phân tích mã Java bằng cách sử dụng ANTLR. Bây giờ tôi muốn làm tương tự cho mã Scala. Tuy nhiên, tôi không thể tìm thấy ngữ pháp ANTLR cho Scala. Nó tồn tại? Có bất kỳ dạng máy đọc Scala ngữ pháp nào khác có thể đọc được không?Ngữ pháp ANTLR cho Scala?
Trả lời
Tôi không tin rằng có một điều như vậy.
Cái này là cho bất kỳ ngôn ngữ, nhưng đặc biệt cho một ngôn ngữ thư viện như Scala, phân tích từ vựng và phân tích cú pháp là phần ít nhất thú vị và tầm thường nhất của phân tích tĩnh. Để làm bất cứ điều gì thậm chí từ xa thú vị, bạn cần thực hiện một số lượng đáng kể phân tích ngữ nghĩa phân tích: desugaring, nhập suy luận, loại kiểm tra, loại kiểm tra, mở rộng macro, phân giải quá tải, độ phân giải ngầm định, tên ràng buộc. Trong ngắn hạn: bạn cần phải thực hiện lại nhiều hơn hoặc ít hơn toàn bộ trình biên dịch Scala, modulo phần tạo mã thực tế. Hãy nhớ rằng cả hệ thống macro của Scala và hệ thống kiểu Scala đều là Turing-complete (trên thực tế, hệ thống macro của Scala là là Scala!): Có thể có thời gian biên dịch và loại mức đáng kể xảy ra là không thể để phân tích mà không cần thực sự thực hiện mở rộng macro, suy luận kiểu và kiểm tra loại.
Đó là một nhiệm vụ lớn và thực tế chỉ có hai dự án đã thực hiện thành công: một là trình biên dịch Scala, trình còn lại là plugin IntelliJ IDEA Scala.
Và thậm chí không nói về các trình biên dịch trình biên dịch, có thể thay đổi cú pháp và ngữ nghĩa của Scala theo những cách tùy ý.
Nhưng nhìn chung, có hy vọng: Trình biên dịch Scala cung cấp API được gọi là Trình biên dịch trình bày, được thiết kế đặc biệt để sử dụng bởi IDE, mã đánh dấu và tất cả các loại công cụ phân tích tĩnh. Nó cho phép bạn truy cập vào toàn bộ thông tin mà trình biên dịch có trong quá trình biên dịch, ngay trước các giai đoạn tối ưu hóa và tạo mã. Nó được sử dụng bởi ScalaDoc, Scala REPL, Scala Eclipse Plugin, NetBeans Scala Plugin, SimplyScala.Com, ENSIME Plugin cho Emacs, một số công cụ phân tích tĩnh và nhiều công cụ khác.
Phụ lục A của số Scala Language Reference có hữu ích cho bạn không? Nó có định dạng EBNF.
Nó có phần hữu ích. Tôi đã có thể ưa thích một định dạng máy có thể đọc được. Tôi đoán nếu ngữ pháp ANTLR không có ở xung quanh, chúng ta sẽ phải tạo nó bằng cách sử dụng EBNF. – Jus12
Bạn có thể viết một ngữ pháp cho EBNF trong Antlr, phân tích cú pháp sau đó chuyển nó sang Antlr không? :) – ron
thats quá nhiều công việc :) – Jus12
Sử dụng Scalastyle scalariform để thực hiện phân tích cú pháp cho nó. Với điều này, bạn sẽ có được một AST của các trường hợp. Tuy nhiên, bạn chỉ nhận được thông tin có trong tệp, ví dụ, bạn không nhận được loại suy luận.
Nếu bạn không cần tất cả thông tin bổ sung, hãy xem Scalariform. Mã Scalastyle khá dễ hiểu, bắt đầu bằng Checker.scala.
Bạn có thể tìm thấy ngữ pháp Scala cho ANTLR tại https://github.com/lrlucena/grammars-v4/tree/master/scala. Nó dựa trên Đặc điểm Ngôn ngữ Scala http://www.scala-lang.org/files/archive/spec/2.11/13-syntax-summary.html.
ngữ pháp đó là hoàn toàn ngu ngốc. Không hoạt động với antlr4. Tôi đã đăng một câu hỏi trong stackoverflow và mọi người nói rằng nó chưa bao giờ được kiểm tra. đây là liên kết: http://stackoverflow.com/questions/40482259/antlr-doesnt-give-correct-output-tokens-for-scala-grammar – shiva
https://github.com/lrlucena/grammars-v4/tree/master/scala Ngữ pháp này không hoạt động. – Ryan
Cảm ơn cho bài viết thông tin. – Jus12
Thực ra, Scalastyle sử dụng scalariform, phân tích cú pháp cho nó. Xem câu trả lời của tôi. –
@MatthewFarwell: Cảm ơn bạn đã thông tin. Tôi đã cập nhật câu trả lời của mình. (Sidenote: https://github.com/mdr/scalariform/blob/master/scalariform/src/main/scala/scalariform/parser/ScalaParser.scala trông đáng sợ :-)) –