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?