packages feed

hopenpgp-tools-0.13: HOpenPGP/Tools/Lexer.x

{
{-# OPTIONS -w #-}
module HOpenPGP.Tools.Lexer
( alexEOF
, alexSetInput
, alexGetInput
, alexError
, alexScan
, ignorePendingBytes
, alexGetStartCode
, runAlex
, Alex(..)
, Token(..)
, AlexReturn(..)
, AlexPosn(..)
) where

import Prelude hiding (lex)
import Numeric (readHex)
import Codec.Encryption.OpenPGP.Types (TwentyOctetFingerprint(..), EightOctetKeyId(..))

}

%wrapper "monad"

$digit = 0-9
$hexdigit = [0-9A-Fa-f]

tokens :-
  $white+ ;
  a { lex' TokenA }
  and { lex' TokenAnd }
  any { lex' TokenAny }
  every { lex' TokenEvery }
  not { lex' TokenNot }
  one { lex' TokenOne }
  or { lex' TokenOr }
  subkey { lex' TokenSubkey }
  tag { lex' TokenTag }
  of { lex' TokenOf }
  \=\= { lex' TokenEq }
  \= { lex' TokenEq }
  equals { lex' TokenEq }
  \< { lex' TokenLt }
  \> { lex' TokenGt }
  \( { lex' TokenLParen }
  \) { lex' TokenRParen }
  contains { lex' TokenContains }
  pkversion { lex' TokenPKVersion }
  sigversion { lex' TokenSigVersion }
  [Ss]ig[Tt]ype { lex' TokenSigType }
  [Pp][Kk][Aa]lgo { lex' TokenPKAlgo }
  [Ss]ig[Pp][Kk][Aa]lgo { lex' TokenSigPKAlgo }
  [Hh]ash[Aa]lgo { lex' TokenHashAlgo }
  [Rr][Ss][Aa] { lex' TokenRSA }
  [Dd][Ss][Aa] { lex' TokenDSA }
  [Ee]l[Gg]amal { lex' TokenElgamal }
  [Ee][Cc][Dd][Ss][Aa] { lex' TokenECDSA }
  [Ee][Cc][Dd][Hh] { lex' TokenECDH }
  [Dd][Hh] { lex' TokenDH }
  [Bb]inary { lex' TokenBinary }
  [Cc]anonical[Tt]ext { lex' TokenCanonicalText }
  [Ss]tandalone { lex' TokenStandalone }
  [Gg]eneric[Cc]ert { lex' TokenGenericCert }
  [Pp]ersona[Cc]ert { lex' TokenPersonaCert }
  [Cc]asual[Cc]ert { lex' TokenCasualCert }
  [Pp]ositive[Cc]ert { lex' TokenPositiveCert }
  [Ss]ubkey[Bb]inding[Ss]ig { lex' TokenSubkeyBindingSig }
  [Pp]rimary[Kk]ey[Bb]inding[Ss]ig { lex' TokenPrimaryKeyBindingSig }
  [Ss]ignature[Dd]irectly[Oo]n[Aa][Kk]ey { lex' TokenSignatureDirectlyOnAKey }
  [Kk]ey[Rr]evocation[Ss]ig { lex' TokenKeyRevocationSig }
  [Ss]ubkey[Rr]evocation[Ss]ig { lex' TokenSubkeyRevocationSig }
  [Cc]ert[Rr]evocation[Ss]ig { lex' TokenCertRevocationSig }
  [Tt]imestamp[Ss]ig { lex' TokenTimestampSig }
  [Mm][Dd]5 { lex' TokenMD5 }
  [Ss][Hh][Aa]1 { lex' TokenSHA1 }
  [Rr][Ii][Pp][Ee][Mm][Dd]160 { lex' TokenRIPEMD160 }
  [Ss][Hh][Aa]256 { lex' TokenSHA256 }
  [Ss][Hh][Aa]384 { lex' TokenSHA384 }
  [Ss][Hh][Aa]512 { lex' TokenSHA512 }
  [Ss][Hh][Aa]224 { lex' TokenSHA224 }
  [Uu][Ii][Dd]s { lex' TokenUids }
  keysize { lex' TokenKeysize }
  length { lex' TokenLength }
  timestamp { lex' TokenTimestamp }
  fingerprint { lex' TokenFingerprint }
  keyid { lex' TokenKeyID }
  $hexdigit{9}$hexdigit{9}$hexdigit{9}$hexdigit{9}$hexdigit{4} { lex (TokenFpr . read) }
  0x$hexdigit{9}$hexdigit{9}$hexdigit{9}$hexdigit{9}$hexdigit{4} { lex (TokenFpr . read . drop 2) }
  $hexdigit{8}$hexdigit{8} { lex (TokenLongID . Right . read) }
  0x$hexdigit{8}$hexdigit{8} { lex (TokenLongID . Right . read . drop 2) }
  $digit+ { lex (TokenInt  . fromIntegral . read) }
  $hexdigit+ { lex (TokenInt  . fromIntegral . fst . head . readHex) }
  0x$hexdigit+ { lex (TokenInt  . fromIntegral . fst . head . readHex . drop 2) }
  \".*\" { lex (TokenStr . reverse . drop 1 . reverse . drop 1) }

{
data Token
  = TokenTag
  | TokenAnd
  | TokenAny
  | TokenNot
  | TokenOr
  | TokenInt Integer
  | TokenEq
  | TokenLt
  | TokenGt
  | TokenLParen
  | TokenRParen
  | TokenEOF
  | TokenPKVersion
  | TokenSigVersion
  | TokenSigType
  | TokenPKAlgo
  | TokenSigPKAlgo
  | TokenHashAlgo
  | TokenRSA
  | TokenDSA
  | TokenElgamal
  | TokenECDSA
  | TokenECDH
  | TokenDH
  | TokenBinary
  | TokenCanonicalText
  | TokenStandalone
  | TokenGenericCert
  | TokenPersonaCert
  | TokenCasualCert
  | TokenPositiveCert
  | TokenSubkeyBindingSig
  | TokenPrimaryKeyBindingSig
  | TokenSignatureDirectlyOnAKey
  | TokenKeyRevocationSig
  | TokenSubkeyRevocationSig
  | TokenCertRevocationSig
  | TokenTimestampSig
  | TokenMD5
  | TokenSHA1
  | TokenRIPEMD160
  | TokenSHA256
  | TokenSHA384
  | TokenSHA512
  | TokenSHA224
  | TokenKeysize
  | TokenTimestamp
  | TokenFingerprint
  | TokenKeyID
  | TokenFpr TwentyOctetFingerprint
  | TokenLongID (Either String EightOctetKeyId)
  | TokenLength
  | TokenEvery
  | TokenOne
  | TokenOf
  | TokenContains
  | TokenUids
  | TokenStr String
  | TokenA
  | TokenSubkey
  deriving (Eq,Show)

alexEOF = return TokenEOF

lex :: (String -> a) -> AlexAction a
lex f = \(_,_,_,s) i -> return (f (take i s))

lex' :: a -> AlexAction a
lex' = lex . const

}