Tìm hiểu Thư viện Parsec trong Haskell - Phần 2

Các Combinator Cơ bản 1

Prelude Text.Parsec Text.Parsec.String> parseTest (count 3 (char 'a')) "aaa"
"aaa"
Prelude Text.Parsec Text.Parsec.String> parseTest (between (char '(') (char ')') anyChar) "(3)"
'3'
Prelude Text.Parsec Text.Parsec.String> parseTest (option ' ' (char 'a')) "b"
' '
Prelude Text.Parsec Text.Parsec.String> parseTest (optionMaybe (char 'a')) "b"
Nothing
Prelude Text.Parsec Text.Parsec.String> parseTest (optionMaybe (char 'b')) "b"
(Just 'b')
Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> optional (char 'a') <*> getInput) "b"
((),"b")
Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> optional (char 'a') <*> getInput) "a"
((),"")
Prelude Text.Parsec Text.Parsec.String> parseTest (optional (string "ab")) "a"
parse error at (line 1, column 1):
unexpected end of input
expecting "ab"
  • count n p thực hiện khớp parser p với n lần liên tiếp.
  • between open close p lần lượt khớp các parser open, p, và close, nhưng chỉ trả về kết quả của p.
  • option x p cố gắng khớp parser p, nếu thất bại thì trả về giá trị mặc định x.
  • optionMaybe p cố gắng khớp parser p, nếu thất bại trả về Nothing, nếu thành công trả về Just kết quả.
  • optional p cố gắng khớp parser p, nếu thất bại không tiêu thụ input. Khi input không đủ sẽ báo lỗi. Khi không lỗi trả về giá trị rỗng.
  • (,) <$> p <*> getInput khớp parser p, sau đó sử dụng toán tử (,) để kết hợp kết quả với phần input còn lại. Hàm getInput trả về phần input còn lại sau khi hoàn thành khớp.

Các Combinator Cơ bản 2

Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> skipMany1 (char 'a') <*> getInput) "aab"
((),"b")
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy (char 'a') (char ',')) "a"
"a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy (char 'a') (char ',')) "a,a,a"
"aaa"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy (char 'a') (char ',')) ""
""
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy (char 'a') (char ',')) "a,"
parse error at (line 1, column 3):
unexpected end of input
expecting "a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy1 (char 'a') (char ',')) ""
parse error at (line 1, column 1):
unexpected end of input
expecting "a"
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy (char 'a') (char ',')) "a,"
"a"
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy (char 'a') (char ',')) "a,a,"
"aa"
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy (char 'a') (char ',')) ""
""
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy (char 'a') (char ',')) "a,a"
parse error at (line 1, column 4):
unexpected end of input
expecting ","
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy1 (char 'a') (char ',')) ""
parse error at (line 1, column 1):
unexpected end of input
expecting "a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) "a"
"a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) "a,"
"a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) "a,a"
"aa"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) "a,a,"
"aa"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) ""
""
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy1 (char 'a') (char ',')) ""
parse error at (line 1, column 1):
unexpected end of input
expecting "a"
  • skipMany1 p cố gắng khớp và bỏ qua parser p một hoặc nhiều lần, trả về giá trị rỗng.
  • sepBy p sep cố gắng khớp không hoặc nhiều lần chuỗi các p được phân cách bởi sep (phải kết thúc bằng p), trả về danh sách các p. sepBy1 p sep là phiên bản yêu cầu ít nhất một lần khớp.
  • endBy p sep cố gắng khớp không hoặc nhiều lần chuỗi các p được phân cách bởi sep (phải kết thúc bằng sep), trả về danh sách các p. endBy1 p sep là phiên bản yêu cầu ít nhất một lần khớp.
  • sepEndBy p sep cố gắng khớp không hoặc nhiều lần chuỗi các p được phân cách bởi sep (có thể kết thúc bằng p hoặc sep), trả về danh sách các p. sepEndBy1 p sep là phiên bản yêu cầu ít nhất một lần khớp.

Các Combinator Cơ bản 3

Prelude Text.Parsec Text.Parsec.String> parseTest eof ""
()
Prelude Text.Parsec Text.Parsec.String> parseTest eof "a"
parse error at (line 1, column 1):
unexpected 'a'
expecting end of input
Prelude Text.Parsec Text.Parsec.String> parseTest (notFollowedBy (char 'a')) "ab"
parse error at (line 1, column 2):
unexpected 'a'
Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> notFollowedBy (char 'a') <*> getInput) "ba"
((),"ba")
Prelude Text.Parsec Text.Parsec.String> parseTest (manyTill (char 'a') (char 'b')) "aab"
"aa"
Prelude Text.Parsec Text.Parsec.String> parseTest (manyTill (char 'a') (char 'b')) "aac"
parse error at (line 1, column 3):
unexpected "c"
expecting "b" or "a"
Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> lookAhead (char 'a') <*> getInput) "ab"
('a',"ab")
Prelude Text.Parsec Text.Parsec.String> parseTest (lookAhead (char 'a')) "ba"
parse error at (line 1, column 1):
unexpected "b"
expecting "a"
Prelude Text.Parsec Text.Parsec.String> parseTest anyToken "ab"
'a'
  • eof khớp với vị trí kết thúc của input.
  • notFollowedBy p chỉ thành công khi parser p thất bại.
  • manyTill p end khớp không hoặc nhiều lần parser p cho đến khi khớp end thành công. Trả về danh sách các p.
  • lookAhead p cố gắng khớp parser p nhưng không tiêu thụ input.
  • anyToken khớp với bất kỳ token nào.

Tài liệu Tham khảo

Intro to Parsing with Parsec in Haskell

Thẻ: Haskell parsec parser-combinator functional-programming

Đăng vào ngày 7 tháng 6 lúc 22:27