Интересно, можно ли проанализировать, скажем, действительный токен 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>
Как я могу это сделать? Если я сначала проанализирую, а потом проверю, то это не будет скомпоновано.
Еще один вариант использования описанного выше - это использование синтаксического анализа перестановки. Добавление отдельной проверки после синтаксического анализа в этом случае не работает, так как синтаксический анализатор возвращает недопустимые решения. Возврат всех возможных разборов также не работает, так как он не композируется и имеет экспоненциальную стоимость.