2010-05-25 30 views
7

Tôi đã mã hóa một phân tích cú pháp dựa trên phân tích cú pháp combinators Scala:Làm cách nào để cải thiện hơn nữa các thông báo lỗi trong trình phân tích cú pháp dựa trên trình phân tích cú pháp phân tích cú pháp Scala?

class SxmlParser extends RegexParsers with ImplicitConversions with PackratParsers { 
    [...] 
    lazy val document: PackratParser[AstNodeDocument] = 
     ((procinst | element | comment | cdata | whitespace | text)*) ^^ { 
      AstNodeDocument(_) 
     } 
    [...] 
} 
object SxmlParser { 
    def parse(text: String): AstNodeDocument = { 
     var ast = AstNodeDocument() 
     val parser = new SxmlParser() 
     val result = parser.parseAll(parser.document, new CharArrayReader(text.toArray)) 
     result match { 
      case parser.Success(x, _) => ast = x 
      case parser.NoSuccess(err, next) => { 
       tool.die("failed to parse SXML input " + 
        "(line " + next.pos.line + ", column " + next.pos.column + "):\n" + 
        err + "\n" + 
        next.pos.longString) 
      } 
     } 
     ast 
    } 
} 

Thông thường các kết quả phân tích các thông báo lỗi khá tốt đẹp. Nhưng đôi khi nó chỉ trở thành

sxml: ERROR: failed to parse SXML input (line 32, column 1): 
`"' expected but `' found 
^ 

Điều này xảy ra nếu ký tự trích dẫn không được đóng và trình phân tích cú pháp đạt đến EOT. Những gì tôi muốn thấy ở đây là (1) những gì sản xuất các phân tích cú pháp được trong khi nó mong đợi '' '(Tôi đã nhiều người) và (2) ở đâu trong đầu vào sản xuất này bắt đầu phân tích cú pháp (mà là một chỉ số mà Có ai biết làm thế nào tôi có thể cải thiện các thông báo lỗi và bao gồm thêm thông tin về trạng thái phân tích nội bộ thực tế khi lỗi xảy ra (có thể giống như một quy tắc sản xuất stacktrace hoặc bất cứ điều gì có thể được đưa ra hợp lý ở đây để xác định tốt hơn vị trí lỗi). BTW, trên "dòng 32, cột 1" thực sự là vị trí EOT và do đó không sử dụng ở đây, tất nhiên.

Trả lời

1

trong trường hợp này bạn có thể sử dụng err, failure~! với các quy tắc sản xuất thiết kế cụ thể để đối sánh lỗi.

3

tôi vẫn chưa biết làm thế nào để đối phó với (1), nhưng tôi cũng đang tìm kiếm (2) khi tôi tìm thấy trang web này:

https://wiki.scala-lang.org/plugins/viewsource/viewpagesrc.action?pageId=917624

Tôi chỉ sao chép thông tin:

Tính năng nâng cao hữu ích là ghi lại vị trí đầu vào (số dòng và số cột) của các mã thông báo quan trọng. Để làm điều này, bạn phải làm ba việc:

  • Hãy từng loại đầu ra mở rộng scala.util.parsing.input.Positional
  • gọi Parsers.positioned() Combinator
  • Sử dụng một nguồn văn bản hồ sơ dòng và cột vị trí

Cuối cùng, đảm bảo rằng các nguồn vị trí theo dõi. Đối với các luồng, bạn có thể chỉ cần sử dụng scala.util.parsing.input.StreamReader; cho Strings, sử dụng scala.util.parsing.input.CharArrayReader.

Tôi hiện đang chơi với nó vì vậy tôi sẽ cố gắng thêm một ví dụ đơn giản sau

+0

Bây giờ tôi có thể khẳng định rằng cách này để làm điều đó là đúng (và thực sự dễ dàng!). Nó hoạt động hoàn toàn tốt cho tôi – Vinz

+0

Liên kết được cung cấp dường như đã chết. – jbx

+0

Cảm ơn bạn đã báo cáo liên kết chết, tôi đã tìm thấy một nguồn khác cho cùng một lời giải thích. – Vinz

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