packages feed

language-lua 0.2.3 → 0.3.0

raw patch · 16 files changed

+1977/−1052 lines, 16 filesdep ~arraydep ~base

Dependency ranges changed: array, base

Files

+ dist/build/Language/Lua/Annotated/Lexer.hs view
@@ -0,0 +1,691 @@+{-# LANGUAGE CPP,MagicHash #-}+{-# LINE 1 "src/Language/Lua/Annotated/Lexer.x" #-}++{-# OPTIONS_GHC -w #-}++module Language.Lua.Annotated.Lexer+  ( llex+  , llexFile+  , LTok+  , AlexPosn(..)+  ) where++import Language.Lua.Annotated.Syntax+import Language.Lua.Token+import Control.Applicative ((<$>))+import Control.Monad (forM_, unless, when)++#if __GLASGOW_HASKELL__ >= 603+#include "ghcconfig.h"+#elif defined(__GLASGOW_HASKELL__)+#include "config.h"+#endif+#if __GLASGOW_HASKELL__ >= 503+import Data.Array+import Data.Char (ord)+import Data.Array.Base (unsafeAt)+#else+import Array+import Char (ord)+#endif+#if __GLASGOW_HASKELL__ >= 503+import GHC.Exts+#else+import GlaExts+#endif+{-# LINE 1 "templates/wrappers.hs" #-}+{-# LINE 1 "templates/wrappers.hs" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 1 "templates/wrappers.hs" #-}+-- -----------------------------------------------------------------------------+-- Alex wrapper code.+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.++import Data.Word (Word8)+{-# LINE 22 "templates/wrappers.hs" #-}++import qualified Data.Bits++-- | Encode a Haskell String to a list of Word8 values, in UTF8 format.+utf8Encode :: Char -> [Word8]+utf8Encode = map fromIntegral . go . ord+ where+  go oc+   | oc <= 0x7f       = [oc]++   | oc <= 0x7ff      = [ 0xc0 + (oc `Data.Bits.shiftR` 6)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]++   | oc <= 0xffff     = [ 0xe0 + (oc `Data.Bits.shiftR` 12)+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]+   | otherwise        = [ 0xf0 + (oc `Data.Bits.shiftR` 18)+                        , 0x80 + ((oc `Data.Bits.shiftR` 12) Data.Bits..&. 0x3f)+                        , 0x80 + ((oc `Data.Bits.shiftR` 6) Data.Bits..&. 0x3f)+                        , 0x80 + oc Data.Bits..&. 0x3f+                        ]++++type Byte = Word8++-- -----------------------------------------------------------------------------+-- The input type+++type AlexInput = (AlexPosn,     -- current position,+                  Char,         -- previous char+                  [Byte],       -- pending bytes on current char+                  String)       -- current input string++ignorePendingBytes :: AlexInput -> AlexInput+ignorePendingBytes (p,c,ps,s) = (p,c,[],s)++alexInputPrevChar :: AlexInput -> Char+alexInputPrevChar (p,c,bs,s) = c++alexGetByte :: AlexInput -> Maybe (Byte,AlexInput)+alexGetByte (p,c,(b:bs),s) = Just (b,(p,c,bs,s))+alexGetByte (p,c,[],[]) = Nothing+alexGetByte (p,_,[],(c:s))  = let p' = alexMove p c +                                  (b:bs) = utf8Encode c+                              in p' `seq`  Just (b, (p', c, bs, s))+++{-# LINE 89 "templates/wrappers.hs" #-}++{-# LINE 103 "templates/wrappers.hs" #-}++{-# LINE 118 "templates/wrappers.hs" #-}++-- -----------------------------------------------------------------------------+-- Token positions++-- `Posn' records the location of a token in the input text.  It has three+-- fields: the address (number of chacaters preceding the token), line number+-- and column of a token within the file. `start_pos' gives the position of the+-- start of the file and `eof_pos' a standard encoding for the end of file.+-- `move_pos' calculates the new position after traversing a given character,+-- assuming the usual eight character tab stops.+++data AlexPosn = AlexPn !Int !Int !Int+        deriving (Eq,Show)++alexStartPos :: AlexPosn+alexStartPos = AlexPn 0 1 1++alexMove :: AlexPosn -> Char -> AlexPosn+alexMove (AlexPn a l c) '\t' = AlexPn (a+1)  l     (((c+7) `div` 8)*8+1)+alexMove (AlexPn a l c) '\n' = AlexPn (a+1) (l+1)   1+alexMove (AlexPn a l c) _    = AlexPn (a+1)  l     (c+1)+++-- -----------------------------------------------------------------------------+-- Default monad+++data AlexState = AlexState {+        alex_pos :: !AlexPosn,  -- position at current input location+        alex_inp :: String,     -- the current input+        alex_chr :: !Char,      -- the character before the input+        alex_bytes :: [Byte],+        alex_scd :: !Int        -- the current startcode++      , alex_ust :: AlexUserState -- AlexUserState will be defined in the user program++    }++-- Compile with -funbox-strict-fields for best results!++runAlex :: String -> Alex a -> Either String a+runAlex input (Alex f) +   = case f (AlexState {alex_pos = alexStartPos,+                        alex_inp = input,       +                        alex_chr = '\n',+                        alex_bytes = [],++                        alex_ust = alexInitUserState,++                        alex_scd = 0}) of Left msg -> Left msg+                                          Right ( _, a ) -> Right a++newtype Alex a = Alex { unAlex :: AlexState -> Either String (AlexState, a) }++instance Monad Alex where+  m >>= k  = Alex $ \s -> case unAlex m s of +                                Left msg -> Left msg+                                Right (s',a) -> unAlex (k a) s'+  return a = Alex $ \s -> Right (s,a)++alexGetInput :: Alex AlexInput+alexGetInput+ = Alex $ \s@AlexState{alex_pos=pos,alex_chr=c,alex_bytes=bs,alex_inp=inp} -> +        Right (s, (pos,c,bs,inp))++alexSetInput :: AlexInput -> Alex ()+alexSetInput (pos,c,bs,inp)+ = Alex $ \s -> case s{alex_pos=pos,alex_chr=c,alex_bytes=bs,alex_inp=inp} of+                  s@(AlexState{}) -> Right (s, ())++alexError :: String -> Alex a+alexError message = Alex $ \s -> Left message++alexGetStartCode :: Alex Int+alexGetStartCode = Alex $ \s@AlexState{alex_scd=sc} -> Right (s, sc)++alexSetStartCode :: Int -> Alex ()+alexSetStartCode sc = Alex $ \s -> Right (s{alex_scd=sc}, ())+++alexGetUserState :: Alex AlexUserState+alexGetUserState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s,ust)++alexSetUserState :: AlexUserState -> Alex ()+alexSetUserState ss = Alex $ \s -> Right (s{alex_ust=ss}, ())+++alexMonadScan = do+  inp <- alexGetInput+  sc <- alexGetStartCode+  case alexScan inp sc of+    AlexEOF -> alexEOF+    AlexError ((AlexPn _ line column),_,_,_) -> alexError $ "lexical error at line " ++ (show line) ++ ", column " ++ (show column)+    AlexSkip  inp' len -> do+        alexSetInput inp'+        alexMonadScan+    AlexToken inp' len action -> do+        alexSetInput inp'+        action (ignorePendingBytes inp) len++-- -----------------------------------------------------------------------------+-- Useful token actions++type AlexAction result = AlexInput -> Int -> Alex result++-- just ignore this token and scan another one+-- skip :: AlexAction result+skip input len = alexMonadScan++-- ignore this token, but set the start code to a new value+-- begin :: Int -> AlexAction result+begin code input len = do alexSetStartCode code; alexMonadScan++-- perform an action for this token, and set the start code to a new value+andBegin :: AlexAction result -> Int -> AlexAction result+(action `andBegin` code) input len = do alexSetStartCode code; action input len++token :: (AlexInput -> Int -> token) -> AlexAction token+token t input len = return (t input len)++++-- -----------------------------------------------------------------------------+-- Monad (with ByteString input)++{-# LINE 328 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- Basic wrapper++{-# LINE 355 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- Basic wrapper, ByteString version++{-# LINE 373 "templates/wrappers.hs" #-}++{-# LINE 386 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- Posn wrapper++-- Adds text positions to the basic model.++{-# LINE 403 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- Posn wrapper, ByteString version++{-# LINE 418 "templates/wrappers.hs" #-}+++-- -----------------------------------------------------------------------------+-- GScan wrapper++-- For compatibility with previous versions of Alex, and because we can.++alex_base :: AlexAddr+alex_base = AlexA# "\xf8\xff\xff\xff\x4a\x00\x00\x00\x05\x01\x00\x00\x05\x02\x00\x00\xc9\x02\x00\x00\xdc\xff\xff\xff\xfb\xff\xff\xff\x37\x00\x00\x00\xc9\xff\xff\xff\xc6\x01\x00\x00\x00\x00\x00\x00\xfe\x02\x00\x00\x00\x00\x00\x00\x7e\x03\x00\x00\xfe\x03\x00\x00\xfe\x04\x00\x00\x89\x02\x00\x00\x7e\x05\x00\x00\x3e\x05\x00\x00\xc1\xff\xff\xff\x3e\x06\x00\x00\xfe\x05\x00\x00\x00\x00\x00\x00\xfe\x06\x00\x00\xbe\x06\x00\x00\xbe\x07\x00\x00\x82\x08\x00\x00\x52\x00\x00\x00\x1b\x01\x00\x00\x0e\x08\x00\x00\xd7\x08\x00\x00\xee\x08\x00\x00\x27\x09\x00\x00\xdd\xff\xff\xff\x69\x00\x00\x00\x79\x00\x00\x00\x89\x00\x00\x00\x6e\x00\x00\x00\x4d\x09\x00\x00\x27\x08\x00\x00\x9a\x09\x00\x00\x33\x01\x00\x00\xa4\x09\x00\x00\x3d\x01\x00\x00\xe3\x09\x00\x00\x09\x0a\x00\x00\x2f\x0a\x00\x00\x46\x0a\x00\x00\x00\x00\x00\x00\xb7\x0a\x00\x00\x7b\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x66\x00\x00\x00\xbc\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x00\x00\xbd\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\xef\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe1\xff\xff\xff\x3f\x00\x00\x00\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x00\x00\x00\x40\x09\x00\x00\x53\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++alex_table :: AlexAddr+alex_table = AlexA# "\x00\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x49\x00\x5c\x00\x22\x00\x34\x00\x22\x00\x13\x00\x13\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x3f\x00\x25\x00\x05\x00\x1a\x00\x47\x00\x3a\x00\x45\x00\x4a\x00\x03\x00\x4f\x00\x50\x00\x43\x00\x41\x00\x58\x00\x42\x00\x59\x00\x44\x00\x28\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x57\x00\x56\x00\x4c\x00\x4e\x00\x4d\x00\x35\x00\x06\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x53\x00\x3e\x00\x54\x00\x46\x00\x26\x00\x36\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x51\x00\x07\x00\x52\x00\x08\x00\x25\x00\x25\x00\x25\x00\x25\x00\x25\x00\x4b\x00\x1d\x00\x48\x00\x1d\x00\x55\x00\x5b\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x00\x00\x00\x00\x25\x00\x3c\x00\x00\x00\x00\x00\x40\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x06\x00\x24\x00\x3b\x00\x24\x00\x07\x00\x05\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x36\x00\x00\x00\x40\x00\x35\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x14\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x15\x00\x0e\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x09\x00\x0d\x00\x0c\x00\x0c\x00\x0c\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x38\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x37\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x17\x00\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x33\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x04\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x0f\x00\x10\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x32\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x04\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x0f\x00\x10\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x0a\x00\x14\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x00\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x31\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x19\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2a\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x23\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x30\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x19\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1f\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x1c\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x5a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x2a\x00\x00\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x20\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x00\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2d\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x00\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x30\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x19\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x12\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x33\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x04\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++alex_check :: AlexAddr+alex_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3d\x00\x46\x00\x2b\x00\x0a\x00\x2d\x00\x4f\x00\x4f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x0a\x00\x20\x00\x3d\x00\x22\x00\x23\x00\x2d\x00\x25\x00\x3d\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x5b\x00\x3d\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x0a\x00\x5d\x00\x5e\x00\x5f\x00\x5d\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x3d\x00\x7d\x00\x7e\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x3d\x00\x2b\x00\x3d\x00\x2d\x00\x3a\x00\x2e\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\x20\x00\x45\x00\xff\xff\xff\xff\x5b\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3d\x00\x2b\x00\x5b\x00\x2d\x00\x3d\x00\x3d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x5d\x00\xff\xff\x5b\x00\x5b\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x45\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x5d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xc2\x00\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xc2\x00\xc3\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x65\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\x2b\x00\xff\xff\x2d\x00\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x5f\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x45\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x58\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x78\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x70\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x50\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x70\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc2\x00\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_deflt :: AlexAddr+alex_deflt = AlexA# "\xff\xff\x3d\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x16\x00\x0a\x00\x0a\x00\xff\xff\xff\xff\x03\x00\x03\x00\x1a\x00\x1a\x00\xff\xff\x3d\x00\x3d\x00\x3d\x00\x39\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++alex_accept = listArray (0::Int,92) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAcc (alex_action_1),AlexAcc (alex_action_2),AlexAcc (alex_action_2),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7),AlexAcc (alex_action_7),AlexAcc (alex_action_8),AlexAcc (alex_action_8),AlexAcc (alex_action_9),AlexAcc (alex_action_9),AlexAcc (alex_action_10),AlexAcc (alex_action_10),AlexAcc (alex_action_11),AlexAcc (alex_action_12),AlexAcc (alex_action_12),AlexAcc (alex_action_12),AlexAcc (alex_action_13),AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_15),AlexAcc (alex_action_16),AlexAcc (alex_action_16),AlexAcc (alex_action_17),AlexAcc (alex_action_18),AlexAcc (alex_action_19),AlexAcc (alex_action_20),AlexAcc (alex_action_21),AlexAcc (alex_action_22),AlexAcc (alex_action_23),AlexAcc (alex_action_24),AlexAcc (alex_action_25),AlexAcc (alex_action_26),AlexAcc (alex_action_27),AlexAcc (alex_action_28),AlexAcc (alex_action_29),AlexAcc (alex_action_30),AlexAcc (alex_action_31),AlexAcc (alex_action_32),AlexAcc (alex_action_33),AlexAcc (alex_action_34),AlexAcc (alex_action_35),AlexAcc (alex_action_36),AlexAcc (alex_action_37),AlexAcc (alex_action_38),AlexAcc (alex_action_39),AlexAcc (alex_action_40),AlexAcc (alex_action_41),AlexAcc (alex_action_42),AlexAcc (alex_action_43),AlexAcc (alex_action_44)]+{-# LINE 102 "src/Language/Lua/Annotated/Lexer.x" #-}+++data AlexUserState = AlexUserState { stringState     :: !Bool+                                   , stringDelimLen  :: !Int+                                   , stringPosn      :: !AlexPosn+                                   , stringValue     :: !String+                                   -- comments+                                   , commentState    :: !Bool+                                   }++alexInitUserState :: AlexUserState+alexInitUserState = AlexUserState { stringState     = False+                                  , stringDelimLen  = 0+                                  , stringPosn      = AlexPn 0 0 0+                                  , stringValue     = ""+                                  , commentState    = False+                                  }++initString :: Int -> AlexPosn -> Alex ()+initString i posn = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=True,stringValue="",stringDelimLen=i,stringPosn=posn}}, ())++initComment :: Alex ()+initComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=True}}, ())++getStringDelimLen :: Alex Int+getStringDelimLen = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringDelimLen ust)++getStringPosn :: Alex AlexPosn+getStringPosn = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringPosn ust)++getStringValue :: Alex String+getStringValue = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringValue ust)++getStringState :: Alex Bool+getStringState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringState ust)++getCommentState :: Alex Bool+getCommentState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, commentState ust)++addCharToStringValue :: Char -> Alex ()+addCharToStringValue c = Alex $ \s -> Right (s{alex_ust=(alex_ust s){stringValue=c:stringValue (alex_ust s)}}, ())++enterString :: AlexAction LTok+enterString (posn,_,_,s) len = do+  initString (if (s !! (len-1) == '\n') then len-1 else len) posn+  alexMonadScan'++enterComment :: AlexAction LTok+enterComment _ _ = do+  initComment+  alexMonadScan'++addString :: AlexAction LTok+addString (_,_,_,s) len = do+  forM_ (take len s) addCharToStringValue+  alexMonadScan'++addCharToString :: AlexAction LTok+addCharToString (_,_,_,s) len = do+  addCharToStringValue (head s)+  alexMonadScan'++endString :: Alex ()+endString = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=False}}, ())++endComment :: Alex ()+endComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=False}}, ())++testAndEndComment :: AlexAction LTok+testAndEndComment _ _ = do+  ss <- getStringState+  if ss then alexMonadScan' else endComment >> alexSetStartCode 0 >> alexMonadScan'++testAndEndString :: AlexAction LTok+testAndEndString (_,_,_,s) len = do+  startlen <- getStringDelimLen+  if startlen /= len+    then do forM_ (take len s) addCharToStringValue+            alexMonadScan'+    else do endString+            alexSetStartCode 0+            cs <- getCommentState+            if cs+              then do+                endComment+                alexMonadScan'+              else do+                val  <- getStringValue+                posn <- getStringPosn+                return (LTokSLit (reverse val), posn)++data EOF = EOF deriving Show++-- | Lua token with position information.+type LTok = (LToken, AlexPosn)++-- type AlexAction result = AlexInput -> Int -> Alex result++-- Helper to make LTokens with string value (like LTokNum, LTokSLit etc.)+tokWValue :: (String -> LToken) -> AlexInput -> Int -> Alex LTok+tokWValue tok (posn,_,_,s) len = return (tok (take len s), posn)++tok :: LToken -> AlexInput -> Int -> Alex LTok+tok t (posn,_,_,_) _ = return (t, posn)++{-# INLINE ident #-}+ident :: AlexAction LTok+ident (posn,_,_,s) len = return (tok, posn)+  where tok = case (take len s) of+          "and"      -> LTokAnd+          "break"    -> LTokBreak+          "do"       -> LTokDo+          "else"     -> LTokElse+          "elseif"   -> LTokElseIf+          "end"      -> LTokEnd+          "false"    -> LTokFalse+          "for"      -> LTokFor+          "function" -> LTokFunction+          "goto"     -> LTokGoto+          "if"       -> LTokIf+          "in"       -> LTokIn+          "local"    -> LTokLocal+          "nil"      -> LTokNil+          "not"      -> LTokNot+          "or"       -> LTokOr+          "repeat"   -> LTokRepeat+          "return"   -> LTokReturn+          "then"     -> LTokThen+          "true"     -> LTokTrue+          "until"    -> LTokUntil+          "while"    -> LTokWhile+          ident'     -> LTokIdent ident'++--data AlexPosn = AlexPn !Int  -- absolute character offset+--                       !Int  -- line number+--                       !Int  -- column number+--+--type AlexInput = (AlexPosn,     -- current position,+--                  Char,         -- previous char+--                  [Byte],       -- rest of the bytes for the current char+--                  String)       -- current input string++alexEOF :: Alex LTok+alexEOF = return (LTokEof, AlexPn (-1) (-1) (-1))++alexMonadScan' :: Alex LTok+alexMonadScan' = do+  inp <- alexGetInput+  sc <- alexGetStartCode+  case alexScan inp sc of+    AlexEOF -> do cs <- getCommentState+                  when cs endString+                  alexEOF+    AlexError ((AlexPn _ line col),ch,_,_) -> alexError $ concat+        [ "lexical error near line: " , show line , " col: " , show col , " at char " , [ch] ]+    AlexSkip  inp' len -> do+        alexSetInput inp'+        alexMonadScan'+    AlexToken inp' len action -> do+        alexSetInput inp'+        action (ignorePendingBytes inp) len++scanner :: String -> Either String [LTok]+scanner str = runAlex str loop+  where loop = do+          t@(tok, _) <- alexMonadScan'+          if tok == LTokEof+            then do stringState <- getStringState+                    if stringState+                      then alexError "String not closed at end of file"+                      else return [t]+            else do toks <- loop+                    return (t:toks)++-- | Lua lexer.+llex :: String -> [LTok]+llex s = case scanner s of+           Left err -> error err+           Right r  -> r++-- | Run Lua lexer on a file.+llexFile :: FilePath -> IO [LTok]+llexFile p = llex <$> readFile p+++state_comment,state_string :: Int+state_comment = 1+state_string = 2+alex_action_1 =  ident +alex_action_2 =  tokWValue LTokNum +alex_action_3 =  tokWValue LTokNum +alex_action_4 =  tokWValue LTokNum +alex_action_5 =  tokWValue LTokNum +alex_action_6 =  tokWValue LTokNum +alex_action_7 =  tokWValue LTokNum +alex_action_8 =  \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) +alex_action_9 =  \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) +alex_action_10 =  enterString `andBegin` state_string +alex_action_11 =  testAndEndString +alex_action_12 =  addCharToString +alex_action_13 =  enterComment `andBegin` state_comment +alex_action_15 =  testAndEndComment +alex_action_16 =  enterString `andBegin` state_string +alex_action_17 =  tok LTokPlus +alex_action_18 =  tok LTokMinus +alex_action_19 =  tok LTokStar +alex_action_20 =  tok LTokSlash +alex_action_21 =  tok LTokPercent +alex_action_22 =  tok LTokExp +alex_action_23 =  tok LTokSh +alex_action_24 =  tok LTokEqual +alex_action_25 =  tok LTokNotequal +alex_action_26 =  tok LTokLEq +alex_action_27 =  tok LTokGEq +alex_action_28 =  tok LTokLT +alex_action_29 =  tok LTokGT +alex_action_30 =  tok LTokAssign +alex_action_31 =  tok LTokLParen +alex_action_32 =  tok LTokRParen +alex_action_33 =  tok LTokLBrace +alex_action_34 =  tok LTokRBrace +alex_action_35 =  tok LTokLBracket +alex_action_36 =  tok LTokRBracket +alex_action_37 =  tok LTokDColon +alex_action_38 =  tok LTokSemic +alex_action_39 =  tok LTokColon +alex_action_40 =  tok LTokComma +alex_action_41 =  tok LTokDot +alex_action_42 =  tok LTokDDot +alex_action_43 =  tok LTokEllipsis +alex_action_44 =  tok LTokEof +{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<command-line>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- -----------------------------------------------------------------------------+-- ALEX TEMPLATE+--+-- This code is in the PUBLIC DOMAIN; you may copy it freely and use+-- it for any purpose whatsoever.++-- -----------------------------------------------------------------------------+-- INTERNALS and main scanner engine++{-# LINE 21 "templates/GenericTemplate.hs" #-}++++++#if __GLASGOW_HASKELL__ > 706+#define GTE(n,m) (tagToEnum# (n >=# m))+#define EQ(n,m) (tagToEnum# (n ==# m))+#else+#define GTE(n,m) (n >=# m)+#define EQ(n,m) (n ==# m)+#endif+{-# LINE 50 "templates/GenericTemplate.hs" #-}+++data AlexAddr = AlexA# Addr#++#if __GLASGOW_HASKELL__ < 503+uncheckedShiftL# = shiftL#+#endif++{-# INLINE alexIndexInt16OffAddr #-}+alexIndexInt16OffAddr (AlexA# arr) off =+#ifdef WORDS_BIGENDIAN+  narrow16Int# i+  where+        i    = word2Int# ((high `uncheckedShiftL#` 8#) `or#` low)+        high = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+        low  = int2Word# (ord# (indexCharOffAddr# arr off'))+        off' = off *# 2#+#else+  indexInt16OffAddr# arr off+#endif++++++{-# INLINE alexIndexInt32OffAddr #-}+alexIndexInt32OffAddr (AlexA# arr) off = +#ifdef WORDS_BIGENDIAN+  narrow32Int# i+  where+   i    = word2Int# ((b3 `uncheckedShiftL#` 24#) `or#`+		     (b2 `uncheckedShiftL#` 16#) `or#`+		     (b1 `uncheckedShiftL#` 8#) `or#` b0)+   b3   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 3#)))+   b2   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 2#)))+   b1   = int2Word# (ord# (indexCharOffAddr# arr (off' +# 1#)))+   b0   = int2Word# (ord# (indexCharOffAddr# arr off'))+   off' = off *# 4#+#else+  indexInt32OffAddr# arr off+#endif++++++#if __GLASGOW_HASKELL__ < 503+quickIndex arr i = arr ! i+#else+-- GHC >= 503, unsafeAt is available from Data.Array.Base.+quickIndex = unsafeAt+#endif+++++-- -----------------------------------------------------------------------------+-- Main lexing routines++data AlexReturn a+  = AlexEOF+  | AlexError  !AlexInput+  | AlexSkip   !AlexInput !Int+  | AlexToken  !AlexInput !Int a++-- alexScan :: AlexInput -> StartCode -> AlexReturn a+alexScan input (I# (sc))+  = alexScanUser undefined input (I# (sc))++alexScanUser user input (I# (sc))+  = case alex_scan_tkn user input 0# input sc AlexNone of+	(AlexNone, input') ->+		case alexGetByte input of+			Nothing -> ++++				   AlexEOF+			Just _ ->++++				   AlexError input'++	(AlexLastSkip input'' len, _) ->++++		AlexSkip input'' len++	(AlexLastAcc k input''' len, _) ->++++		AlexToken input''' len k+++-- Push the input through the DFA, remembering the most recent accepting+-- state it encountered.++alex_scan_tkn user orig_input len input s last_acc =+  input `seq` -- strict in the input+  let +	new_acc = (check_accs (alex_accept `quickIndex` (I# (s))))+  in+  new_acc `seq`+  case alexGetByte input of+     Nothing -> (new_acc, input)+     Just (c, new_input) -> ++++      case fromIntegral c of { (I# (ord_c)) ->+        let+                base   = alexIndexInt32OffAddr alex_base s+                offset = (base +# ord_c)+                check  = alexIndexInt16OffAddr alex_check offset+		+                new_s = if GTE(offset,0#) && EQ(check,ord_c)+			  then alexIndexInt16OffAddr alex_table offset+			  else alexIndexInt16OffAddr alex_deflt s+	in+        case new_s of+	    -1# -> (new_acc, input)+		-- on an error, we want to keep the input *before* the+		-- character that failed, not after.+    	    _ -> alex_scan_tkn user orig_input (if c < 0x80 || c >= 0xC0 then (len +# 1#) else len)+                                                -- note that the length is increased ONLY if this is the 1st byte in a char encoding)+			new_input new_s new_acc+      }+  where+	check_accs (AlexAccNone) = last_acc+	check_accs (AlexAcc a  ) = AlexLastAcc a input (I# (len))+	check_accs (AlexAccSkip) = AlexLastSkip  input (I# (len))+{-# LINE 196 "templates/GenericTemplate.hs" #-}++data AlexLastAcc a+  = AlexNone+  | AlexLastAcc a !AlexInput !Int+  | AlexLastSkip  !AlexInput !Int++instance Functor AlexLastAcc where+    fmap f AlexNone = AlexNone+    fmap f (AlexLastAcc x y z) = AlexLastAcc (f x) y z+    fmap f (AlexLastSkip x y) = AlexLastSkip x y++data AlexAcc a user+  = AlexAccNone+  | AlexAcc a+  | AlexAccSkip+{-# LINE 240 "templates/GenericTemplate.hs" #-}++-- used by wrappers+iUnbox (I# (i)) = i
language-lua.cabal view
@@ -2,7 +2,12 @@ Description:         Lua 5.2 lexer, parser and pretty-printer. Documentation: (<https://osa1.github.com/language-lua>)                      .                      Changelog:+                     \0.3.0:+                     .+                     - Added non-annotated syntax to make code-generation easier.+                     .                      \0.2.3:+                     .                      - Minor internal changes.                      .                      \0.2.2:@@ -12,7 +17,7 @@                      \0.2.0:                      .                      - Syntax tree is annotated. All parsers(`parseText`, `parseFile`) annotate resulting tree with source positions.-Version:             0.2.3+Version:             0.3.0 Synopsis:            Lua parser and pretty-printer Homepage:            http://github.com/osa1/language-lua Bug-reports:         http://github.com/osa1/language-lua/issues@@ -34,17 +39,23 @@ Library   Hs-source-dirs:    src -  Exposed-modules:   Language.Lua,-                     Language.Lua.Types,-                     Language.Lua.Token,-                     Language.Lua.Parser,-                     Language.Lua.Lexer,+  Exposed-modules:   Language.Lua+                     Language.Lua.Token+                     Language.Lua.Syntax+                     Language.Lua.Parser                      Language.Lua.PrettyPrinter+                     Language.Lua.Annotated+                     Language.Lua.Annotated.Syntax+                     Language.Lua.Annotated.Parser+                     Language.Lua.Annotated.Simplify                      Text.Parsec.LTok -  Other-modules:     Text.PrettyPrint.Leijen+  Other-modules:     Language.Lua.Annotated.Lexer+                     Text.PrettyPrint.Leijen -  Build-depends:     base >= 4.5 && < 4.7,+  Build-depends:     base >= 4.5 && < 4.8,                      mtl >= 2.0 && < 2.2,                      parsec >= 3.1.3 && < 3.2,-                     array >= 0.4 && < 0.5+                     array >= 0.4 && < 0.6++  ghc-options:       -Wall
src/Language/Lua.hs view
@@ -1,19 +1,14 @@ module Language.Lua-  ( parseText+  ( module Language.Lua.Syntax+  , parseText   , parseFile-  , llex-  , llexFile   , stat   , exp   , chunk-  , Block(..)-  , Stat(..)-  , Exp(..)   , pprint   ) where  import Prelude hiding (exp)-import Language.Lua.Types-import Language.Lua.Lexer+import Language.Lua.Syntax import Language.Lua.Parser import Language.Lua.PrettyPrinter
+ src/Language/Lua/Annotated.hs view
@@ -0,0 +1,12 @@+module Language.Lua.Annotated+  ( module Language.Lua.Annotated.Syntax+  , parseText+  , parseFile+  , stat+  , exp+  , chunk+  ) where++import Prelude hiding (exp)+import Language.Lua.Annotated.Syntax+import Language.Lua.Annotated.Parser
+ src/Language/Lua/Annotated/Lexer.x view
@@ -0,0 +1,285 @@+{+{-# OPTIONS_GHC -w #-}++module Language.Lua.Annotated.Lexer+  ( llex+  , llexFile+  , LTok+  , AlexPosn(..)+  ) where++import Language.Lua.Annotated.Syntax+import Language.Lua.Token+import Control.Applicative ((<$>))+import Control.Monad (forM_, unless, when)+}++%wrapper "monadUserState"++$space = [ \ \t ]                        -- horizontal white space++$letter      = [a-zA-Z_]                 -- first letter of variables+$identletter = [a-zA-Z_0-9]              -- letters for rest of variables++$digit    = 0-9                          -- decimal digits+$octdigit = 0-7                          -- octal digits+$hexdigit = [0-9a-fA-F]                  -- hexadecimal digits++$dqstr    = \0-\255 # [ \" \n ]          -- valid character in a string literal with dquotes+$sqstr    = \0-\255 # [ \' \n ]          -- valid character in a string literal with quotes+$longstr  = \0-\255                      -- valid character in a long string++-- escape characters+@charescd  = \\ ([ntvbrfaeE\\\?\"] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)+@charescs  = \\ ([ntvbrfaeE\\\?\'] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)++@digits    = $digit++@hexdigits = $hexdigit+++@mantpart = (@digits \. @digits) | @digits \. | \. @digits+@exppart  = [eE][\+\-]? @digits++@hexprefix = 0x | 0X+@mantparthex = (@hexdigits \. @hexdigits) | @hexdigits \. | \. @hexdigits+@expparthex  = [pP][\+\-]? @hexdigits++tokens :-++    <0> $white+  ;++    <0> $letter $identletter* { ident }++    <0> @digits                              { tokWValue LTokNum }+    <0> @digits @exppart                     { tokWValue LTokNum }+    <0> @mantpart @exppart?                  { tokWValue LTokNum }+    <0> @hexprefix @hexdigits                { tokWValue LTokNum }+    <0> @hexprefix @hexdigits @expparthex    { tokWValue LTokNum }+    <0> @hexprefix @mantparthex @expparthex? { tokWValue LTokNum }++    <0> \"($dqstr|@charescd)*\" { \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) }+    <0> \'($sqstr|@charescs)*\' { \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) }++    -- long strings+    <0> \[ \=* \[ \n?        { enterString `andBegin` state_string }+    <state_string> \] \=* \] { testAndEndString }+    <state_string> $longstr  { addCharToString }++    <0> "--"                      { enterComment `andBegin` state_comment }+    <state_comment> . # \n        ;+    <state_comment> \n            { testAndEndComment }+    <state_comment> \[ \=* \[ \n? { enterString `andBegin` state_string }++    <0> "+"   { tok LTokPlus }+    <0> "-"   { tok LTokMinus }+    <0> "*"   { tok LTokStar }+    <0> "/"   { tok LTokSlash }+    <0> "%"   { tok LTokPercent }+    <0> "^"   { tok LTokExp }+    <0> "#"   { tok LTokSh }+    <0> "=="  { tok LTokEqual }+    <0> "~="  { tok LTokNotequal }+    <0> "<="  { tok LTokLEq }+    <0> ">="  { tok LTokGEq }+    <0> "<"   { tok LTokLT }+    <0> ">"   { tok LTokGT }+    <0> "="   { tok LTokAssign }+    <0> "("   { tok LTokLParen }+    <0> ")"   { tok LTokRParen }+    <0> "{"   { tok LTokLBrace }+    <0> "}"   { tok LTokRBrace }+    <0> "["   { tok LTokLBracket }+    <0> "]"   { tok LTokRBracket }+    <0> "::"  { tok LTokDColon }+    <0> ";"   { tok LTokSemic }+    <0> ":"   { tok LTokColon }+    <0> ","   { tok LTokComma }+    <0> "."   { tok LTokDot }+    <0> ".."  { tok LTokDDot }+    <0> "..." { tok LTokEllipsis }++    \EOF  { tok LTokEof }++{++data AlexUserState = AlexUserState { stringState     :: !Bool+                                   , stringDelimLen  :: !Int+                                   , stringPosn      :: !AlexPosn+                                   , stringValue     :: !String+                                   -- comments+                                   , commentState    :: !Bool+                                   }++alexInitUserState :: AlexUserState+alexInitUserState = AlexUserState { stringState     = False+                                  , stringDelimLen  = 0+                                  , stringPosn      = AlexPn 0 0 0+                                  , stringValue     = ""+                                  , commentState    = False+                                  }++initString :: Int -> AlexPosn -> Alex ()+initString i posn = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=True,stringValue="",stringDelimLen=i,stringPosn=posn}}, ())++initComment :: Alex ()+initComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=True}}, ())++getStringDelimLen :: Alex Int+getStringDelimLen = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringDelimLen ust)++getStringPosn :: Alex AlexPosn+getStringPosn = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringPosn ust)++getStringValue :: Alex String+getStringValue = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringValue ust)++getStringState :: Alex Bool+getStringState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringState ust)++getCommentState :: Alex Bool+getCommentState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, commentState ust)++addCharToStringValue :: Char -> Alex ()+addCharToStringValue c = Alex $ \s -> Right (s{alex_ust=(alex_ust s){stringValue=c:stringValue (alex_ust s)}}, ())++enterString :: AlexAction LTok+enterString (posn,_,_,s) len = do+  initString (if (s !! (len-1) == '\n') then len-1 else len) posn+  alexMonadScan'++enterComment :: AlexAction LTok+enterComment _ _ = do+  initComment+  alexMonadScan'++addString :: AlexAction LTok+addString (_,_,_,s) len = do+  forM_ (take len s) addCharToStringValue+  alexMonadScan'++addCharToString :: AlexAction LTok+addCharToString (_,_,_,s) len = do+  addCharToStringValue (head s)+  alexMonadScan'++endString :: Alex ()+endString = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=False}}, ())++endComment :: Alex ()+endComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=False}}, ())++testAndEndComment :: AlexAction LTok+testAndEndComment _ _ = do+  ss <- getStringState+  if ss then alexMonadScan' else endComment >> alexSetStartCode 0 >> alexMonadScan'++testAndEndString :: AlexAction LTok+testAndEndString (_,_,_,s) len = do+  startlen <- getStringDelimLen+  if startlen /= len+    then do forM_ (take len s) addCharToStringValue+            alexMonadScan'+    else do endString+            alexSetStartCode 0+            cs <- getCommentState+            if cs+              then do+                endComment+                alexMonadScan'+              else do+                val  <- getStringValue+                posn <- getStringPosn+                return (LTokSLit (reverse val), posn)++data EOF = EOF deriving Show++-- | Lua token with position information.+type LTok = (LToken, AlexPosn)++-- type AlexAction result = AlexInput -> Int -> Alex result++-- Helper to make LTokens with string value (like LTokNum, LTokSLit etc.)+tokWValue :: (String -> LToken) -> AlexInput -> Int -> Alex LTok+tokWValue tok (posn,_,_,s) len = return (tok (take len s), posn)++tok :: LToken -> AlexInput -> Int -> Alex LTok+tok t (posn,_,_,_) _ = return (t, posn)++{-# INLINE ident #-}+ident :: AlexAction LTok+ident (posn,_,_,s) len = return (tok, posn)+  where tok = case (take len s) of+          "and"      -> LTokAnd+          "break"    -> LTokBreak+          "do"       -> LTokDo+          "else"     -> LTokElse+          "elseif"   -> LTokElseIf+          "end"      -> LTokEnd+          "false"    -> LTokFalse+          "for"      -> LTokFor+          "function" -> LTokFunction+          "goto"     -> LTokGoto+          "if"       -> LTokIf+          "in"       -> LTokIn+          "local"    -> LTokLocal+          "nil"      -> LTokNil+          "not"      -> LTokNot+          "or"       -> LTokOr+          "repeat"   -> LTokRepeat+          "return"   -> LTokReturn+          "then"     -> LTokThen+          "true"     -> LTokTrue+          "until"    -> LTokUntil+          "while"    -> LTokWhile+          ident'     -> LTokIdent ident'++--data AlexPosn = AlexPn !Int  -- absolute character offset+--                       !Int  -- line number+--                       !Int  -- column number+--+--type AlexInput = (AlexPosn,     -- current position,+--                  Char,         -- previous char+--                  [Byte],       -- rest of the bytes for the current char+--                  String)       -- current input string++alexEOF :: Alex LTok+alexEOF = return (LTokEof, AlexPn (-1) (-1) (-1))++alexMonadScan' :: Alex LTok+alexMonadScan' = do+  inp <- alexGetInput+  sc <- alexGetStartCode+  case alexScan inp sc of+    AlexEOF -> do cs <- getCommentState+                  when cs endString+                  alexEOF+    AlexError ((AlexPn _ line col),ch,_,_) -> alexError $ concat+        [ "lexical error near line: " , show line , " col: " , show col , " at char " , [ch] ]+    AlexSkip  inp' len -> do+        alexSetInput inp'+        alexMonadScan'+    AlexToken inp' len action -> do+        alexSetInput inp'+        action (ignorePendingBytes inp) len++scanner :: String -> Either String [LTok]+scanner str = runAlex str loop+  where loop = do+          t@(tok, _) <- alexMonadScan'+          if tok == LTokEof+            then do stringState <- getStringState+                    if stringState+                      then alexError "String not closed at end of file"+                      else return [t]+            else do toks <- loop+                    return (t:toks)++-- | Lua lexer.+llex :: String -> [LTok]+llex s = case scanner s of+           Left err -> error err+           Right r  -> r++-- | Run Lua lexer on a file.+llexFile :: FilePath -> IO [LTok]+llexFile p = llex <$> readFile p+}
+ src/Language/Lua/Annotated/Parser.hs view
@@ -0,0 +1,410 @@+{-# OPTIONS_GHC -fno-warn-hi-shadowing+                -fno-warn-name-shadowing+                -fno-warn-unused-do-bind #-}+module Language.Lua.Annotated.Parser+  ( parseText+  , parseFile+  , stat+  , exp+  , chunk+  ) where++import Prelude hiding (exp, LT, GT, EQ, repeat)++import Language.Lua.Annotated.Lexer+import Language.Lua.Annotated.Syntax+import Language.Lua.Token++import Text.Parsec hiding (string)+import Text.Parsec.LTok+import Text.Parsec.Expr+import Control.Applicative ((<*), (<$>), (<*>))+import Control.Monad (liftM)++-- | Runs Lua lexer before parsing. Use @parseText stat@ to parse+-- statements, and @parseText exp@ to parse expressions.+parseText :: Parser a -> String -> Either ParseError a+parseText p s = parse p "<string>" (llex s)++-- | Parse a Lua file. You can use @parseText chunk@ to parse a file from a string.+parseFile :: FilePath -> IO (Either ParseError (Block SourcePos))+parseFile path = parse chunk path . llex <$> readFile path++parens :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a+parens = between (tok LTokLParen) (tok LTokRParen)++brackets :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a+brackets = between (tok LTokLBracket) (tok LTokRBracket)++name :: Parser (Name SourcePos)+name = do+    pos <- getPosition+    str <- tokenValue <$> anyIdent+    return $ Name pos str++number :: Parser String+number = tokenValue <$> anyNum+++data PrimaryExp a+    = PName a (Name a)+    | PParen a (Exp a)+    deriving (Show, Eq)++data SuffixedExp a+    = SuffixedExp a (PrimaryExp a) [SuffixExp a]+    deriving (Show, Eq)++data SuffixExp a+    = SSelect a (Name a)+    | SSelectExp a (Exp a)+    | SSelectMethod a (Name a) (FunArg a)+    | SFunCall a (FunArg a)+    deriving (Show, Eq)++primaryExp :: Parser (PrimaryExp SourcePos)+primaryExp = do+    pos <- getPosition+    PName pos <$> name <|> PParen pos <$> parens exp++suffixedExp :: Parser (SuffixedExp SourcePos)+suffixedExp = SuffixedExp <$> getPosition <*> primaryExp <*> many suffixExp++suffixExp :: Parser (SuffixExp SourcePos)+suffixExp = selectName <|> selectExp <|> selectMethod <|> funarg+  where selectName   = SSelect <$> getPosition <*> (tok LTokDot >> name)+        selectExp    = SSelectExp <$> getPosition <*> brackets exp+        selectMethod = do+          pos <- getPosition+          tok LTokColon+          SSelectMethod pos <$> name <*> funArg+        funarg       = SFunCall <$> getPosition <*> funArg++sexpToPexp :: SuffixedExp SourcePos -> PrefixExp SourcePos+sexpToPexp (SuffixedExp _ t r) = case r of+    []                                -> t'+    (SSelect pos sname:xs)            -> iter xs (PEVar     pos (SelectName pos t' sname))+    (SSelectExp pos sexp:xs)          -> iter xs (PEVar     pos (Select pos t' sexp))+    (SSelectMethod pos mname args:xs) -> iter xs (PEFunCall pos (MethodCall pos t' mname args))+    (SFunCall pos args:xs)            -> iter xs (PEFunCall pos (NormalFunCall pos t' args))++  where t' :: PrefixExp SourcePos+        t' = case t of+               PName pos name -> PEVar pos (VarName pos name)+               PParen pos exp -> Paren pos exp++        iter :: [SuffixExp SourcePos] -> PrefixExp SourcePos -> PrefixExp SourcePos+        iter [] pe                                = pe+        iter (SSelect pos sname:xs) pe            = iter xs (PEVar pos (SelectName pos pe sname))+        iter (SSelectExp pos sexp:xs) pe          = iter xs (PEVar pos (Select pos pe sexp))+        iter (SSelectMethod pos mname args:xs) pe = iter xs (PEFunCall pos (MethodCall pos pe mname args))+        iter (SFunCall pos args:xs) pe            = iter xs (PEFunCall pos (NormalFunCall pos pe args))++-- TODO: improve error messages.+sexpToVar :: SuffixedExp SourcePos -> Parser (Var SourcePos)+sexpToVar (SuffixedExp pos (PName _ name) []) = return (VarName pos name)+sexpToVar (SuffixedExp _ _ []) = fail "syntax error"+sexpToVar sexp = case sexpToPexp sexp of+                   PEVar _ var -> return var+                   _ -> fail "syntax error"++sexpToFunCall :: SuffixedExp SourcePos -> Parser (FunCall SourcePos)+sexpToFunCall (SuffixedExp _ _ []) = fail "syntax error"+sexpToFunCall sexp = case sexpToPexp sexp of+                       PEFunCall _ funcall -> return funcall+                       _ -> fail "syntax error"++var :: Parser (Var SourcePos)+var = suffixedExp >>= sexpToVar++funCall :: Parser (FunCall SourcePos)+funCall = suffixedExp >>= sexpToFunCall++stringlit :: Parser String+stringlit = tokenValue <$> string++funArg :: Parser (FunArg SourcePos)+funArg = tableArg <|> stringArg <|> arglist+  where tableArg  = TableArg <$> getPosition <*> table+        stringArg = StringArg <$> getPosition <*> stringlit+        arglist   = do+          pos <- getPosition+          parens (do exps <- exp `sepBy` tok LTokComma+                     return $ Args pos exps)++funBody :: Parser (FunBody SourcePos)+funBody = do+    pos <- getPosition+    (params, vararg) <- arglist+    body <- block+    tok LTokEnd+    return $ FunBody pos params vararg body++  where lastarg = do+          pos <- getPosition+          arg <- optionMaybe (tok LTokEllipsis <|> tok LTokComma)+          case arg of+            Just LTokEllipsis -> return (Just pos)+            _ -> return Nothing++        arglist = parens $ do+          vars <- name `sepEndBy` tok LTokComma+          vararg <- lastarg+          return (vars, vararg)++block :: Parser (Block SourcePos)+block = do+  pos <- getPosition+  stats <- many stat+  ret <- optionMaybe retstat+  return $ Block pos stats ret++retstat :: Parser [Exp SourcePos]+retstat = do+  tok LTokReturn+  exps <- exp `sepBy` tok LTokComma+  optional (tok LTokSemic)+  return exps++tableField :: Parser (TableField SourcePos)+tableField = choice [ expField, try namedField, field ]+  where expField :: Parser (TableField SourcePos)+        expField = do+            pos <- getPosition+            e1 <- brackets exp+            tok LTokAssign+            e2 <- exp+            return $ ExpField pos e1 e2++        namedField :: Parser (TableField SourcePos)+        namedField = do+            pos <- getPosition+            name' <- name+            tok LTokAssign+            val <- exp+            return $ NamedField pos name' val++        field :: Parser (TableField SourcePos)+        field = Field <$> getPosition <*> exp++table :: Parser (Table SourcePos)+table = do+    pos <- getPosition+    between (tok LTokLBrace)+            (tok LTokRBrace)+            (do fields <- tableField `sepEndBy` fieldSep+                return $ Table pos fields)+  where fieldSep = tok LTokComma <|> tok LTokSemic++-----------------------------------------------------------------------+---- Expressions++nilExp, boolExp, numberExp, stringExp, varargExp, fundefExp,+  prefixexpExp, tableconstExp, exp, exp' :: Parser (Exp SourcePos)++nilExp = (Nil <$> getPosition) <* tok LTokNil++boolExp = do+    pos <- getPosition+    tOrF <- tok LTokTrue <|> tok LTokFalse+    return $ Bool pos (tOrF == LTokTrue)++numberExp = Number <$> getPosition <*> number++stringExp = String <$> getPosition <*> stringlit++varargExp = (Vararg <$> getPosition) <* tok LTokEllipsis++fundefExp = do+  pos <- getPosition+  tok LTokFunction+  body <- funBody+  return $ EFunDef pos (FunDef (ann body) body)++prefixexpExp = PrefixExp <$> getPosition <*> liftM sexpToPexp suffixedExp++tableconstExp = TableConst <$> getPosition <*> table++binary :: Monad m => LToken -> (SourcePos -> a -> a -> a) -> Assoc -> Operator [LTok] u m a+binary op fun = Infix (do pos <- getPosition; tok op; return $ fun pos)++prefix :: Monad m => LToken -> (SourcePos -> a -> a) -> Operator [LTok] u m a+prefix op fun = Prefix (do pos <- getPosition; tok op; return $ fun pos)++opTable :: Monad m => SourcePos -> [[Operator [LTok] u m (Exp SourcePos)]]+opTable pos = [ [ binary LTokExp       (Binop pos . Exp)    AssocRight ]+              , [ prefix LTokNot       (Unop pos . Not)+                , prefix LTokSh        (Unop pos . Len)+                , prefix LTokMinus     (Unop pos . Neg)+                ]+              , [ binary LTokStar      (Binop pos . Mul)    AssocLeft+                , binary LTokSlash     (Binop pos . Div)    AssocLeft+                , binary LTokPercent   (Binop pos . Mod)    AssocLeft+                ]+              , [ binary LTokPlus      (Binop pos . Add)    AssocLeft+                , binary LTokMinus     (Binop pos . Sub)    AssocLeft+                ]+              , [ binary LTokDDot      (Binop pos . Concat) AssocRight ]+              , [ binary LTokGT        (Binop pos . GT)     AssocLeft+                , binary LTokLT        (Binop pos . LT)     AssocLeft+                , binary LTokGEq       (Binop pos . GTE)    AssocLeft+                , binary LTokLEq       (Binop pos . LTE)    AssocLeft+                , binary LTokNotequal  (Binop pos . NEQ)    AssocLeft+                , binary LTokEqual     (Binop pos . EQ)     AssocLeft+                ]+              , [ binary LTokAnd       (Binop pos . And)    AssocLeft ]+              , [ binary LTokOr        (Binop pos . Or)     AssocLeft ]+              ]+opExp :: SourcePos -> Parser (Exp SourcePos)+opExp pos = buildExpressionParser (opTable pos) exp' <?> "opExp"++exp' = choice [ nilExp, boolExp, numberExp, stringExp, varargExp,+                fundefExp, prefixexpExp, tableconstExp ]++-- | Expression parser.+exp = choice [ opExp =<< getPosition, nilExp, boolExp, numberExp, stringExp, varargExp,+               fundefExp, prefixexpExp, tableconstExp ]++-----------------------------------------------------------------------+---- Statements++emptyStat, assignStat, funCallStat, labelStat, breakStat, gotoStat,+    doStat, whileStat, repeatStat, ifStat, forRangeStat, forInStat,+    funAssignStat, localFunAssignStat, localAssignStat, stat :: Parser (Stat SourcePos)++emptyStat = (EmptyStat <$> getPosition) <* tok LTokSemic++assignStat = do+  pos <- getPosition+  vars <- var `sepBy` tok LTokComma+  tok LTokAssign+  exps <- exp `sepBy` tok LTokComma+  return $ Assign pos vars exps++funCallStat = FunCall <$> getPosition <*> funCall++labelStat = Label <$> getPosition <*> label+  where label = between (tok LTokDColon) (tok LTokDColon) name++breakStat = (Break <$> getPosition) <* tok LTokBreak++gotoStat = Goto <$> getPosition <*> (tok LTokGoto >> name)++doStat = Do <$> getPosition <*> between (tok LTokDo) (tok LTokEnd) block++whileStat = do+  pos <- getPosition+  between (tok LTokWhile)+          (tok LTokEnd)+          (do cond <- exp+              tok LTokDo+              body <- block+              return $ While pos cond body)++repeatStat = do+  pos <- getPosition+  tok LTokRepeat+  body <- block+  tok LTokUntil+  cond <- exp+  return $ Repeat pos body cond++ifStat = do+    pos <- getPosition+    between (tok LTokIf)+            (tok LTokEnd)+            (do f <- ifPart+                conds <- many elseifPart+                l <- optionMaybe elsePart+                return $ If pos (f:conds) l)++  where ifPart :: Parser (Exp SourcePos, Block SourcePos)+        ifPart = cond++        elseifPart :: Parser (Exp SourcePos, Block SourcePos)+        elseifPart = tok LTokElseIf >> cond++        cond :: Parser (Exp SourcePos, Block SourcePos)+        cond = do+            cond <- exp+            tok LTokThen+            body <- block+            return (cond, body)++        elsePart :: Parser (Block SourcePos)+        elsePart = tok LTokElse >> block++forRangeStat = do+  pos <- getPosition+  between (tok LTokFor)+          (tok LTokEnd)+          (do name' <- name+              tok LTokAssign+              start <- exp+              tok LTokComma+              end <- exp+              range <- optionMaybe $ tok LTokComma >> exp+              tok LTokDo+              body <- block+              return $ ForRange pos name' start end range body)++forInStat = do+  pos <- getPosition+  between (tok LTokFor)+          (tok LTokEnd)+          (do names <- name `sepBy` tok LTokComma+              tok LTokIn+              exps <- exp `sepBy` tok LTokComma+              tok LTokDo+              body <- block+              return $ ForIn pos names exps body)++funAssignStat = do+    pos <- getPosition+    tok LTokFunction+    name' <- funName+    body <- funBody+    return $ FunAssign pos name' body+  where funName :: Parser (FunName SourcePos)+        funName = FunName <$> getPosition+                          <*> name+                          <*> many (tok LTokDot >> name)+                          <*> optionMaybe (tok LTokColon >> name)++localFunAssignStat = do+  pos <- getPosition+  tok LTokLocal+  tok LTokFunction+  name' <- name+  body <- funBody+  return $ LocalFunAssign pos name' body++localAssignStat = do+  pos <- getPosition+  tok LTokLocal+  names <- name `sepBy` tok LTokComma+  rest <- optionMaybe $ tok LTokAssign >> exp `sepBy` tok LTokComma+  return $ LocalAssign pos names rest++-- | Statement parser.+stat =+  choice [ emptyStat+         , try assignStat+         , try funCallStat+         , labelStat+         , breakStat+         , gotoStat+         , doStat+         , whileStat+         , repeatStat+         , ifStat+         , try forRangeStat+         , forInStat+         , funAssignStat+         , try localFunAssignStat+         , localAssignStat+         ]++-- | Lua file parser.+chunk :: Parser (Block SourcePos)+chunk = block <* tok LTokEof
+ src/Language/Lua/Annotated/Simplify.hs view
@@ -0,0 +1,103 @@+-- | Remove annotations.+module Language.Lua.Annotated.Simplify where++import qualified Language.Lua.Annotated.Syntax as A+import Language.Lua.Syntax++import Prelude hiding (LT, EQ, GT)++sName :: A.Name a -> Name+sName (A.Name _ s) = s++sStat :: A.Stat a -> Stat+sStat (A.Assign _ vs es) = Assign (map sVar vs) (map sExp es)+sStat (A.FunCall _ fc) = FunCall (sFunCall fc)+sStat (A.Label _ n) = Label (sName n)+sStat (A.Break _) = Break+sStat (A.Goto _ n) = Goto (sName n)+sStat (A.Do _ b) = Do (sBlock b)+sStat (A.While _ e b) = While (sExp e) (sBlock b)+sStat (A.Repeat _ b e) = Repeat (sBlock b) (sExp e)+sStat (A.If _ conds else_) = If (map sCond conds) (fmap sBlock else_)+  where sCond (e, b) = (sExp e, sBlock b)+sStat (A.ForRange _ n e1 e2 oe3 b) =+    ForRange (sName n) (sExp e1) (sExp e2) (fmap sExp oe3) (sBlock b)+sStat (A.ForIn _ ns es b) = ForIn (map sName ns) (map sExp es) (sBlock b)+sStat (A.FunAssign _ fn fb) = FunAssign (sFunName fn) (sFunBody fb)+sStat (A.LocalFunAssign _ n fb) = LocalFunAssign (sName n) (sFunBody fb)+sStat (A.LocalAssign _ ns es) = LocalAssign (map sName ns) (fmap (map sExp) es)+sStat (A.EmptyStat _) = EmptyStat++sExp :: A.Exp a -> Exp+sExp (A.Nil _) = Nil+sExp (A.Bool _ b) = Bool b+sExp (A.Number _ n) = Number n+sExp (A.String _ s) = String s+sExp (A.Vararg _) = Vararg+sExp (A.EFunDef _ fd) = EFunDef (sFunDef fd)+sExp (A.PrefixExp _ pe) = PrefixExp (sPrefixExp pe)+sExp (A.TableConst _ t) = TableConst (sTable t)+sExp (A.Binop _ bop e1 e2) = Binop (sBinop bop) (sExp e1) (sExp e2)+sExp (A.Unop _ uop e) = Unop (sUnop uop) (sExp e)++sBlock :: A.Block a -> Block+sBlock (A.Block _ ss oes) = Block (map sStat ss) (fmap (map sExp) oes)++sVar :: A.Var a -> Var+sVar (A.VarName _ n) = VarName (sName n)+sVar (A.Select _ pe e) = Select (sPrefixExp pe) (sExp e)+sVar (A.SelectName _ pe n) = SelectName (sPrefixExp pe) (sName n)++sFunCall :: A.FunCall a -> FunCall+sFunCall (A.NormalFunCall _ pe a) = NormalFunCall (sPrefixExp pe) (sFunArg a)+sFunCall (A.MethodCall _ pe n a) = MethodCall (sPrefixExp pe) (sName n) (sFunArg a)++sFunName :: A.FunName a -> FunName+sFunName (A.FunName _ n ns on) = FunName (sName n) (map sName ns) (fmap sName on)++sFunBody :: A.FunBody a -> FunBody+sFunBody (A.FunBody _ ns vararg b) =+    FunBody (map sName ns) (maybe False (const True) vararg) (sBlock b)++sFunDef :: A.FunDef a -> FunDef+sFunDef (A.FunDef _ fb) = FunDef (sFunBody fb)++sPrefixExp :: A.PrefixExp a -> PrefixExp+sPrefixExp (A.PEVar _ v) = PEVar (sVar v)+sPrefixExp (A.PEFunCall _ fc) = PEFunCall (sFunCall fc)+sPrefixExp (A.Paren _ e) = Paren (sExp e)++sTable :: A.Table a -> Table+sTable (A.Table _ fs) = Table (map sTableField fs)++sBinop :: A.Binop a -> Binop+sBinop A.Add{} = Add+sBinop A.Sub{} = Sub+sBinop A.Mul{} = Mul+sBinop A.Div{} = Div+sBinop A.Exp{} = Exp+sBinop A.Mod{} = Mod+sBinop A.Concat{} = Concat+sBinop A.LT{} = LT+sBinop A.LTE{} = LTE+sBinop A.GT{} = GT+sBinop A.GTE{} = GTE+sBinop A.EQ{} = EQ+sBinop A.NEQ{} = NEQ+sBinop A.And{} = And+sBinop A.Or{} = Or++sUnop :: A.Unop a -> Unop+sUnop A.Neg{} = Neg+sUnop A.Not{} = Not+sUnop A.Len{} = Len++sFunArg :: A.FunArg a -> FunArg+sFunArg (A.Args _ es) = Args (map sExp es)+sFunArg (A.TableArg _ t) = TableArg (sTable t)+sFunArg (A.StringArg _ s) = StringArg s++sTableField :: A.TableField a -> TableField+sTableField (A.ExpField _ e1 e2) = ExpField (sExp e1) (sExp e2)+sTableField (A.NamedField _ n e) = NamedField (sName n) (sExp e)+sTableField (A.Field _ e) = Field (sExp e)
+ src/Language/Lua/Annotated/Syntax.hs view
@@ -0,0 +1,262 @@+{-# LANGUAGE DeriveFunctor #-}++-- | Lua 5.2 syntax tree, as specified in <http://www.lua.org/manual/5.2/manual.html#9>.+-- Annotation implementation is inspired by haskell-src-exts.+module Language.Lua.Annotated.Syntax where++import Prelude hiding (LT, EQ, GT)++data Name a = Name a String deriving (Show, Eq, Functor)++data Stat a+    = Assign a [Var a] [Exp a] -- ^var1, var2 .. = exp1, exp2 ..+    | FunCall a (FunCall a) -- ^function call+    | Label a (Name a) -- ^label for goto+    | Break a -- ^break+    | Goto a (Name a) -- ^goto label+    | Do a (Block a) -- ^do .. end+    | While a (Exp a) (Block a) -- ^while .. do .. end+    | Repeat a (Block a) (Exp a) -- ^repeat .. until ..+    | If a [(Exp a, Block a)] (Maybe (Block a)) -- ^if .. then .. [elseif ..] [else ..] end+    | ForRange a (Name a) (Exp a) (Exp a) (Maybe (Exp a)) (Block a) -- ^for x=start, end [, step] do .. end+    | ForIn a [Name a] [Exp a] (Block a) -- ^for x in .. do .. end+    | FunAssign a (FunName a) (FunBody a) -- ^function \<var\> (..) .. end+    | LocalFunAssign a (Name a) (FunBody a) -- ^local function \<var\> (..) .. end+    | LocalAssign a [Name a] (Maybe [Exp a]) -- ^local var1, var2 .. = exp1, exp2 ..+    | EmptyStat a -- ^/;/+    deriving (Show, Eq, Functor)++data Exp a+    = Nil a+    | Bool a Bool+    | Number a String+    | String a String+    | Vararg a -- ^/.../+    | EFunDef a (FunDef a) -- ^/function (..) .. end/+    | PrefixExp a (PrefixExp a)+    | TableConst a (Table a) -- ^table constructor+    | Binop a (Binop a) (Exp a) (Exp a) -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/+    | Unop a (Unop a) (Exp a) -- ^unary operators, /- not #/+    deriving (Show, Eq, Functor)++data Var a+    = VarName a (Name a) -- ^variable+    | Select a (PrefixExp a) (Exp a) -- ^/table[exp]/+    | SelectName a (PrefixExp a) (Name a) -- ^/table.variable/+    deriving (Show, Eq, Functor)++data Binop a = Add a | Sub a | Mul a | Div a | Exp a | Mod a | Concat a+    | LT a | LTE a | GT a | GTE a | EQ a | NEQ a | And a | Or a+    deriving (Show, Eq, Functor)++data Unop a = Neg a | Not a | Len a+    deriving (Show, Eq, Functor)++data PrefixExp a+    = PEVar a (Var a)+    | PEFunCall a (FunCall a)+    | Paren a (Exp a)+    deriving (Show, Eq, Functor)++data Table a = Table a [TableField a] -- ^list of table fields+    deriving (Show, Eq, Functor)++data TableField a+    = ExpField a (Exp a) (Exp a) -- ^/[exp] = exp/+    | NamedField a (Name a) (Exp a) -- ^/name = exp/+    | Field a (Exp a)+    deriving (Show, Eq, Functor)++-- | A block is list of statements with optional return statement.+data Block a = Block a [Stat a] (Maybe [Exp a])+    deriving (Show, Eq, Functor)++data FunName a = FunName a (Name a) [Name a] (Maybe (Name a))+    deriving (Show, Eq, Functor)++data FunDef a = FunDef a (FunBody a)+    deriving (Show, Eq, Functor)++data FunBody a = FunBody a [Name a] (Maybe a) (Block a) -- ^(args, vararg, block)+    deriving (Show, Eq, Functor)++data FunCall a+    = NormalFunCall a (PrefixExp a) (FunArg a) -- ^/prefixexp ( funarg )/+    | MethodCall a (PrefixExp a) (Name a) (FunArg a) -- ^/prefixexp : name ( funarg )/+    deriving (Show, Eq, Functor)++data FunArg a+    = Args a [Exp a] -- ^list of args+    | TableArg a (Table a) -- ^table constructor+    | StringArg a String -- ^string+    deriving (Show, Eq, Functor)+++class Functor ast => Annotated ast where+    -- | Retrieve the annotation of an AST node.+    ann :: ast l -> l+    -- | Change the annotation of an AST node. Note that only the annotation of+    --   the node itself is affected, and not the annotations of any child nodes.+    --   if all nodes in the AST tree are to be affected, use 'fmap'.+    amap :: (l -> l) -> ast l -> ast l++instance Annotated Stat where+    ann (Assign a _ _) = a+    ann (FunCall a _) = a+    ann (Label a _) = a+    ann (Break a) = a+    ann (Goto a _) = a+    ann (Do a _) = a+    ann (While a _ _) = a+    ann (Repeat a _ _) = a+    ann (If a _ _) = a+    ann (ForRange a _ _ _ _ _) = a+    ann (ForIn a _ _ _) = a+    ann (FunAssign a _ _) = a+    ann (LocalFunAssign a _ _) = a+    ann (LocalAssign a _ _) = a+    ann (EmptyStat a) = a++    amap f (Assign a x1 x2) = Assign (f a) x1 x2+    amap f (FunCall a x1) = FunCall (f a) x1+    amap f (Label a x1) = Label (f a) x1+    amap f (Break a) = Break (f a)+    amap f (Goto a x1) = Goto (f a) x1+    amap f (Do a x1) = Do (f a) x1+    amap f (While a x1 x2) = While (f a) x1 x2+    amap f (Repeat a x1 x2) = Repeat (f a) x1 x2+    amap f (If a x1 x2) = If (f a) x1 x2+    amap f (ForRange a x1 x2 x3 x4 x5) = ForRange (f a) x1 x2 x3 x4 x5+    amap f (ForIn a x1 x2 x3) = ForIn (f a) x1 x2 x3+    amap f (FunAssign a x1 x2) = FunAssign (f a) x1 x2+    amap f (LocalFunAssign a x1 x2) = LocalFunAssign (f a) x1 x2+    amap f (LocalAssign a x1 x2) = LocalAssign (f a) x1 x2+    amap f (EmptyStat a) = EmptyStat (f a)++instance Annotated Exp where+    ann (Nil a) = a+    ann (Bool a _) = a+    ann (Number a _) = a+    ann (String a _) = a+    ann (Vararg a) = a+    ann (EFunDef a _) = a+    ann (PrefixExp a _) = a+    ann (TableConst a _) = a+    ann (Binop a _ _ _) = a+    ann (Unop a _ _) = a++    amap f (Nil a) = Nil (f a)+    amap f (Bool a x1) = Bool (f a) x1+    amap f (Number a x1) = Number (f a) x1+    amap f (String a x1) = String (f a) x1+    amap f (Vararg a) = Vararg (f a)+    amap f (EFunDef a x1) = EFunDef (f a) x1+    amap f (PrefixExp a x1) = PrefixExp (f a) x1+    amap f (TableConst a x1) = TableConst (f a) x1+    amap f (Binop a x1 x2 x3) = Binop (f a) x1 x2 x3+    amap f (Unop a x1 x2) = Unop (f a) x1 x2++instance Annotated Var where+    ann (VarName a _) = a+    ann (Select a _ _) = a+    ann (SelectName a _ _) = a++    amap f (VarName a x1) = VarName (f a) x1+    amap f (Select a x1 x2) = Select (f a) x1 x2+    amap f (SelectName a x1 x2) = SelectName (f a) x1 x2++instance Annotated Binop where+    ann (Add a) = a+    ann (Sub a) = a+    ann (Mul a) = a+    ann (Div a) = a+    ann (Exp a) = a+    ann (Mod a) = a+    ann (Concat a) = a+    ann (LT a) = a+    ann (LTE a) = a+    ann (GT a) = a+    ann (GTE a) = a+    ann (EQ a) = a+    ann (NEQ a) = a+    ann (And a) = a+    ann (Or a) = a++    amap f (Add a) = Add (f a)+    amap f (Sub a) = Sub (f a)+    amap f (Mul a) = Mul (f a)+    amap f (Div a) = Div (f a)+    amap f (Exp a) = Exp (f a)+    amap f (Mod a) = Mod (f a)+    amap f (Concat a) = Concat (f a)+    amap f (LT a) = LT (f a)+    amap f (LTE a) = LTE (f a)+    amap f (GT a) = GT (f a)+    amap f (GTE a) = GTE (f a)+    amap f (EQ a) = EQ (f a)+    amap f (NEQ a) = NEQ (f a)+    amap f (And a) = And (f a)+    amap f (Or a) = Or (f a)++instance Annotated Unop where+    ann (Neg a) = a+    ann (Not a) = a+    ann (Len a) = a++    amap f (Neg a) = Neg (f a)+    amap f (Not a) = Not (f a)+    amap f (Len a) = Len (f a)++instance Annotated PrefixExp where+    ann (PEVar a _) = a+    ann (PEFunCall a _) = a+    ann (Paren a _) = a++    amap f (PEVar a x1) = PEVar (f a) x1+    amap f (PEFunCall a x1) = PEFunCall (f a) x1+    amap f (Paren a x1) = Paren (f a) x1++instance Annotated Table where+    ann (Table a _) = a+    amap f (Table a x1) = Table (f a) x1++instance Annotated TableField where+    ann (ExpField a _ _) = a+    ann (NamedField a _ _) = a+    ann (Field a _) = a++    amap f (ExpField a x1 x2) = ExpField (f a) x1 x2+    amap f (NamedField a x1 x2) = NamedField (f a) x1 x2+    amap f (Field a x1) = Field (f a) x1++instance Annotated Block where+    ann (Block a _ _) = a+    amap f (Block a x1 x2) = Block (f a) x1 x2++instance Annotated FunName where+    ann (FunName a _ _ _) = a+    amap f (FunName a x1 x2 x3) = FunName (f a) x1 x2 x3++instance Annotated FunDef where+    ann (FunDef a _) = a+    amap f (FunDef a x1) = FunDef (f a) x1++instance Annotated FunBody where+    ann (FunBody a _ _ _) = a+    amap f (FunBody a x1 x2 x3) = FunBody (f a) x1 x2 x3++instance Annotated FunCall where+    ann (NormalFunCall a _ _) = a+    ann (MethodCall a _ _ _) = a++    amap f (NormalFunCall a x1 x2) = NormalFunCall (f a) x1 x2+    amap f (MethodCall a x1 x2 x3) = MethodCall (f a) x1 x2 x3++instance Annotated FunArg where+    ann (Args a _) = a+    ann (TableArg a _) = a+    ann (StringArg a _) = a++    amap f (Args a x1) = Args (f a) x1+    amap f (TableArg a x1) = TableArg (f a) x1+    amap f (StringArg a x1) = StringArg (f a) x1
− src/Language/Lua/Lexer.x
@@ -1,282 +0,0 @@-{-module Language.Lua.Lexer-  ( llex-  , llexFile-  , LTok-  , AlexPosn(..)-  ) where--import Language.Lua.Token-import Control.Applicative ((<$>))-import Control.Monad (forM_, unless, when)-}--%wrapper "monadUserState"--$space = [ \ \t ]                        -- horizontal white space--$letter      = [a-zA-Z_]                 -- first letter of variables-$identletter = [a-zA-Z_0-9]              -- letters for rest of variables--$digit    = 0-9                          -- decimal digits-$octdigit = 0-7                          -- octal digits-$hexdigit = [0-9a-fA-F]                  -- hexadecimal digits--$dqstr    = \0-\255 # [ \" \n ]          -- valid character in a string literal with dquotes-$sqstr    = \0-\255 # [ \' \n ]          -- valid character in a string literal with quotes-$longstr  = \0-\255                      -- valid character in a long string---- escape characters-@charescd  = \\ ([ntvbrfaeE\\\?\"] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)-@charescs  = \\ ([ntvbrfaeE\\\?\'] | $octdigit{1,3} | x$hexdigit+ | X$hexdigit+)--@digits    = $digit+-@hexdigits = $hexdigit+--@mantpart = (@digits \. @digits) | @digits \. | \. @digits-@exppart  = [eE][\+\-]? @digits--@hexprefix = 0x | 0X-@mantparthex = (@hexdigits \. @hexdigits) | @hexdigits \. | \. @hexdigits-@expparthex  = [pP][\+\-]? @hexdigits--tokens :---    <0> $white+  ;--    <0> $letter $identletter* { ident }--    <0> @digits                              { tokWValue LTokNum }-    <0> @digits @exppart                     { tokWValue LTokNum }-    <0> @mantpart @exppart?                  { tokWValue LTokNum }-    <0> @hexprefix @hexdigits                { tokWValue LTokNum }-    <0> @hexprefix @hexdigits @expparthex    { tokWValue LTokNum }-    <0> @hexprefix @mantparthex @expparthex? { tokWValue LTokNum }--    <0> \"($dqstr|@charescd)*\" { \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) }-    <0> \'($sqstr|@charescs)*\' { \(posn,_,_,s) l -> return (LTokSLit (tail . init $ take l s), posn) }--    -- long strings-    <0> \[ \=* \[ \n?        { enterString `andBegin` state_string }-    <state_string> \] \=* \] { testAndEndString }-    <state_string> $longstr  { addCharToString }--    <0> "--"                      { enterComment `andBegin` state_comment }-    <state_comment> . # \n        ;-    <state_comment> \n            { testAndEndComment }-    <state_comment> \[ \=* \[ \n? { enterString `andBegin` state_string }--    <0> "+"   { tok LTokPlus }-    <0> "-"   { tok LTokMinus }-    <0> "*"   { tok LTokStar }-    <0> "/"   { tok LTokSlash }-    <0> "%"   { tok LTokPercent }-    <0> "^"   { tok LTokExp }-    <0> "#"   { tok LTokSh }-    <0> "=="  { tok LTokEqual }-    <0> "~="  { tok LTokNotequal }-    <0> "<="  { tok LTokLEq }-    <0> ">="  { tok LTokGEq }-    <0> "<"   { tok LTokLT }-    <0> ">"   { tok LTokGT }-    <0> "="   { tok LTokAssign }-    <0> "("   { tok LTokLParen }-    <0> ")"   { tok LTokRParen }-    <0> "{"   { tok LTokLBrace }-    <0> "}"   { tok LTokRBrace }-    <0> "["   { tok LTokLBracket }-    <0> "]"   { tok LTokRBracket }-    <0> "::"  { tok LTokDColon }-    <0> ";"   { tok LTokSemic }-    <0> ":"   { tok LTokColon }-    <0> ","   { tok LTokComma }-    <0> "."   { tok LTokDot }-    <0> ".."  { tok LTokDDot }-    <0> "..." { tok LTokEllipsis }--    \EOF  { tok LTokEof }--{--data AlexUserState = AlexUserState { stringState     :: !Bool-                                   , stringDelimLen  :: !Int-                                   , stringPosn      :: !AlexPosn-                                   , stringValue     :: !String-                                   -- comments-                                   , commentState    :: !Bool-                                   }--alexInitUserState :: AlexUserState-alexInitUserState = AlexUserState { stringState     = False-                                  , stringDelimLen  = 0-                                  , stringPosn      = AlexPn 0 0 0-                                  , stringValue     = ""-                                  , commentState    = False-                                  }--initString :: Int -> AlexPosn -> Alex ()-initString i posn = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=True,stringValue="",stringDelimLen=i,stringPosn=posn}}, ())--initComment :: Alex ()-initComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=True}}, ())--getStringDelimLen :: Alex Int-getStringDelimLen = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringDelimLen ust)--getStringPosn :: Alex AlexPosn-getStringPosn = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringPosn ust)--getStringValue :: Alex String-getStringValue = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringValue ust)--getStringState :: Alex Bool-getStringState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, stringState ust)--getCommentState :: Alex Bool-getCommentState = Alex $ \s@AlexState{alex_ust=ust} -> Right (s, commentState ust)--addCharToStringValue :: Char -> Alex ()-addCharToStringValue c = Alex $ \s -> Right (s{alex_ust=(alex_ust s){stringValue=c:stringValue (alex_ust s)}}, ())--enterString :: AlexAction LTok-enterString (posn,_,_,s) len = do-  initString (if (s !! (len-1) == '\n') then len-1 else len) posn-  alexMonadScan'--enterComment :: AlexAction LTok-enterComment _ _ = do-  initComment-  alexMonadScan'--addString :: AlexAction LTok-addString (_,_,_,s) len = do-  forM_ (take len s) addCharToStringValue-  alexMonadScan'--addCharToString :: AlexAction LTok-addCharToString (_,_,_,s) len = do-  addCharToStringValue (head s)-  alexMonadScan'--endString :: Alex ()-endString = Alex $ \s -> Right(s{alex_ust=(alex_ust s){stringState=False}}, ())--endComment :: Alex ()-endComment = Alex $ \s -> Right(s{alex_ust=(alex_ust s){commentState=False}}, ())--testAndEndComment :: AlexAction LTok-testAndEndComment _ _ = do-  ss <- getStringState-  if ss then alexMonadScan' else endComment >> alexSetStartCode 0 >> alexMonadScan'--testAndEndString :: AlexAction LTok-testAndEndString (_,_,_,s) len = do-  startlen <- getStringDelimLen-  if startlen /= len-    then do forM_ (take len s) addCharToStringValue-            alexMonadScan'-    else do endString-            alexSetStartCode 0-            cs <- getCommentState-            if cs-              then do-                endComment-                alexMonadScan'-              else do-                val  <- getStringValue-                posn <- getStringPosn-                return (LTokSLit (reverse val), posn)--data EOF = EOF deriving Show---- | Lua token with position information.-type LTok = (LToken, AlexPosn)---- type AlexAction result = AlexInput -> Int -> Alex result---- Helper to make LTokens with string value (like LTokNum, LTokSLit etc.)-tokWValue :: (String -> LToken) -> AlexInput -> Int -> Alex LTok-tokWValue tok (posn,_,_,s) len = return (tok (take len s), posn)--tok :: LToken -> AlexInput -> Int -> Alex LTok-tok t (posn,_,_,_) _ = return (t, posn)--{-# INLINE ident #-}-ident :: AlexAction LTok-ident (posn,_,_,s) len = return (tok, posn)-  where tok = case (take len s) of-          "and"      -> LTokAnd-          "break"    -> LTokBreak-          "do"       -> LTokDo-          "else"     -> LTokElse-          "elseif"   -> LTokElseIf-          "end"      -> LTokEnd-          "false"    -> LTokFalse-          "for"      -> LTokFor-          "function" -> LTokFunction-          "goto"     -> LTokGoto-          "if"       -> LTokIf-          "in"       -> LTokIn-          "local"    -> LTokLocal-          "nil"      -> LTokNil-          "not"      -> LTokNot-          "or"       -> LTokOr-          "repeat"   -> LTokRepeat-          "return"   -> LTokReturn-          "then"     -> LTokThen-          "true"     -> LTokTrue-          "until"    -> LTokUntil-          "while"    -> LTokWhile-          ident'     -> LTokIdent ident'----data AlexPosn = AlexPn !Int  -- absolute character offset---                       !Int  -- line number---                       !Int  -- column number------type AlexInput = (AlexPosn,     -- current position,---                  Char,         -- previous char---                  [Byte],       -- rest of the bytes for the current char---                  String)       -- current input string--alexEOF :: Alex LTok-alexEOF = return (LTokEof, AlexPn (-1) (-1) (-1))--alexMonadScan' :: Alex LTok-alexMonadScan' = do-  inp <- alexGetInput-  sc <- alexGetStartCode-  case alexScan inp sc of-    AlexEOF -> do cs <- getCommentState-                  when cs endString-                  alexEOF-    AlexError ((AlexPn _ line col),ch,_,_) -> alexError $ concat-        [ "lexical error near line: " , show line , " col: " , show col , " at char " , [ch] ]-    AlexSkip  inp' len -> do-        alexSetInput inp'-        alexMonadScan'-    AlexToken inp' len action -> do-        alexSetInput inp'-        action (ignorePendingBytes inp) len--scanner :: String -> Either String [LTok]-scanner str = runAlex str loop-  where loop = do-          t@(tok, _) <- alexMonadScan'-          if tok == LTokEof-            then do stringState <- getStringState-                    if stringState-                      then alexError "String not closed at end of file"-                      else return [t]-            else do toks <- loop-                    return (t:toks)---- | Lua lexer.-llex :: String -> [LTok]-llex s = case scanner s of-           Left err -> error err-           Right r  -> r---- | Run Lua lexer on a file.-llexFile :: FilePath -> IO [LTok]-llexFile p = llex <$> readFile p-}
src/Language/Lua/Parser.hs view
@@ -1,7 +1,3 @@-{-# OPTIONS_GHC -Wall-                -fno-warn-hi-shadowing-                -fno-warn-name-shadowing-                -fno-warn-unused-do-bind #-} module Language.Lua.Parser   ( parseText   , parseFile@@ -10,402 +6,22 @@   , chunk   ) where -import Prelude hiding (exp, LT, GT, EQ, repeat)--import Language.Lua.Lexer-import Language.Lua.Token-import Language.Lua.Types+import qualified Language.Lua.Annotated.Parser as A+import Language.Lua.Annotated.Simplify+import Language.Lua.Syntax -import Text.Parsec hiding (string)+import Text.Parsec import Text.Parsec.LTok-import Text.Parsec.Expr-import Control.Applicative ((<*), (<$>), (<*>)) import Control.Monad (liftM) --- | Runs Lua lexer before parsing. Use @parseText stat@ to parse--- statements, and @parseText exp@ to parse expressions.-parseText :: Parsec [LTok] () a -> String -> Either ParseError a-parseText p s = parse p "<string>" (llex s)---- | Parse a Lua file. You can use @parseText chunk@ to parse a file from a string.-parseFile :: FilePath -> IO (Either ParseError (Block SourcePos))-parseFile path = parse chunk path . llex <$> readFile path--parens :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a-parens = between (tok LTokLParen) (tok LTokRParen)--brackets :: Monad m => ParsecT [LTok] u m a -> ParsecT [LTok] u m a-brackets = between (tok LTokLBracket) (tok LTokRBracket)--name :: Parser (Name SourcePos)-name = do-    pos <- getPosition-    str <- tokenValue <$> anyIdent-    return $ Name pos str--number :: Parser String-number = tokenValue <$> anyNum---data PrimaryExp a-    = PName a (Name a)-    | PParen a (Exp a)-    deriving (Show, Eq)--data SuffixedExp a-    = SuffixedExp a (PrimaryExp a) [SuffixExp a]-    deriving (Show, Eq)--data SuffixExp a-    = SSelect a (Name a)-    | SSelectExp a (Exp a)-    | SSelectMethod a (Name a) (FunArg a)-    | SFunCall a (FunArg a)-    deriving (Show, Eq)--primaryExp :: Parser (PrimaryExp SourcePos)-primaryExp = do-    pos <- getPosition-    PName pos <$> name <|> PParen pos <$> parens exp--suffixedExp :: Parser (SuffixedExp SourcePos)-suffixedExp = SuffixedExp <$> getPosition <*> primaryExp <*> many suffixExp--suffixExp :: Parser (SuffixExp SourcePos)-suffixExp = selectName <|> selectExp <|> selectMethod <|> funarg-  where selectName   = SSelect <$> getPosition <*> (tok LTokDot >> name)-        selectExp    = SSelectExp <$> getPosition <*> brackets exp-        selectMethod = do-          pos <- getPosition-          tok LTokColon-          SSelectMethod pos <$> name <*> funArg-        funarg       = SFunCall <$> getPosition <*> funArg--sexpToPexp :: SuffixedExp SourcePos -> PrefixExp SourcePos-sexpToPexp (SuffixedExp _ t r) = case r of-    []                                -> t'-    (SSelect pos sname:xs)            -> iter xs (PEVar     pos (SelectName pos t' sname))-    (SSelectExp pos sexp:xs)          -> iter xs (PEVar     pos (Select pos t' sexp))-    (SSelectMethod pos mname args:xs) -> iter xs (PEFunCall pos (MethodCall pos t' mname args))-    (SFunCall pos args:xs)            -> iter xs (PEFunCall pos (NormalFunCall pos t' args))--  where t' :: PrefixExp SourcePos-        t' = case t of-               PName pos name -> PEVar pos (VarName pos name)-               PParen pos exp -> Paren pos exp--        iter :: [SuffixExp SourcePos] -> PrefixExp SourcePos -> PrefixExp SourcePos-        iter [] pe                                = pe-        iter (SSelect pos sname:xs) pe            = iter xs (PEVar pos (SelectName pos pe sname))-        iter (SSelectExp pos sexp:xs) pe          = iter xs (PEVar pos (Select pos pe sexp))-        iter (SSelectMethod pos mname args:xs) pe = iter xs (PEFunCall pos (MethodCall pos pe mname args))-        iter (SFunCall pos args:xs) pe            = iter xs (PEFunCall pos (NormalFunCall pos pe args))---- TODO: improve error messages.-sexpToVar :: SuffixedExp SourcePos -> Parser (Var SourcePos)-sexpToVar (SuffixedExp pos (PName _ name) []) = return (VarName pos name)-sexpToVar (SuffixedExp _ _ []) = fail "syntax error"-sexpToVar sexp = case sexpToPexp sexp of-                   PEVar _ var -> return var-                   _ -> fail "syntax error"--sexpToFunCall :: SuffixedExp SourcePos -> Parser (FunCall SourcePos)-sexpToFunCall (SuffixedExp _ _ []) = fail "syntax error"-sexpToFunCall sexp = case sexpToPexp sexp of-                       PEFunCall _ funcall -> return funcall-                       _ -> fail "syntax error"--var :: Parser (Var SourcePos)-var = suffixedExp >>= sexpToVar--funCall :: Parser (FunCall SourcePos)-funCall = suffixedExp >>= sexpToFunCall--stringlit :: Parser String-stringlit = tokenValue <$> string--funArg :: Parser (FunArg SourcePos)-funArg = tableArg <|> stringArg <|> arglist-  where tableArg  = TableArg <$> getPosition <*> table-        stringArg = StringArg <$> getPosition <*> stringlit-        arglist   = do-          pos <- getPosition-          parens (do exps <- exp `sepBy` tok LTokComma-                     return $ Args pos exps)--funBody :: Parser (FunBody SourcePos)-funBody = do-    pos <- getPosition-    (params, vararg) <- arglist-    body <- block-    tok LTokEnd-    return $ FunBody pos params vararg body--  where lastarg = do-          pos <- getPosition-          arg <- optionMaybe (tok LTokEllipsis <|> tok LTokComma)-          case arg of-            Just LTokEllipsis -> return (Just pos)-            _ -> return Nothing--        arglist = parens $ do-          vars <- name `sepEndBy` tok LTokComma-          vararg <- lastarg-          return (vars, vararg)--block :: Parser (Block SourcePos)-block = do-  pos <- getPosition-  stats <- many stat-  ret <- optionMaybe retstat-  return $ Block pos stats ret--retstat :: Parser [Exp SourcePos]-retstat = do-  tok LTokReturn-  exps <- exp `sepBy` tok LTokComma-  optional (tok LTokSemic)-  return exps--tableField :: Parser (TableField SourcePos)-tableField = choice [ expField, try namedField, field ]-  where expField :: Parser (TableField SourcePos)-        expField = do-            pos <- getPosition-            e1 <- brackets exp-            tok LTokAssign-            e2 <- exp-            return $ ExpField pos e1 e2--        namedField :: Parser (TableField SourcePos)-        namedField = do-            pos <- getPosition-            name' <- name-            tok LTokAssign-            val <- exp-            return $ NamedField pos name' val--        field :: Parser (TableField SourcePos)-        field = Field <$> getPosition <*> exp--table :: Parser (Table SourcePos)-table = do-    pos <- getPosition-    between (tok LTokLBrace)-            (tok LTokRBrace)-            (do fields <- tableField `sepEndBy` fieldSep-                return $ Table pos fields)-  where fieldSep = tok LTokComma <|> tok LTokSemic------------------------------------------------------------------------------ Expressions--nilExp, boolExp, numberExp, stringExp, varargExp, fundefExp,-  prefixexpExp, tableconstExp, exp, exp' :: Parser (Exp SourcePos)--nilExp = (Nil <$> getPosition) <* tok LTokNil--boolExp = do-    pos <- getPosition-    tOrF <- tok LTokTrue <|> tok LTokFalse-    return $ Bool pos (tOrF == LTokTrue)--numberExp = Number <$> getPosition <*> number--stringExp = String <$> getPosition <*> stringlit--varargExp = (Vararg <$> getPosition) <* tok LTokEllipsis--fundefExp = do-  pos <- getPosition-  tok LTokFunction-  body <- funBody-  return $ EFunDef pos (FunDef (ann body) body)--prefixexpExp = PrefixExp <$> getPosition <*> liftM sexpToPexp suffixedExp--tableconstExp = TableConst <$> getPosition <*> table--binary :: Monad m => LToken -> (SourcePos -> a -> a -> a) -> Assoc -> Operator [LTok] u m a-binary op fun = Infix (do pos <- getPosition; tok op; return $ fun pos)--prefix :: Monad m => LToken -> (SourcePos -> a -> a) -> Operator [LTok] u m a-prefix op fun = Prefix (do pos <- getPosition; tok op; return $ fun pos)--opTable :: Monad m => SourcePos -> [[Operator [LTok] u m (Exp SourcePos)]]-opTable pos = [ [ binary LTokExp       (Binop pos . Exp)    AssocRight ]-              , [ prefix LTokNot       (Unop pos . Not)-                , prefix LTokSh        (Unop pos . Len)-                , prefix LTokMinus     (Unop pos . Neg)-                ]-              , [ binary LTokStar      (Binop pos . Mul)    AssocLeft-                , binary LTokSlash     (Binop pos . Div)    AssocLeft-                , binary LTokPercent   (Binop pos . Mod)    AssocLeft-                ]-              , [ binary LTokPlus      (Binop pos . Add)    AssocLeft-                , binary LTokMinus     (Binop pos . Sub)    AssocLeft-                ]-              , [ binary LTokDDot      (Binop pos . Concat) AssocRight ]-              , [ binary LTokGT        (Binop pos . GT)     AssocLeft-                , binary LTokLT        (Binop pos . LT)     AssocLeft-                , binary LTokGEq       (Binop pos . GTE)    AssocLeft-                , binary LTokLEq       (Binop pos . LTE)    AssocLeft-                , binary LTokNotequal  (Binop pos . NEQ)    AssocLeft-                , binary LTokEqual     (Binop pos . EQ)     AssocLeft-                ]-              , [ binary LTokAnd       (Binop pos . And)    AssocLeft ]-              , [ binary LTokOr        (Binop pos . Or)     AssocLeft ]-              ]-opExp :: SourcePos -> Parser (Exp SourcePos)-opExp pos = buildExpressionParser (opTable pos) exp' <?> "opExp"--exp' = choice [ nilExp, boolExp, numberExp, stringExp, varargExp,-                fundefExp, prefixexpExp, tableconstExp ]---- | Expression parser.-exp = choice [ opExp =<< getPosition, nilExp, boolExp, numberExp, stringExp, varargExp,-               fundefExp, prefixexpExp, tableconstExp ]------------------------------------------------------------------------------ Statements--emptyStat, assignStat, funCallStat, labelStat, breakStat, gotoStat,-    doStat, whileStat, repeatStat, ifStat, forRangeStat, forInStat,-    funAssignStat, localFunAssignStat, localAssignStat, stat :: Parser (Stat SourcePos)--emptyStat = (EmptyStat <$> getPosition) <* tok LTokSemic--assignStat = do-  pos <- getPosition-  vars <- var `sepBy` tok LTokComma-  tok LTokAssign-  exps <- exp `sepBy` tok LTokComma-  return $ Assign pos vars exps--funCallStat = FunCall <$> getPosition <*> funCall--labelStat = Label <$> getPosition <*> label-  where label = between (tok LTokDColon) (tok LTokDColon) name--breakStat = (Break <$> getPosition) <* tok LTokBreak--gotoStat = Goto <$> getPosition <*> (tok LTokGoto >> name)--doStat = Do <$> getPosition <*> between (tok LTokDo) (tok LTokEnd) block--whileStat = do-  pos <- getPosition-  between (tok LTokWhile)-          (tok LTokEnd)-          (do cond <- exp-              tok LTokDo-              body <- block-              return $ While pos cond body)--repeatStat = do-  pos <- getPosition-  tok LTokRepeat-  body <- block-  tok LTokUntil-  cond <- exp-  return $ Repeat pos body cond--ifStat = do-    pos <- getPosition-    between (tok LTokIf)-            (tok LTokEnd)-            (do f <- ifPart-                conds <- many elseifPart-                l <- optionMaybe elsePart-                return $ If pos (f:conds) l)--  where ifPart :: Parser (Exp SourcePos, Block SourcePos)-        ifPart = cond--        elseifPart :: Parser (Exp SourcePos, Block SourcePos)-        elseifPart = tok LTokElseIf >> cond--        cond :: Parser (Exp SourcePos, Block SourcePos)-        cond = do-            cond <- exp-            tok LTokThen-            body <- block-            return (cond, body)--        elsePart :: Parser (Block SourcePos)-        elsePart = tok LTokElse >> block--forRangeStat = do-  pos <- getPosition-  between (tok LTokFor)-          (tok LTokEnd)-          (do name' <- name-              tok LTokAssign-              start <- exp-              tok LTokComma-              end <- exp-              range <- optionMaybe $ tok LTokComma >> exp-              tok LTokDo-              body <- block-              return $ ForRange pos name' start end range body)--forInStat = do-  pos <- getPosition-  between (tok LTokFor)-          (tok LTokEnd)-          (do names <- name `sepBy` tok LTokComma-              tok LTokIn-              exps <- exp `sepBy` tok LTokComma-              tok LTokDo-              body <- block-              return $ ForIn pos names exps body)--funAssignStat = do-    pos <- getPosition-    tok LTokFunction-    name' <- funName-    body <- funBody-    return $ FunAssign pos name' body-  where funName :: Parser (FunName SourcePos)-        funName = FunName <$> getPosition-                          <*> name-                          <*> many (tok LTokDot >> name)-                          <*> optionMaybe (tok LTokColon >> name)--localFunAssignStat = do-  pos <- getPosition-  tok LTokLocal-  tok LTokFunction-  name' <- name-  body <- funBody-  return $ LocalFunAssign pos name' body+parseText :: Parser a -> String -> Either ParseError a+parseText = A.parseText -localAssignStat = do-  pos <- getPosition-  tok LTokLocal-  names <- name `sepBy` tok LTokComma-  rest <- optionMaybe $ tok LTokAssign >> exp `sepBy` tok LTokComma-  return $ LocalAssign pos names rest+parseFile :: FilePath -> IO (Either ParseError Block)+parseFile = (liftM . liftM $ sBlock) . A.parseFile --- | Statement parser.-stat =-  choice [ emptyStat-         , try assignStat-         , try funCallStat-         , labelStat-         , breakStat-         , gotoStat-         , doStat-         , whileStat-         , repeatStat-         , ifStat-         , try forRangeStat-         , forInStat-         , funAssignStat-         , try localFunAssignStat-         , localAssignStat-         ]+stat :: Parser Stat+stat = fmap sStat A.stat --- | Lua file parser.-chunk :: Parser (Block SourcePos)-chunk = block <* tok LTokEof+chunk :: Parser Block+chunk = fmap sBlock A.chunk
src/Language/Lua/PrettyPrinter.hs view
@@ -1,5 +1,4 @@-{-# OPTIONS_GHC -Wall-                -fno-warn-hi-shadowing+{-# OPTIONS_GHC -fno-warn-hi-shadowing                 -fno-warn-name-shadowing                 -fno-warn-unused-do-bind #-} {-# LANGUAGE FlexibleInstances #-}@@ -16,7 +15,7 @@ import Prelude hiding (EQ, GT, LT) import Text.PrettyPrint.Leijen hiding ((<$>)) -import Language.Lua.Types+import Language.Lua.Syntax  intercalate :: Doc -> [Doc] -> Doc intercalate s elems = sep (punctuate s elems)@@ -36,67 +35,64 @@     pprint True  = text "true"     pprint False = text "false" -instance LPretty (Name a) where-    pprint (Name _ s) = text s--instance LPretty (Exp a) where-    pprint (Nil _)            = text "nil"-    pprint (Bool _ s)         = pprint s-    pprint (Number _ n)       = text n-    pprint (String _ s)       = dquotes (text s)-    pprint (Vararg _)         = text "..."-    pprint (EFunDef _ f)      = pprint f-    pprint (PrefixExp _ pe)   = pprint pe-    pprint (TableConst _ t)   = pprint t+instance LPretty Exp where+    pprint Nil            = text "nil"+    pprint (Bool s)       = pprint s+    pprint (Number n)     = text n+    pprint (String s)     = dquotes (text s)+    pprint Vararg         = text "..."+    pprint (EFunDef f)    = pprint f+    pprint (PrefixExp pe) = pprint pe+    pprint (TableConst t) = pprint t -    pprint (Binop _ op@And{} e1 e2) = group (nest 4 (pprint e1 <+> pprint op <$> pprint e2))-    pprint (Binop _ op@Or{} e1 e2) = group (nest 4 (pprint e1 <+> pprint op <$> pprint e2))-    pprint (Binop _ op e1 e2) = pprint e1 <+> pprint op <+> pprint e2+    pprint (Binop op@And e1 e2) = group (nest 4 (pprint e1 <+> pprint op <$> pprint e2))+    pprint (Binop op@Or e1 e2)  = group (nest 4 (pprint e1 <+> pprint op <$> pprint e2))+    pprint (Binop op e1 e2)     = pprint e1 <+> pprint op <+> pprint e2 -    pprint (Unop _ op e)      = pprint op <> pprint e+    pprint (Unop op e)      = pprint op <> pprint e -instance LPretty (Var a) where-    pprint (VarName _ n)          = pprint n-    pprint (Select _ pe e)        = pprint pe <> brackets (pprint e)-    pprint (SelectName _ pe name) = group (nest 4 (pprint pe <//> (char '.' <> pprint name)))+instance LPretty Var where+    pprint (VarName n)          = pprint n+    pprint (Select pe e)        = pprint pe <> brackets (pprint e)+    pprint (SelectName pe name) = group (nest 4 (pprint pe <//> (char '.' <> pprint name))) -instance LPretty (Binop a) where-    pprint Add{}    = char '+'-    pprint Sub{}    = char '-'-    pprint Mul{}    = char '*'-    pprint Div{}    = char '/'-    pprint Exp{}    = char '^'-    pprint Mod{}    = char '%'-    pprint Concat{} = text ".."-    pprint LT{}     = char '<'-    pprint LTE{}    = text "<="-    pprint GT{}     = char '>'-    pprint GTE{}    = text ">="-    pprint EQ{}     = text "=="-    pprint NEQ{}    = text "~="-    pprint And{}    = text "and"-    pprint Or{}     = text "or"+instance LPretty Binop where+    pprint Add    = char '+'+    pprint Sub    = char '-'+    pprint Mul    = char '*'+    pprint Div    = char '/'+    pprint Exp    = char '^'+    pprint Mod    = char '%'+    pprint Concat = text ".."+    pprint LT     = char '<'+    pprint LTE    = text "<="+    pprint GT     = char '>'+    pprint GTE    = text ">="+    pprint EQ     = text "=="+    pprint NEQ    = text "~="+    pprint And    = text "and"+    pprint Or     = text "or" -instance LPretty (Unop a) where-    pprint Neg{} = char '-'-    pprint Not{} = text "not "-    pprint Len{} = char '#'+instance LPretty Unop where+    pprint Neg = char '-'+    pprint Not = text "not "+    pprint Len = char '#' -instance LPretty (PrefixExp a) where-    pprint (PEVar _ var)         = pprint var-    pprint (PEFunCall _ funcall) = pprint funcall-    pprint (Paren _ e)           = parens (pprint e)+instance LPretty PrefixExp where+    pprint (PEVar var)         = pprint var+    pprint (PEFunCall funcall) = pprint funcall+    pprint (Paren e)           = parens (pprint e) -instance LPretty (Table a) where-    pprint (Table _ fields) = braces (nest 4 (cat (punctuate comma (map pprint fields))))+instance LPretty Table where+    pprint (Table fields) = braces (nest 4 (cat (punctuate comma (map pprint fields)))) -instance LPretty (TableField a) where-    pprint (ExpField _ e1 e2)    = brackets (pprint e1) <+> equals <+> pprint e2-    pprint (NamedField _ name e) = pprint name <+> equals <+> pprint e-    pprint (Field _ e)           = pprint e+instance LPretty TableField where+    pprint (ExpField e1 e2)    = brackets (pprint e1) <+> equals <+> pprint e2+    pprint (NamedField name e) = pprint name <+> equals <+> pprint e+    pprint (Field e)           = pprint e -instance LPretty (Block a) where-    pprint (Block _ stats ret) =+instance LPretty Block where+    pprint (Block stats ret) =       case stats of         [] -> ret'         _  -> vsep (map pprint stats) <$> ret'@@ -104,29 +100,27 @@                      Nothing -> empty                      Just e  -> nest 2 (text "return" </> (intercalate comma (map pprint e))) -instance LPretty (FunName a) where-    pprint (FunName _ name s methods) = cat (punctuate dot (map pprint $ name:s)) <> method'+instance LPretty FunName where+    pprint (FunName name s methods) = cat (punctuate dot (map pprint $ name:s)) <> method'       where method' = case methods of                         Nothing -> empty                         Just m' -> char ':' <> pprint m' -instance LPretty (FunDef a) where-    pprint (FunDef _ body) = pprint body+instance LPretty FunDef where+    pprint (FunDef body) = pprint body -instance LPretty (FunBody a) where+instance LPretty FunBody where     pprint funbody = pprintFunction Nothing funbody -pprintFunction :: Maybe Doc -> FunBody a -> Doc-pprintFunction funname (FunBody _ args vararg block) =-    group (nest 4 (header <$> body) <$> text "end")+pprintFunction :: Maybe Doc -> FunBody -> Doc+pprintFunction funname (FunBody args vararg block) =+    group (nest 4 (header <$> body) <$> end)   where     header = case funname of                Nothing -> text "function" <+> args'                Just n  -> text "function" <+> n <> args' -    vararg' = case vararg of-                Nothing -> []-                Just pos -> [Name pos "..."]+    vararg' = if vararg then ["..."] else []      args' = parens $ case args ++ vararg' of                        [] -> empty@@ -136,35 +130,35 @@      end = text "end" -instance LPretty (FunCall a) where-    pprint (NormalFunCall _ pe arg)     = nest 4 (group (pprint pe <> pprint arg))-    pprint (MethodCall _ pe method arg) = nest 4 (group (pprint pe <//> colon <> pprint method <> pprint arg))+instance LPretty FunCall where+    pprint (NormalFunCall pe arg)     = nest 4 (group (pprint pe <> pprint arg))+    pprint (MethodCall pe method arg) = nest 4 (group (pprint pe <//> colon <> pprint method <> pprint arg)) -instance LPretty (FunArg a) where-    pprint (Args _ exps)   = case map pprint exps of-                               [] -> parens empty-                               l  -> parens (foldr1 (</>) (punctuate comma l))-    pprint (TableArg _ t)  = pprint t-    pprint (StringArg _ s) = dquotes (text s)+instance LPretty FunArg where+    pprint (Args exps)   = case map pprint exps of+                             [] -> parens empty+                             l  -> parens (foldr1 (</>) (punctuate comma l))+    pprint (TableArg t)  = pprint t+    pprint (StringArg s) = dquotes (text s) -instance LPretty (Stat a) where-    pprint (Assign _ names vals)+instance LPretty Stat where+    pprint (Assign names vals)         =   (intercalate comma (map pprint names))         <+> equals         <+> (intercalate comma (map pprint vals))-    pprint (FunCall _ funcall) = pprint funcall-    pprint (Label _ name)      = text "::" <> pprint name <> text "::"-    pprint (Break _)           = text "break"-    pprint (Goto _ name)       = text "goto" <+> pprint name-    pprint (Do _ block)        = group (nest 4 (text "do" <$> pprint block) <$> text "end")-    pprint (While _ guard e)+    pprint (FunCall funcall) = pprint funcall+    pprint (Label name)      = text "::" <> pprint name <> text "::"+    pprint Break             = text "break"+    pprint (Goto name)       = text "goto" <+> pprint name+    pprint (Do block)        = group (nest 4 (text "do" <$> pprint block) <$> text "end")+    pprint (While guard e)         =  (nest 4 (text "while" <+> pprint guard <+> text "do"                    </> indent 4 (pprint e)))        </> text "end"-    pprint (Repeat _ block guard)+    pprint (Repeat block guard)         = nest 4 (text "repeat" </> pprint block) </> (nest 4 (text "until" </> pprint guard)) -    pprint (If _ cases elsePart) = group (printIf cases elsePart)+    pprint (If cases elsePart) = group (printIf cases elsePart)       where         printIf ((guard, block) : xs) e =           nest 4 (text "if" <+> pprint guard <+> text "then" <$> pprint block) <$> printIf' xs e@@ -174,7 +168,7 @@         printIf' ((guard, block) : xs) e =           nest 4 (text "elseif" <+> pprint guard <+> text "then" <$> pprint block) <$> printIf' xs e -    pprint (ForRange _ name e1 e2 e3 block)+    pprint (ForRange name e1 e2 e3 block)         =   text "for" <+> pprint name <> equals <> pprint e1 <> comma <> pprint e2 <> e3' <+> text "do"         <$> indent 4 (pprint block)         <$> text "end"@@ -182,17 +176,17 @@                     Nothing -> empty                     Just e  -> comma <> pprint e -    pprint (ForIn _ names exps block)+    pprint (ForIn names exps block)         =   text "for" <+> (intercalate comma (map pprint names))                 <+> text "in" <+> (intercalate comma (map pprint exps)) <+> text "do"         <$> indent 4 (pprint block)         <$> text "end" -    pprint (FunAssign _ name body) = pprintFunction (Just (pprint name)) body-    pprint (LocalFunAssign _ name body) = text "local" <+> pprintFunction (Just (pprint name)) body-    pprint (LocalAssign _ names exps)+    pprint (FunAssign name body) = pprintFunction (Just (pprint name)) body+    pprint (LocalFunAssign name body) = text "local" <+> pprintFunction (Just (pprint name)) body+    pprint (LocalAssign names exps)         = text "local" <+> (intercalate comma (map pprint names)) <+> equals </> exps'       where exps' = case exps of                       Nothing -> empty                       Just es -> intercalate comma (map pprint es)-    pprint EmptyStat{} = empty+    pprint EmptyStat = empty
+ src/Language/Lua/Syntax.hs view
@@ -0,0 +1,91 @@+{-# OPTIONS_GHC -Wall #-}++-- | Lua 5.2 syntax tree, as specified in <http://www.lua.org/manual/5.2/manual.html#9>.+module Language.Lua.Syntax where++import Prelude hiding (LT, EQ, GT)++type Name = String++data Stat+    = Assign [Var] [Exp] -- ^var1, var2 .. = exp1, exp2 ..+    | FunCall FunCall -- ^function call+    | Label Name -- ^label for goto+    | Break -- ^break+    | Goto Name -- ^goto label+    | Do Block -- ^do .. end+    | While Exp Block -- ^while .. do .. end+    | Repeat Block Exp -- ^repeat .. until ..+    | If [(Exp, Block)] (Maybe Block) -- ^if .. then .. [elseif ..] [else ..] end+    | ForRange Name Exp Exp (Maybe Exp) Block -- ^for x=start, end [, step] do .. end+    | ForIn [Name] [Exp] Block -- ^for x in .. do .. end+    | FunAssign FunName FunBody -- ^function \<var\> (..) .. end+    | LocalFunAssign Name FunBody -- ^local function \<var\> (..) .. end+    | LocalAssign [Name] (Maybe [Exp]) -- ^local var1, var2 .. = exp1, exp2 ..+    | EmptyStat -- ^/;/+    deriving (Show, Eq)++data Exp+    = Nil+    | Bool Bool+    | Number String+    | String String+    | Vararg -- ^/.../+    | EFunDef FunDef -- ^/function (..) .. end/+    | PrefixExp PrefixExp+    | TableConst Table -- ^table constructor+    | Binop Binop Exp Exp -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/+    | Unop Unop Exp -- ^unary operators, /- not #/+    deriving (Show, Eq)++data Var+    = VarName Name -- ^variable+    | Select PrefixExp Exp -- ^/table[exp]/+    | SelectName PrefixExp Name -- ^/table.variable/+    deriving (Show, Eq)++data Binop = Add | Sub | Mul | Div | Exp | Mod | Concat+    | LT | LTE | GT | GTE | EQ | NEQ | And | Or+    deriving (Show, Eq)++data Unop = Neg | Not | Len+    deriving (Show, Eq)++data PrefixExp+    = PEVar Var+    | PEFunCall FunCall+    | Paren Exp+    deriving (Show, Eq)++data Table = Table [TableField] -- ^list of table fields+    deriving (Show, Eq)++data TableField+    = ExpField Exp Exp -- ^/[exp] = exp/+    | NamedField Name Exp -- ^/name = exp/+    | Field Exp+    deriving (Show, Eq)++-- | A block is list of statements with optional return statement.+data Block = Block [Stat] (Maybe [Exp])+    deriving (Show, Eq)++data FunName = FunName Name [Name] (Maybe Name)+    deriving (Show, Eq)++data FunDef = FunDef FunBody+    deriving (Show, Eq)++data FunBody = FunBody [Name] Bool Block -- ^(args, vararg, block)+    deriving (Show, Eq)++data FunCall+    = NormalFunCall PrefixExp FunArg -- ^/prefixexp ( funarg )/+    | MethodCall PrefixExp Name FunArg -- ^/prefixexp : name ( funarg )/+    deriving (Show, Eq)++data FunArg+    = Args [Exp] -- ^list of args+    | TableArg Table -- ^table constructor+    | StringArg String -- ^string+    deriving (Show, Eq)
src/Language/Lua/Token.hs view
@@ -1,6 +1,6 @@ module Language.Lua.Token (LToken(..), tokenValue) where --- ^Lua tokens+-- | Lua tokens data LToken = LTokPlus               -- ^+             | LTokMinus              -- ^\-             | LTokStar               -- ^\*
− src/Language/Lua/Types.hs
@@ -1,264 +0,0 @@-{-# OPTIONS_GHC -Wall #-}-{-# LANGUAGE DeriveFunctor #-}--- | Lua 5.2 syntax tree, as specified in <http://www.lua.org/manual/5.2/manual.html#9>.---- Annotation implementation is inspired by haskell-src-exts.--module Language.Lua.Types where--import Prelude hiding (LT, EQ, GT)--data Name a = Name a String deriving (Show, Eq, Functor)--data Stat a-    = Assign a [Var a] [Exp a] -- ^var1, var2 .. = exp1, exp2 ..-    | FunCall a (FunCall a) -- ^function call-    | Label a (Name a) -- ^label for goto-    | Break a -- ^break-    | Goto a (Name a) -- ^goto label-    | Do a (Block a) -- ^do .. end-    | While a (Exp a) (Block a) -- ^while .. do .. end-    | Repeat a (Block a) (Exp a) -- ^repeat .. until ..-    | If a [(Exp a, Block a)] (Maybe (Block a)) -- ^if .. then .. [elseif ..] [else ..] end-    | ForRange a (Name a) (Exp a) (Exp a) (Maybe (Exp a)) (Block a) -- ^for x=start, end [, step] do .. end-    | ForIn a [Name a] [Exp a] (Block a) -- ^for x in .. do .. end-    | FunAssign a (FunName a) (FunBody a) -- ^function \<var\> (..) .. end-    | LocalFunAssign a (Name a) (FunBody a) -- ^local function \<var\> (..) .. end-    | LocalAssign a [Name a] (Maybe [Exp a]) -- ^local var1, var2 .. = exp1, exp2 ..-    | EmptyStat a -- ^/;/-    deriving (Show, Eq, Functor)--data Exp a-    = Nil a-    | Bool a Bool-    | Number a String-    | String a String-    | Vararg a -- ^/.../-    | EFunDef a (FunDef a) -- ^/function (..) .. end/-    | PrefixExp a (PrefixExp a)-    | TableConst a (Table a) -- ^table constructor-    | Binop a (Binop a) (Exp a) (Exp a) -- ^binary operators, /+ - * ^ % .. < <= > >= == ~= and or/-    | Unop a (Unop a) (Exp a) -- ^unary operators, /- not #/-    deriving (Show, Eq, Functor)--data Var a-    = VarName a (Name a) -- ^variable-    | Select a (PrefixExp a) (Exp a) -- ^/table[exp]/-    | SelectName a (PrefixExp a) (Name a) -- ^/table.variable/-    deriving (Show, Eq, Functor)--data Binop a = Add a | Sub a | Mul a | Div a | Exp a | Mod a | Concat a-    | LT a | LTE a | GT a | GTE a | EQ a | NEQ a | And a | Or a-    deriving (Show, Eq, Functor)--data Unop a = Neg a | Not a | Len a-    deriving (Show, Eq, Functor)--data PrefixExp a-    = PEVar a (Var a)-    | PEFunCall a (FunCall a)-    | Paren a (Exp a)-    deriving (Show, Eq, Functor)--data Table a = Table a [TableField a] -- ^list of table fields-    deriving (Show, Eq, Functor)--data TableField a-    = ExpField a (Exp a) (Exp a) -- ^/[exp] = exp/-    | NamedField a (Name a) (Exp a) -- ^/name = exp/-    | Field a (Exp a)-    deriving (Show, Eq, Functor)---- | A block is list of statements with optional return statement.-data Block a = Block a [Stat a] (Maybe [Exp a])-    deriving (Show, Eq, Functor)--data FunName a = FunName a (Name a) [Name a] (Maybe (Name a))-    deriving (Show, Eq, Functor)--data FunDef a = FunDef a (FunBody a)-    deriving (Show, Eq, Functor)--data FunBody a = FunBody a [Name a] (Maybe a) (Block a) -- ^(args, vararg, block)-    deriving (Show, Eq, Functor)--data FunCall a-    = NormalFunCall a (PrefixExp a) (FunArg a) -- ^/prefixexp ( funarg )/-    | MethodCall a (PrefixExp a) (Name a) (FunArg a) -- ^/prefixexp : name ( funarg )/-    deriving (Show, Eq, Functor)--data FunArg a-    = Args a [Exp a] -- ^list of args-    | TableArg a (Table a) -- ^table constructor-    | StringArg a String -- ^string-    deriving (Show, Eq, Functor)---class Functor ast => Annotated ast where-    -- | Retrieve the annotation of an AST node.-    ann :: ast l -> l-    -- | Change the annotation of an AST node. Note that only the annotation of-    --   the node itself is affected, and not the annotations of any child nodes.-    --   if all nodes in the AST tree are to be affected, use 'fmap'.-    amap :: (l -> l) -> ast l -> ast l--instance Annotated Stat where-    ann (Assign a _ _) = a-    ann (FunCall a _) = a-    ann (Label a _) = a-    ann (Break a) = a-    ann (Goto a _) = a-    ann (Do a _) = a-    ann (While a _ _) = a-    ann (Repeat a _ _) = a-    ann (If a _ _) = a-    ann (ForRange a _ _ _ _ _) = a-    ann (ForIn a _ _ _) = a-    ann (FunAssign a _ _) = a-    ann (LocalFunAssign a _ _) = a-    ann (LocalAssign a _ _) = a-    ann (EmptyStat a) = a--    amap f (Assign a x1 x2) = Assign (f a) x1 x2-    amap f (FunCall a x1) = FunCall (f a) x1-    amap f (Label a x1) = Label (f a) x1-    amap f (Break a) = Break (f a)-    amap f (Goto a x1) = Goto (f a) x1-    amap f (Do a x1) = Do (f a) x1-    amap f (While a x1 x2) = While (f a) x1 x2-    amap f (Repeat a x1 x2) = Repeat (f a) x1 x2-    amap f (If a x1 x2) = If (f a) x1 x2-    amap f (ForRange a x1 x2 x3 x4 x5) = ForRange (f a) x1 x2 x3 x4 x5-    amap f (ForIn a x1 x2 x3) = ForIn (f a) x1 x2 x3-    amap f (FunAssign a x1 x2) = FunAssign (f a) x1 x2-    amap f (LocalFunAssign a x1 x2) = LocalFunAssign (f a) x1 x2-    amap f (LocalAssign a x1 x2) = LocalAssign (f a) x1 x2-    amap f (EmptyStat a) = EmptyStat (f a)--instance Annotated Exp where-    ann (Nil a) = a-    ann (Bool a _) = a-    ann (Number a _) = a-    ann (String a _) = a-    ann (Vararg a) = a-    ann (EFunDef a _) = a-    ann (PrefixExp a _) = a-    ann (TableConst a _) = a-    ann (Binop a _ _ _) = a-    ann (Unop a _ _) = a--    amap f (Nil a) = Nil (f a)-    amap f (Bool a x1) = Bool (f a) x1-    amap f (Number a x1) = Number (f a) x1-    amap f (String a x1) = String (f a) x1-    amap f (Vararg a) = Vararg (f a)-    amap f (EFunDef a x1) = EFunDef (f a) x1-    amap f (PrefixExp a x1) = PrefixExp (f a) x1-    amap f (TableConst a x1) = TableConst (f a) x1-    amap f (Binop a x1 x2 x3) = Binop (f a) x1 x2 x3-    amap f (Unop a x1 x2) = Unop (f a) x1 x2--instance Annotated Var where-    ann (VarName a _) = a-    ann (Select a _ _) = a-    ann (SelectName a _ _) = a--    amap f (VarName a x1) = VarName (f a) x1-    amap f (Select a x1 x2) = Select (f a) x1 x2-    amap f (SelectName a x1 x2) = SelectName (f a) x1 x2--instance Annotated Binop where-    ann (Add a) = a-    ann (Sub a) = a-    ann (Mul a) = a-    ann (Div a) = a-    ann (Exp a) = a-    ann (Mod a) = a-    ann (Concat a) = a-    ann (LT a) = a-    ann (LTE a) = a-    ann (GT a) = a-    ann (GTE a) = a-    ann (EQ a) = a-    ann (NEQ a) = a-    ann (And a) = a-    ann (Or a) = a--    amap f (Add a) = Add (f a)-    amap f (Sub a) = Sub (f a)-    amap f (Mul a) = Mul (f a)-    amap f (Div a) = Div (f a)-    amap f (Exp a) = Exp (f a)-    amap f (Mod a) = Mod (f a)-    amap f (Concat a) = Concat (f a)-    amap f (LT a) = LT (f a)-    amap f (LTE a) = LTE (f a)-    amap f (GT a) = GT (f a)-    amap f (GTE a) = GTE (f a)-    amap f (EQ a) = EQ (f a)-    amap f (NEQ a) = NEQ (f a)-    amap f (And a) = And (f a)-    amap f (Or a) = Or (f a)--instance Annotated Unop where-    ann (Neg a) = a-    ann (Not a) = a-    ann (Len a) = a--    amap f (Neg a) = Neg (f a)-    amap f (Not a) = Not (f a)-    amap f (Len a) = Len (f a)--instance Annotated PrefixExp where-    ann (PEVar a _) = a-    ann (PEFunCall a _) = a-    ann (Paren a _) = a--    amap f (PEVar a x1) = PEVar (f a) x1-    amap f (PEFunCall a x1) = PEFunCall (f a) x1-    amap f (Paren a x1) = Paren (f a) x1--instance Annotated Table where-    ann (Table a _) = a-    amap f (Table a x1) = Table (f a) x1--instance Annotated TableField where-    ann (ExpField a _ _) = a-    ann (NamedField a _ _) = a-    ann (Field a _) = a--    amap f (ExpField a x1 x2) = ExpField (f a) x1 x2-    amap f (NamedField a x1 x2) = NamedField (f a) x1 x2-    amap f (Field a x1) = Field (f a) x1--instance Annotated Block where-    ann (Block a _ _) = a-    amap f (Block a x1 x2) = Block (f a) x1 x2--instance Annotated FunName where-    ann (FunName a _ _ _) = a-    amap f (FunName a x1 x2 x3) = FunName (f a) x1 x2 x3--instance Annotated FunDef where-    ann (FunDef a _) = a-    amap f (FunDef a x1) = FunDef (f a) x1--instance Annotated FunBody where-    ann (FunBody a _ _ _) = a-    amap f (FunBody a x1 x2 x3) = FunBody (f a) x1 x2 x3--instance Annotated FunCall where-    ann (NormalFunCall a _ _) = a-    ann (MethodCall a _ _ _) = a--    amap f (NormalFunCall a x1 x2) = NormalFunCall (f a) x1 x2-    amap f (MethodCall a x1 x2 x3) = MethodCall (f a) x1 x2 x3--instance Annotated FunArg where-    ann (Args a _) = a-    ann (TableArg a _) = a-    ann (StringArg a _) = a--    amap f (Args a x1) = Args (f a) x1-    amap f (TableArg a x1) = TableArg (f a) x1-    amap f (StringArg a x1) = StringArg (f a) x1
src/Text/Parsec/LTok.hs view
@@ -4,7 +4,7 @@ -- | Lexer/Parsec interface module Text.Parsec.LTok where -import Language.Lua.Lexer (LTok, AlexPosn(..))+import Language.Lua.Annotated.Lexer (LTok, AlexPosn(..)) import Language.Lua.Token  import Text.Parsec hiding (satisfy)
src/Text/PrettyPrint/Leijen.hs view
@@ -1,3 +1,4 @@+{-# OPTIONS_GHC -w #-} {-# OPTIONS_HADDOCK hide #-} ----------------------------------------------------------------------------- -- |