Сбой или успешность анализа на основе вычисления состояния монады? - PullRequest
0 голосов
/ 12 февраля 2020

Интересно, можно ли проанализировать, скажем, действительный токен JWT, используя megaparse c.

Строка в основном <base64>.<base64>.<base64>, однако последняя часть должна быть действительной подписью.

Простой анализ будет примерно таким, но он не позволяет проверять подпись:

parseJWT :: Parsec Void [Char] (Maybe JWT)
parseJWT = mkJWT <$> (base64 <* ".") <*> (base64 <* ".") <*> base64
  where mkJWT a b c | ...       = Just ...
                    | otherwise = Nothing

Может быть, есть такая функция, как (a -> Bool) -> Parsec Void [Char] a, может быть, или записывающее устройство, например:

parseJWT :: Parsec Void [Char] (Maybe JWT)
parseJWT = mkJWT <$> (startRecording *> base64 <* ".") <*> (base64 <* ".") <*> base64 <* guard
  where mkJWT a b c | ...       = Just ...
                    | otherwise = Nothing
        guard :: [Char] -> Parsec Void [Char] a
        guard str = <check signature here>

Как я могу это сделать? Если я сначала проанализирую, а потом проверю, то это не будет скомпоновано.

Еще один вариант использования описанного выше - это использование синтаксического анализа перестановки. Добавление отдельной проверки после синтаксического анализа в этом случае не работает, так как синтаксический анализатор возвращает недопустимые решения. Возврат всех возможных разборов также не работает, так как он не композируется и имеет экспоненциальную стоимость.

...