packages feed

bindings-bfd-1.2.0.0: src/Bindings/Bfd/Disasm/I386/Lex.x

{
module Bindings.Bfd.Disasm.I386.Lex (
     Token(..)
   , lexer
) where

import System.IO
}

%wrapper "basic"

$whitestuff = [\ \f\v\r]
$decdigit   = [0-9]
$hexdigit   = [0-9 a-f]
$scale      = [1 2 4 8]
$alphanum   = [a-z 0-9]

tokens :-
   $whitestuff+                                             ;
   "data32 "                                                ;
   "-"{0,1}"0x"$hexdigit+                                   { offset           }
   $scale                                                   { offset           }
   "$0x"$hexdigit+                                          { constant         }
   ">0x"$hexdigit+                                          { address          }
   "lock "$alphanum+                                        { prefixedMnemonic }
   "rep "$alphanum+                                         { prefixedMnemonic }
   "repz "$alphanum+                                        { prefixedMnemonic }
   "repnz "$alphanum+                                       { prefixedMnemonic }
   "rex"".X"{0,1}" "$alphanum+                              { prefixedMnemonic }
   "rex (bad)"                                              { prefixedMnemonic }
   "%"$alphanum+"("$decdigit")"                             { register         }
   "%"$alphanum+                                            { register         }
   $alphanum+".s"{0,1}                                      { mnemonic         }
   $alphanum+",pt"{0,1}                                     { mnemonic         }
   $alphanum+",pn"{0,1}                                     { mnemonic         }
   "(bad)"                                                  { mnemonic         }
   "("                                                      { parensL          }
   ")"                                                      { parensR          }
   ","                                                      { comma            }
   ":"                                                      { colon            }
   "#"                                                      { hash             }
   "*"                                                      { star             }

{
data Token = Offset           Int
           | Constant         Int
           | Address          Int
           | PrefixedMnemonic [String]
           | Register         String
           | Mnemonic         String
           | ParensL
           | ParensR
           | Comma
           | Colon
           | Hash
           | Star
     deriving (Eq, Show)

offset   s = Offset   $ read s
constant s = Constant $ read $ tail s
address  s = Address  $ read $ tail s 

prefixedMnemonic s = PrefixedMnemonic $ words s
mnemonic         s = Mnemonic s

register s = Register $ tail s

parensL _ = ParensL
parensR _ = ParensR

comma   _ = Comma
colon   _ = Colon
hash    _ = Hash
star    _ = Star

lexer = alexScanTokens
}