packages feed

smt-lib-0.0.1: Language/SMTLIB/Lexer.x

{
module Language.SMTLIB.Lexer
  ( Token (..)
  , lexSMTLIB
  , alexScanTokens
  , alexAndPred
  , alexPrevCharIs
  , alexPrevCharIsOneOf
  , alexRightContext
  , iUnbox
  , alexInputPrevChar
  ) where
}

%wrapper "basic"

$digit = 0-9      -- digits
$alpha = [a-zA-Z]   -- alphabetic characters
$other = [\+\-\/\*\=\%\?\!\.\$\_\~\&\^\<\>\@]
$sym   = [$digit$alpha$other]
$hex   = [a-fA-F$digit]
$bin   = 0-1

tokens :-

  $white+                            ;
  \;.*                               ;
  [$sym # $digit]$sym*               { Symbol  }
  \|[$printable \n # \|]*\|          { Symbol  }
  \:$sym+                            { Keyword }
  $digit+\.$digit+                   { Decimal . read }
  $digit                             { Numeral . read }
  \(                                 { const LeftParen  }
  \)                                 { const RightParen }
  \"(([$printable \n # \\]|\\.)*)\"  { String . read }
  "#x"$hex+                          { Hex . drop 2 }
  "#b"$bin+                          { Bin . drop 2 }
  .                                  { \ s -> error $ "unexpected character: '" ++ s ++ "'" }

{
data Token
  = Numeral Integer
  | Decimal Double
  | Hex     String
  | Bin     String
  | String  String
  | Symbol  String
  | Keyword String
  | LeftParen
  | RightParen
  deriving (Eq,Show)

lexSMTLIB :: String -> [Token]
lexSMTLIB a = alexScanTokens a
}