2012-05-30 39 views
6

Tôi đã có một trình phân tích cú pháp Scala đang hoạt động nhưng giải pháp không sạch như tôi muốn. Vấn đề là một số sản phẩm phải xem xét khoảng trắng như một phần của mã thông báo nhưng các sản phẩm "cấp cao hơn" có thể bỏ qua/bỏ qua khoảng trắng.Scala Parser đôi khi bỏ qua khoảng trắng và đôi khi không

Nếu tôi sử dụng mẫu phân tích cú pháp điển hình của việc mở rộng trình phân tích cú pháp cấp thấp hơn thì cài đặt skipWhitespace được kế thừa và mọi thứ trở nên lộn xộn rất nhanh.

Tôi nghĩ mình nên sử dụng cách tiếp cận mở rộng hơn là có một thể hiện của trình phân tích cú pháp cấp thấp trong lớp của trình phân tích cú pháp cấp cao hơn - nhưng tôi không chắc chắn cách làm mỗi trường hợp sẽ chỉ thấy một luồng các ký tự đầu vào.

Dưới đây là một phần của bộ phân tích thấp nhất cấp -

class VulgarFractionParser extends RegexParsers { 
    override type Elem = Char 

override val whiteSpace = "".r 

Sau đó, tôi mở rộng mà như

class NumberParser extends VulgarFractionParser with Positional { 

Nhưng vào thời điểm này các NumberParser phải xử lý một cách rõ ràng khoảng trắng giống như FractionParser. Đối với NumberParser nó vẫn khá dễ quản lý - nhưng ở cấp độ tiếp theo tôi thực sự muốn có thể chỉ xác định các sản phẩm mà làm sử dụng khoảng trắng làm dấu tách giống như một regexParser bình thường sẽ làm.

Một ví dụ sẽ là một cái gì đó như:

IBM 33.33/ 1200.00 
or 
IBM 33.33/33.50 1200.00 

Giá trị thứ 2 đôi khi có hai phần ngăn cách bởi một "/" và đôi khi chỉ có một phần duy nhất với không có gì sau dấu gạch chéo (hoặc thậm chí không chứa một dấu gạch chéo ở tất cả).

def bidOrAskPrice = ("$"?) ~> (bidOrAskPrice1 | bidOrAskPrice2 | bidOrAskPrice3) 

    def bidOrAskPrice1 = number ~ ("/".r) ~ number ~ (SPACES) ^^ { 
    case a ~ slash ~ b ~ sp1 => BidOrAsk(a,Some(b)) 
    } 
    def bidOrAskPrice2 = (number ~ "/" ~ (SPACES)) ^^ { case a ~ slash ~ sp => BidOrAsk(a,None) } 
    def bidOrAskPrice3 = (number ~ (SPACES?)) ^^ { case a ~ sp => BidOrAsk(a , None)} 
+0

Bạn có thể đưa ra một số ví dụ về sản phẩm nên xem xét khoảng trắng và một số ví dụ về sản phẩm không nên xem xét khoảng trắng? – sarnold

+0

đã cập nhật câu hỏi bằng ví dụ về dữ liệu và một trong các yếu tố nhạy cảm khoảng trắng. – malsmith

Trả lời

2

Không nó làm cho ý nghĩa hơn để biến phân tích cú pháp đầu tiên vào một phân tích cú pháp token (một lexer, thực sự), và làm cho đọc phân tích cú pháp thứ hai mà thay vào đó của đồng bằng Char?

+1

Tôi chưa thấy một ví dụ về cách tiếp cận này nhưng nó nghe có vẻ giống như những gì tôi muốn. – malsmith

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