Tôi mới đến Parsec (và để phân tích cú pháp nói chung), và tôi đang gặp một số rắc rối với phân tích cú pháp này tôi đã viết:khó nhận được một phân tích cú pháp Parsec để bỏ qua không gian một cách chính xác
list = char '(' *> many (spaces *> some letter) <* spaces <* char ')'
Ý tưởng là để phân tích danh sách ở định dạng này (tôi đang làm việc lên đến s-biểu thức):
(firstElement secondElement thirdElement and so on)
tôi đã viết mã này để kiểm tra nó:
import Control.Applicative
import Text.ParserCombinators.Parsec hiding (many)
list = char '(' *> many (spaces *> some letter) <* spaces <* char ')'
test s = do
putStrLn $ "Testing " ++ show s ++ ":"
parseTest list s
putStrLn ""
main = do
test "()"
test "(hello)"
test "(hello world)"
test "(hello world)"
test "(hello world)"
test "()"
T mình là đầu ra tôi nhận được:
Testing "()":
[]
Testing "(hello)":
["hello"]
Testing "(hello world)":
["hello","world"]
Testing "(hello world)":
["hello","world"]
Testing "(hello world)":
parse error at (line 1, column 14):
unexpected ")"
expecting space or letter
Testing "()":
parse error at (line 1, column 3):
unexpected ")"
expecting space or letter
Như bạn thấy, nó không thành công khi có khoảng trắng giữa các yếu tố cuối cùng của danh sách, và đóng cửa )
. Tôi không hiểu tại sao không gian trắng không được tiêu thụ bởi spaces
Tôi đã đặt ngay trước <* char ')'
. Tôi đã phạm phải sai lầm ngớ ngẩn gì?