2013-02-22 29 views
8

Tôi sẽ tự viết cho mình một lược đồ trong 48 giờ hướng dẫn.Haskell Parsec, điều chỉnh OneOf thành [String]

symbol :: Parser Char 
symbol = oneOf "!#$%&|*+-/:<=>[email protected]^_~" 

Điều này thật tuyệt vời cho các biểu tượng, nhưng nếu tôi có danh sách từ khóa thì sao? (ví dụ: struct, int)

oneOf có thể được điều chỉnh cho phù hợp với danh sách không? Đây là lý tưởng những gì tôi muốn, được mô tả dưới đây.

keywords :: Parser String 
keywords = oneOf ["struct","int",..etc] 

Hoặc tôi có nên nhập Text.Parsec.Char và cố gắng mapM chuỗi trong danh sách từ khóa?

Tôi đang cố gắng mã hóa và chỉ muốn biết thực tiễn tốt nhất là từ những người khác đã đi xuống con đường này.

Các tài liệu nói đến sử dụng một cái gì đó như thế này:

divOrMod = string "div" 
       <|> string "mod" 

http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-Parsec-Char.html

+0

Xin chào, tôi có một số câu hỏi về hướng dẫn đó ... tôi có thể hỏi bạn xem bạn có phiền không? – hashcode55

Trả lời

11

Dạng tổng quát của việc này là the choice combinator, trong đó có các loại sau đây:

choice :: Stream s m t => [ParsecT s u m a] -> ParsecT s u m a 

Về cơ bản, bạn cho nó là một danh sách các trình phân tích cú pháp và nó sẽ thử chúng theo thứ tự cho đến khi thành công. choice được triển khai bằng cách sử dụng (<|>), vì vậy nó giống như cách tiếp cận đó.

Trong trường hợp của bạn, để khớp với danh sách từ khóa nhưng không có trình phân tích cú pháp khác, bạn chỉ có thể ánh xạ string qua danh sách String s và sau đó sử dụng choice.

Mặt khác, mapM string sẽ làm điều gì đó hoàn toàn khác - nó mong đợi tất cả của các trình phân tích cú pháp thành công theo thứ tự.

+1

keys = ["class", "constructor" ...] keywords = choice $ string string keys. Tôi có đang sử dụng phiên bản mới hơn của Parsec không? Không có trường hợp nào cho (Text.Parsec.Prim.Stream s0 m0 Char) phát sinh từ việc sử dụng 'string ' –

+1

@Dave: Thử cho nó một chữ ký kiểu rõ ràng. –

+0

Tôi hiểu rồi. Cảm ơn! :) –

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