2012-10-06 34 views
5

Cách tốt nhất để (hiệu quả) phân tích cú pháp nhận dạng nhiều dòng C (tức là, /* ... */) với bộ phối hợp trình phân tích cú pháp Scala?Bộ phối hợp phân tách Scala: Hiệu quả phân tích cú pháp kiểu C

Trong dự án mà tôi tham gia vào, chúng tôi phân tích ngôn ngữ lập trình giống C và muốn hỗ trợ nhận xét nhiều dòng. Chúng tôi sử dụng một phân lớp của StandardTokenParsers, đã xử lý các nhận xét như vậy (thông qua StdLexical. Tuy nhiên, lớp này chỉ hoạt động đối với các nhận xét nhiều dòng tương đối ngắn và hết dung lượng ngăn xếp khác.

Chúng tôi cũng đã cố gắng cung cấp định nghĩa của riêng mình các khoảng trắng để làm cho mọi việc hiệu quả hơn Chúng tôi sử dụng một RegexParser (lấy cảm hứng từ another question on StackOverflow) như sau:.

class Parser extends StandardTokenParsers { 

    override val lexical = new StdLexical { 
    def rp: RegexParsers = new RegexParsers {} 
    override val whitespace: Parser[Any] = rp.regex("""(\s|//.*|(?m)/\*(\*(?!/)|[^*])*\*/)*""".r).asInstanceOf[Parser[Any]] 
    } 

    // ... 

} 

này cải thiện tình hình một chút, nhưng vẫn gây ra một chồng tràn nếu nhận xét là nhiều hơn một vài chục dòng. Bất kỳ ý tưởng nào để cải thiện điều này?

Trả lời

7

Chúng tôi đã có một số thành công với loại sự cố này bằng cách xác định khoảng trắng bỏ qua bằng cách sử dụng trình phân tích cú pháp thay vì sử dụng cụm từ thông dụng. Xem đặc điểm WhitespaceParser trong Kiama ParserUtilities.scala của chúng tôi đối với một số mã hỗ trợ.

Hầu hết các thao tác nháp là ghi đè lên xử lý khoảng trắng thông thường và kết hợp trình phân tích cú pháp mới vào bộ phối hợp chữ và regex (chúng tôi thường không sử dụng trình phân tích cú pháp). Xem one of our examples để sử dụng, trong trường hợp này để xử lý các nhận xét lồng nhau.

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