(<|>) :: Parser a -> Parser a -> Parser a
f <|> g
= f `seq` g `seq`
- Parser $! do saved <- get -- 状態を保存
+ Parser $! do saved <- get -- 状態を保存
result <- runParser f
case result of
Success a -> return $! Success a
notFollowedBy :: Parser a -> Parser ()
-notFollowedBy p = p `seq`
- (p >> failP) <|> return ()
+notFollowedBy p
+ = p `seq`
+ Parser $! do saved <- get -- 状態を保存
+ result <- runParser p
+ case result of
+ Success a -> do put saved -- 状態を復歸
+ return IllegalInput
+ IllegalInput -> do put saved -- 状態を復歸
+ return $! Success ()
+ ReachedEOF -> do put saved -- 状態を復歸
+ return $! Success ()
digit :: Parser Char