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 +691/−0
- language-lua.cabal +20/−9
- src/Language/Lua.hs +3/−8
- src/Language/Lua/Annotated.hs +12/−0
- src/Language/Lua/Annotated/Lexer.x +285/−0
- src/Language/Lua/Annotated/Parser.hs +410/−0
- src/Language/Lua/Annotated/Simplify.hs +103/−0
- src/Language/Lua/Annotated/Syntax.hs +262/−0
- src/Language/Lua/Lexer.x +0/−282
- src/Language/Lua/Parser.hs +12/−396
- src/Language/Lua/PrettyPrinter.hs +85/−91
- src/Language/Lua/Syntax.hs +91/−0
- src/Language/Lua/Token.hs +1/−1
- src/Language/Lua/Types.hs +0/−264
- src/Text/Parsec/LTok.hs +1/−1
- src/Text/PrettyPrint/Leijen.hs +1/−0
+ 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 #-} ----------------------------------------------------------------------------- -- |