У меня есть эти функции:
item :: Parser Char
item = Parser i
where i [] = []
i (x:xs) = [(x,xs)]
many :: Eq a=> Parser a -> Parser [a]
many p = many1 p +++ return []
many1 :: Eq a=> Parser a -> Parser [a]
many1 p = do v <- p
vs <- many p
returns (v:vs)
Я получаю странные результаты, применяя разные строки. Если я выполню:
parse (many item) "x:=0"
я получаю
[('x',0)]
в то время как если я использую другую строку, более длинную, например, «если x = 0, то x: = 0, иначе x: = 1», это выглядит как зацикливание. Делая некоторые попытки, кажется, что если длина строки больше 19 символов, функция не заканчивается. Это странно, потому что на другой строке длиной менее 19 символов это работает хорошо Что бы это могло быть?
Другие определения:
newtype Parser a = Parser { parse :: String -> [(a, String)] }
instance Monad Parser where
return t = Parser $ \s -> [(t, s)]
m >>= k = Parser $ \s -> [(x, y) | (u, v) <- parse m s, (x, y) <- parse (k u) v]
(+++) :: Eq a => Parser a -> Parser a -> Parser a
p +++ q = Parser $ \s -> if((parse p s)==[]) then parse q s else parse p s