Tôi muốn thực hiện quy tắc ngữ pháp này sử dụng thư viện parsec Haskell của:Haskell parsec: `many` combinator bên trong một 'optional` combinator
((a | b | c)* (a | b))?
Đó là một quy tắc phân tích cú pháp mà chấp nhận một tùy chọn (tức là có khả năng trống) chuỗi. Nếu chuỗi nó acccepts không phải là trống rỗng, sau đó nó có thể được tiêu thụ bằng cách đi qua không hay nhiều lần xuất hiện của a
b
hoặc c
parsers, nhưng chuỗi chấp nhận bởi bên ngoài nhất ?
tùy chọn phân tích cú pháp phải được tiêu thụ bằng cách phân tích cú pháp a
hoặc b
, nhưng không phải c
. Dưới đây là một ví dụ:
module Main where
import Text.Parsec
import Text.Parsec.Text
a,b,c :: GenParser() Char
a = char 'a'
b = char 'b'
c = char 'c'
-- ((a | b | c)* (a | b))?
myParser = undefined
shouldParse1,shouldParse2,shouldParse3,
shouldParse4,shouldFail :: Either ParseError String
-- these should succeed
shouldParse1 = runParser myParser() "" "" -- because ? optional
shouldParse2 = runParser myParser() "" "b"
shouldParse3 = runParser myParser() "" "ccccccb"
shouldParse4 = runParser myParser() "" "aabccab"
-- this should fail because it ends with a 'c'
shouldFail = runParser myParser() "" "aabccac"
main = do
print shouldParse1
print shouldParse2
print shouldParse3
print shouldParse4
print shouldFail
Một nỗ lực đầu tiên có thể trông như thế này:
myParser = option "" $ do
str <- many (a <|> b <|> c)
ch <- a <|> b
return (str ++ [ch])
Nhưng many
chỉ tiêu thụ tất cả các 'a' 'b' và 'c nhân vật' trong mỗi trường hợp kiểm tra, rời khỏi a <|> b
không có nhân vật để tiêu thụ.
Câu hỏi:
Sử dụng combinators parsec, việc thực hiện đúng ((a | b | c)* (a | b))?
để xác định myParser
là gì?
lẽ phân tích cú pháp (a | b | c) + và từ chối nó sau nếu nó kết thúc bằng c? –