From 974e95a5484f35bc42559eeff4d3e2a91f647bdc Mon Sep 17 00:00:00 2001 From: ik1g19 <ik1g19@soton.ac.uk> Date: Thu, 1 Apr 2021 05:42:46 +0100 Subject: [PATCH] add task 3 --- .../part 1}/.gitignore | 0 .../part 1}/ChangeLog.md | 0 {exercise2stack => exercise2/part 1}/LICENSE | 0 .../part 1}/README.md | 0 {exercise2stack => exercise2/part 1}/Setup.hs | 0 .../part 1}/app/Main.hs | 0 .../part 1}/app/Tokens.hs | 0 .../part 1}/app/Tokens.x | 0 .../part 1}/app/test.txt | 0 .../part 1}/exercise2stack.cabal | 0 .../part 1}/package.yaml | 0 .../part 1}/src/Lib.hs | 0 .../part 1}/stack.yaml | 0 .../part 1}/stack.yaml.lock | 0 .../part 1}/test/Spec.hs | 0 exercise2/part 2/Main.hs | 20 + exercise2/part 2/Tokens.hs | 4041 +++++++++++++++++ exercise2/part 2/Tokens.x | 49 + exercise2/part 2/test.txt | 1 + exercise2/part 3/MDLTokens.x | 32 + exercise2/part 3/Main.hs | 20 + exercise2/part 3/Tokens.hs | 4041 +++++++++++++++++ exercise2/part 3/test.txt | 1 + .../Sheet2 => exercise2/solutions}/.DS_Store | Bin .../solutions}/Task1/.DS_Store | Bin .../solutions}/Task1/Main.hs | 0 .../solutions}/Task1/Tokens.x | 0 .../solutions}/Task2/.DS_Store | Bin .../solutions}/Task2/Main.hs | 0 .../solutions}/Task2/Tokens.x | 0 .../solutions}/Task3/.DS_Store | Bin .../solutions}/Task3/MDLTokens.x | 0 .../solutions}/Task3/Main.hs | 0 .../solutions}/Task3/example.mdl | 0 .../solutions}/Task3/exampleErr.mdl | 0 35 files changed, 8205 insertions(+) rename {exercise2stack => exercise2/part 1}/.gitignore (100%) rename {exercise2stack => exercise2/part 1}/ChangeLog.md (100%) rename {exercise2stack => exercise2/part 1}/LICENSE (100%) rename {exercise2stack => exercise2/part 1}/README.md (100%) rename {exercise2stack => exercise2/part 1}/Setup.hs (100%) rename {exercise2stack => exercise2/part 1}/app/Main.hs (100%) rename {exercise2stack => exercise2/part 1}/app/Tokens.hs (100%) rename {exercise2stack => exercise2/part 1}/app/Tokens.x (100%) rename {exercise2stack => exercise2/part 1}/app/test.txt (100%) rename {exercise2stack => exercise2/part 1}/exercise2stack.cabal (100%) rename {exercise2stack => exercise2/part 1}/package.yaml (100%) rename {exercise2stack => exercise2/part 1}/src/Lib.hs (100%) rename {exercise2stack => exercise2/part 1}/stack.yaml (100%) rename {exercise2stack => exercise2/part 1}/stack.yaml.lock (100%) rename {exercise2stack => exercise2/part 1}/test/Spec.hs (100%) create mode 100644 exercise2/part 2/Main.hs create mode 100644 exercise2/part 2/Tokens.hs create mode 100644 exercise2/part 2/Tokens.x create mode 100644 exercise2/part 2/test.txt create mode 100644 exercise2/part 3/MDLTokens.x create mode 100644 exercise2/part 3/Main.hs create mode 100644 exercise2/part 3/Tokens.hs create mode 100644 exercise2/part 3/test.txt rename {exercise2stack/Sheet2 => exercise2/solutions}/.DS_Store (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task1/.DS_Store (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task1/Main.hs (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task1/Tokens.x (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task2/.DS_Store (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task2/Main.hs (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task2/Tokens.x (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task3/.DS_Store (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task3/MDLTokens.x (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task3/Main.hs (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task3/example.mdl (100%) rename {exercise2stack/Sheet2 => exercise2/solutions}/Task3/exampleErr.mdl (100%) diff --git a/exercise2stack/.gitignore b/exercise2/part 1/.gitignore similarity index 100% rename from exercise2stack/.gitignore rename to exercise2/part 1/.gitignore diff --git a/exercise2stack/ChangeLog.md b/exercise2/part 1/ChangeLog.md similarity index 100% rename from exercise2stack/ChangeLog.md rename to exercise2/part 1/ChangeLog.md diff --git a/exercise2stack/LICENSE b/exercise2/part 1/LICENSE similarity index 100% rename from exercise2stack/LICENSE rename to exercise2/part 1/LICENSE diff --git a/exercise2stack/README.md b/exercise2/part 1/README.md similarity index 100% rename from exercise2stack/README.md rename to exercise2/part 1/README.md diff --git a/exercise2stack/Setup.hs b/exercise2/part 1/Setup.hs similarity index 100% rename from exercise2stack/Setup.hs rename to exercise2/part 1/Setup.hs diff --git a/exercise2stack/app/Main.hs b/exercise2/part 1/app/Main.hs similarity index 100% rename from exercise2stack/app/Main.hs rename to exercise2/part 1/app/Main.hs diff --git a/exercise2stack/app/Tokens.hs b/exercise2/part 1/app/Tokens.hs similarity index 100% rename from exercise2stack/app/Tokens.hs rename to exercise2/part 1/app/Tokens.hs diff --git a/exercise2stack/app/Tokens.x b/exercise2/part 1/app/Tokens.x similarity index 100% rename from exercise2stack/app/Tokens.x rename to exercise2/part 1/app/Tokens.x diff --git a/exercise2stack/app/test.txt b/exercise2/part 1/app/test.txt similarity index 100% rename from exercise2stack/app/test.txt rename to exercise2/part 1/app/test.txt diff --git a/exercise2stack/exercise2stack.cabal b/exercise2/part 1/exercise2stack.cabal similarity index 100% rename from exercise2stack/exercise2stack.cabal rename to exercise2/part 1/exercise2stack.cabal diff --git a/exercise2stack/package.yaml b/exercise2/part 1/package.yaml similarity index 100% rename from exercise2stack/package.yaml rename to exercise2/part 1/package.yaml diff --git a/exercise2stack/src/Lib.hs b/exercise2/part 1/src/Lib.hs similarity index 100% rename from exercise2stack/src/Lib.hs rename to exercise2/part 1/src/Lib.hs diff --git a/exercise2stack/stack.yaml b/exercise2/part 1/stack.yaml similarity index 100% rename from exercise2stack/stack.yaml rename to exercise2/part 1/stack.yaml diff --git a/exercise2stack/stack.yaml.lock b/exercise2/part 1/stack.yaml.lock similarity index 100% rename from exercise2stack/stack.yaml.lock rename to exercise2/part 1/stack.yaml.lock diff --git a/exercise2stack/test/Spec.hs b/exercise2/part 1/test/Spec.hs similarity index 100% rename from exercise2stack/test/Spec.hs rename to exercise2/part 1/test/Spec.hs diff --git a/exercise2/part 2/Main.hs b/exercise2/part 2/Main.hs new file mode 100644 index 0000000..fbc70a0 --- /dev/null +++ b/exercise2/part 2/Main.hs @@ -0,0 +1,20 @@ +module Main where + +import Tokens +import System.Environment +import Control.Exception +import System.IO + +main :: IO () +main = catch main' noLex + +main' = do (fileName : _) <- getArgs + sourceText <- readFile fileName + putStrLn $ "Lexing: " ++ sourceText + let lexedProg = alexScanTokens sourceText + putStrLn $ "Lexed as: " ++ (show lexedProg) + +noLex :: ErrorCall -> IO () +noLex e = do let err = show e + hPutStrLn stderr ("Problem with lexing :" ++ err) + return () \ No newline at end of file diff --git a/exercise2/part 2/Tokens.hs b/exercise2/part 2/Tokens.hs new file mode 100644 index 0000000..f347e6c --- /dev/null +++ b/exercise2/part 2/Tokens.hs @@ -0,0 +1,4041 @@ +{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-} +{-# LANGUAGE CPP #-} +{-# LINE 1 "Tokens.x" #-} + +module Tokens where + +#if __GLASGOW_HASKELL__ >= 603 +#include "ghcconfig.h" +#elif defined(__GLASGOW_HASKELL__) +#include "config.h" +#endif +#if __GLASGOW_HASKELL__ >= 503 +import Data.Array +#else +import Array +#endif +{-# 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) + + + + + + + + + + + + + + + + +import Data.Char (ord) +import qualified Data.Bits + +-- | Encode a Haskell String to a list of Word8 values, in UTF8 format. +utf8Encode :: Char -> [Word8] +utf8Encode = uncurry (:) . utf8Encode' + +utf8Encode' :: Char -> (Word8, [Word8]) +utf8Encode' c = case go (ord c) of + (x, xs) -> (fromIntegral x, map fromIntegral xs) + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- 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. + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- Monad (default and with ByteString input) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- Basic wrapper + + +type AlexInput = (Char,[Byte],String) + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar (c,_,_) = c + +-- alexScanTokens :: String -> [token] +alexScanTokens str = go ('\n',[],str) + where go inp__@(_,_bs,s) = + case alexScan inp__ 0 of + AlexEOF -> [] + AlexError _ -> error "lexical error" + AlexSkip inp__' _ln -> go inp__' + AlexToken inp__' len act -> act (take len s) : go inp__' + +alexGetByte :: AlexInput -> Maybe (Byte,AlexInput) +alexGetByte (c,(b:bs),s) = Just (b,(c,bs,s)) +alexGetByte (_,[],[]) = Nothing +alexGetByte (_,[],(c:s)) = case utf8Encode' c of + (b, bs) -> Just (b, (c, bs, s)) + + + +-- ----------------------------------------------------------------------------- +-- Basic wrapper, ByteString version + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- Posn wrapper + +-- Adds text positions to the basic model. + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- Posn wrapper, ByteString version + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- GScan wrapper + +-- For compatibility with previous versions of Alex, and because we can. + + + + + + + + + + + + + + +alex_tab_size :: Int +alex_tab_size = 8 +alex_base :: Array Int Int +alex_base = listArray (0 :: Int, 28) + [ -8 + , -147 + , -76 + , 0 + , 37 + , 0 + , 165 + , -121 + , 293 + , 549 + , 485 + , 0 + , -1 + , 731 + , 939 + , 1014 + , -35 + , 0 + , 0 + , -22 + , 0 + , 0 + , 0 + , 0 + , 0 + , 1101 + , 1176 + , 1263 + , 1338 + ] + +alex_table :: Array Int Int +alex_table = listArray (0 :: Int, 1593) + [ 0 + , 12 + , 12 + , 12 + , 12 + , 12 + , 26 + , 1 + , 12 + , 12 + , 12 + , 12 + , 12 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 13 + , 12 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 12 + , 22 + , 23 + , 20 + , 18 + , 0 + , 19 + , 0 + , 21 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 0 + , 0 + , 0 + , 17 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 24 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 27 + , 26 + , 26 + , 25 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 10 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 2 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 8 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 9 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 9 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 10 + , 8 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 2 + , 6 + , 5 + , 5 + , 5 + , 4 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 28 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 15 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 14 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + ] + +alex_check :: Array Int Int +alex_check = listArray (0 :: Int, 1593) + [ -1 + , 9 + , 10 + , 11 + , 12 + , 13 + , 153 + , 128 + , 9 + , 10 + , 11 + , 12 + , 13 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , 45 + , 32 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 32 + , 40 + , 41 + , 42 + , 43 + , -1 + , 45 + , -1 + , 47 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , 61 + , -1 + , -1 + , -1 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , 94 + , -1 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 143 + , 144 + , 145 + , 146 + , 147 + , 148 + , 149 + , 150 + , 151 + , 152 + , 153 + , 154 + , 155 + , 156 + , 157 + , 158 + , 159 + , 160 + , 161 + , 162 + , 163 + , 164 + , 165 + , 166 + , 167 + , 168 + , 169 + , 170 + , 171 + , 172 + , 173 + , 174 + , 175 + , 176 + , 177 + , 178 + , 179 + , 180 + , 181 + , 182 + , 183 + , 184 + , 185 + , 186 + , 187 + , 188 + , 189 + , 190 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 128 + , 129 + , 130 + , 131 + , 132 + , 133 + , 134 + , 135 + , 136 + , 137 + , 138 + , 139 + , 140 + , 141 + , 142 + , 143 + , 144 + , 145 + , 146 + , 147 + , 148 + , 149 + , 150 + , 151 + , 152 + , 153 + , 154 + , 155 + , 156 + , 157 + , 158 + , 159 + , 160 + , 161 + , 162 + , 163 + , 164 + , 165 + , 166 + , 167 + , 168 + , 169 + , 170 + , 171 + , 172 + , 173 + , 174 + , 175 + , 176 + , 177 + , 178 + , 179 + , 180 + , 181 + , 182 + , 183 + , 184 + , 185 + , 186 + , 187 + , 188 + , 189 + , 190 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 128 + , 129 + , 130 + , 131 + , 132 + , 133 + , 134 + , 135 + , 136 + , 137 + , 138 + , 139 + , 140 + , 141 + , 142 + , 143 + , 144 + , 145 + , 146 + , 147 + , 148 + , 149 + , 150 + , 151 + , 152 + , 153 + , 154 + , 155 + , 156 + , 157 + , 158 + , 159 + , 160 + , 161 + , 162 + , 163 + , 164 + , 165 + , 166 + , 167 + , 168 + , 169 + , 170 + , 171 + , 172 + , 173 + , 174 + , 175 + , 176 + , 177 + , 178 + , 179 + , 180 + , 181 + , 182 + , 183 + , 184 + , 185 + , 186 + , 187 + , 188 + , 189 + , 190 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 0 + , 1 + , 2 + , 3 + , 4 + , 5 + , 6 + , 7 + , 8 + , 9 + , 10 + , 11 + , 12 + , 13 + , 14 + , 15 + , 16 + , 17 + , 18 + , 19 + , 20 + , 21 + , 22 + , 23 + , 24 + , 25 + , 26 + , 27 + , 28 + , 29 + , 30 + , 31 + , 32 + , 33 + , 34 + , 35 + , 36 + , 37 + , 38 + , 39 + , 40 + , 41 + , 42 + , 43 + , 44 + , 45 + , 46 + , 47 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , 58 + , 59 + , 60 + , 61 + , 62 + , 63 + , 64 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , 91 + , 92 + , 93 + , 94 + , 95 + , 96 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 123 + , 124 + , 125 + , 126 + , 127 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 10 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 128 + , 129 + , 130 + , 131 + , 132 + , 133 + , 134 + , 135 + , 136 + , 137 + , 138 + , 139 + , 140 + , 141 + , 142 + , 143 + , 144 + , 145 + , 146 + , 147 + , 148 + , 149 + , 150 + , 151 + , 152 + , 153 + , 154 + , 155 + , 156 + , 157 + , 158 + , 159 + , 160 + , 161 + , 162 + , 163 + , 164 + , 165 + , 166 + , 167 + , 168 + , 169 + , 170 + , 171 + , 172 + , 173 + , 174 + , 175 + , 176 + , 177 + , 178 + , 179 + , 180 + , 181 + , 182 + , 183 + , 184 + , 185 + , 186 + , 187 + , 188 + , 189 + , 190 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + ] + +alex_deflt :: Array Int Int +alex_deflt = listArray (0 :: Int, 28) + [ -1 + , -1 + , 11 + , 11 + , 3 + , 3 + , -1 + , -1 + , -1 + , 13 + , 13 + , 13 + , -1 + , 13 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + ] + +alex_accept = listArray (0 :: Int, 28) + [ AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccSkip + , AlexAccSkip + , AlexAcc 14 + , AlexAcc 13 + , AlexAcc 12 + , AlexAcc 11 + , AlexAcc 10 + , AlexAcc 9 + , AlexAcc 8 + , AlexAcc 7 + , AlexAcc 6 + , AlexAcc 5 + , AlexAcc 4 + , AlexAcc 3 + , AlexAcc 2 + , AlexAcc 1 + , AlexAcc 0 + ] + +alex_actions = array (0 :: Int, 15) + [ (14,alex_action_2) + , (13,alex_action_3) + , (12,alex_action_4) + , (11,alex_action_5) + , (10,alex_action_6) + , (9,alex_action_7) + , (8,alex_action_8) + , (7,alex_action_9) + , (6,alex_action_10) + , (5,alex_action_11) + , (4,alex_action_12) + , (3,alex_action_13) + , (2,alex_action_13) + , (1,alex_action_13) + , (0,alex_action_13) + ] + +{-# LINE 27 "Tokens.x" #-} + +-- Each action has type :: String -> Token +-- The token type: +data Token = + TokenLet | + TokenIn | + TokenInt Int | + TokenVar String | + TokenEq | + TokenPlus | + TokenMinus | + TokenTimes | + TokenDiv | + TokenExp | + TokenLParen | + TokenRParen + deriving (Eq,Show) + + +alex_action_2 = \s -> TokenLet +alex_action_3 = \s -> TokenIn +alex_action_4 = \s -> TokenInt (read s) +alex_action_5 = \s -> TokenEq +alex_action_6 = \s -> TokenPlus +alex_action_7 = \s -> TokenMinus +alex_action_8 = \s -> TokenTimes +alex_action_9 = \s -> TokenDiv +alex_action_10 = \s -> TokenLParen +alex_action_11 = \s -> TokenRParen +alex_action_12 = \s -> TokenExp +alex_action_13 = \s -> TokenVar s +{-# 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +alexIndexInt16OffAddr arr off = arr ! off + + + + + + + + + + + + + + + + + + + + + + + + +alexIndexInt32OffAddr arr off = arr ! off + + + + + + + + + + + +quickIndex arr i = arr ! i + + +-- ----------------------------------------------------------------------------- +-- Main lexing routines + +data AlexReturn a + = AlexEOF + | AlexError !AlexInput + | AlexSkip !AlexInput !Int + | AlexToken !AlexInput !Int a + +-- alexScan :: AlexInput -> StartCode -> AlexReturn a +alexScan input__ (sc) + = alexScanUser undefined input__ (sc) + +alexScanUser user__ input__ (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 (alex_actions ! 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` (s))) + in + new_acc `seq` + case alexGetByte input__ of + Nothing -> (new_acc, input__) + Just (c, new_input) -> + + + + case fromIntegral c of { (ord_c) -> + let + base = alexIndexInt32OffAddr alex_base s + offset = (base + ord_c) + check = alexIndexInt16OffAddr alex_check offset + + new_s = if (offset >= (0)) && (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__ (len) + check_accs (AlexAccSkip) = AlexLastSkip input__ (len) + + check_accs (AlexAccPred a predx rest) + | predx user__ orig_input (len) input__ + = AlexLastAcc a input__ (len) + | otherwise + = check_accs rest + check_accs (AlexAccSkipPred predx rest) + | predx user__ orig_input (len) input__ + = AlexLastSkip input__ (len) + | otherwise + = check_accs rest + + +data AlexLastAcc + = AlexNone + | AlexLastAcc !Int !AlexInput !Int + | AlexLastSkip !AlexInput !Int + +data AlexAcc user + = AlexAccNone + | AlexAcc Int + | AlexAccSkip + + | AlexAccPred Int (AlexAccPred user) (AlexAcc user) + | AlexAccSkipPred (AlexAccPred user) (AlexAcc user) + +type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool + +-- ----------------------------------------------------------------------------- +-- Predicates on a rule + +alexAndPred p1 p2 user__ in1 len in2 + = p1 user__ in1 len in2 && p2 user__ in1 len in2 + +--alexPrevCharIsPred :: Char -> AlexAccPred _ +alexPrevCharIs c _ input__ _ _ = c == alexInputPrevChar input__ + +alexPrevCharMatches f _ input__ _ _ = f (alexInputPrevChar input__) + +--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ +alexPrevCharIsOneOf arr _ input__ _ _ = arr ! alexInputPrevChar input__ + +--alexRightContext :: Int -> AlexAccPred _ +alexRightContext (sc) user__ _ _ input__ = + case alex_scan_tkn user__ input__ (0) input__ sc AlexNone of + (AlexNone, _) -> False + _ -> True + -- TODO: there's no need to find the longest + -- match when checking the right context, just + -- the first match will do. + diff --git a/exercise2/part 2/Tokens.x b/exercise2/part 2/Tokens.x new file mode 100644 index 0000000..a4147f1 --- /dev/null +++ b/exercise2/part 2/Tokens.x @@ -0,0 +1,49 @@ +{ +module Tokens where +} + +%wrapper "posn" +$digit = 0-9 +-- digits +$alpha = [a-zA-Z] +-- alphabetic characters + +tokens :- + $white+ ; + "--".* ; + let { \p s -> TokenLet p} + in { \p s -> TokenIn p} + $digit+ { \p s -> TokenInt p (read s) } + \= { \p s -> TokenEq p} + \+ { \p s -> TokenPlus p} + \- { \p s -> TokenMinus p} + \* { \p s -> TokenTimes p} + \/ { \p s -> TokenDiv p} + \( { \p s -> TokenLParen p} + \) { \p s -> TokenRParen p} + \^ { \p s -> TokenExp p} + $alpha [$alpha $digit \_ \’]* { \p s -> TokenVar p s } + +{ +-- Each action has type :: AlexPosn -> String -> Token +-- The token type: +data Token = + TokenLet AlexPosn | + TokenIn AlexPosn | + TokenInt AlexPosn Int | + TokenVar AlexPosn String | + TokenEq AlexPosn | + TokenPlus AlexPosn | + TokenMinus AlexPosn | + TokenTimes AlexPosn | + TokenDiv AlexPosn | + TokenExp AlexPosn | + TokenLParen AlexPosn | + TokenRParen AlexPosn + deriving (Eq,Show) + +tokenPosn :: Token -> String +tokenPosn (TokenLet (AlexPn _ l c)) = (show l) ++ " : " ++ (show c) +-- all other cases as well + +} \ No newline at end of file diff --git a/exercise2/part 2/test.txt b/exercise2/part 2/test.txt new file mode 100644 index 0000000..0867e4f --- /dev/null +++ b/exercise2/part 2/test.txt @@ -0,0 +1 @@ +let x = 34 in x + 17 \ No newline at end of file diff --git a/exercise2/part 3/MDLTokens.x b/exercise2/part 3/MDLTokens.x new file mode 100644 index 0000000..536b939 --- /dev/null +++ b/exercise2/part 3/MDLTokens.x @@ -0,0 +1,32 @@ +{ +module MDLTokens where +} + +-- start with writing a grammar + +-- E := Forward n | Rotate D | Check [1..9] | if E then E else E | E ; E | ( E ) +-- D := L | R + +%wrapper "posn" +$digit = 0-9 + +tokens :- + $white+ ; + "--".* ; + Forward {\p s -> TokenForward p} + Rotate {\p s -> TokenRotate p} + Check {\p s -> TokenCheck p} + if {\p s -> TokenIf p} + then {\p s -> TokenThen p} + else {\p s -> TokenElse p} + L {\p s -> TokenLeft p} + R {\p s -> TokenRight p} + \; + \( + \) + [1..9] {\p s -> TokenDigit p (read s)} + $digit $digit+ {\p s -> TokenInt p (read s)} + +{ + data MDLToken = +} \ No newline at end of file diff --git a/exercise2/part 3/Main.hs b/exercise2/part 3/Main.hs new file mode 100644 index 0000000..fbc70a0 --- /dev/null +++ b/exercise2/part 3/Main.hs @@ -0,0 +1,20 @@ +module Main where + +import Tokens +import System.Environment +import Control.Exception +import System.IO + +main :: IO () +main = catch main' noLex + +main' = do (fileName : _) <- getArgs + sourceText <- readFile fileName + putStrLn $ "Lexing: " ++ sourceText + let lexedProg = alexScanTokens sourceText + putStrLn $ "Lexed as: " ++ (show lexedProg) + +noLex :: ErrorCall -> IO () +noLex e = do let err = show e + hPutStrLn stderr ("Problem with lexing :" ++ err) + return () \ No newline at end of file diff --git a/exercise2/part 3/Tokens.hs b/exercise2/part 3/Tokens.hs new file mode 100644 index 0000000..f347e6c --- /dev/null +++ b/exercise2/part 3/Tokens.hs @@ -0,0 +1,4041 @@ +{-# OPTIONS_GHC -fno-warn-unused-binds -fno-warn-missing-signatures #-} +{-# LANGUAGE CPP #-} +{-# LINE 1 "Tokens.x" #-} + +module Tokens where + +#if __GLASGOW_HASKELL__ >= 603 +#include "ghcconfig.h" +#elif defined(__GLASGOW_HASKELL__) +#include "config.h" +#endif +#if __GLASGOW_HASKELL__ >= 503 +import Data.Array +#else +import Array +#endif +{-# 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) + + + + + + + + + + + + + + + + +import Data.Char (ord) +import qualified Data.Bits + +-- | Encode a Haskell String to a list of Word8 values, in UTF8 format. +utf8Encode :: Char -> [Word8] +utf8Encode = uncurry (:) . utf8Encode' + +utf8Encode' :: Char -> (Word8, [Word8]) +utf8Encode' c = case go (ord c) of + (x, xs) -> (fromIntegral x, map fromIntegral xs) + 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- 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. + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- Monad (default and with ByteString input) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- Basic wrapper + + +type AlexInput = (Char,[Byte],String) + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar (c,_,_) = c + +-- alexScanTokens :: String -> [token] +alexScanTokens str = go ('\n',[],str) + where go inp__@(_,_bs,s) = + case alexScan inp__ 0 of + AlexEOF -> [] + AlexError _ -> error "lexical error" + AlexSkip inp__' _ln -> go inp__' + AlexToken inp__' len act -> act (take len s) : go inp__' + +alexGetByte :: AlexInput -> Maybe (Byte,AlexInput) +alexGetByte (c,(b:bs),s) = Just (b,(c,bs,s)) +alexGetByte (_,[],[]) = Nothing +alexGetByte (_,[],(c:s)) = case utf8Encode' c of + (b, bs) -> Just (b, (c, bs, s)) + + + +-- ----------------------------------------------------------------------------- +-- Basic wrapper, ByteString version + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- Posn wrapper + +-- Adds text positions to the basic model. + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- Posn wrapper, ByteString version + + + + + + + + + + + + + + +-- ----------------------------------------------------------------------------- +-- GScan wrapper + +-- For compatibility with previous versions of Alex, and because we can. + + + + + + + + + + + + + + +alex_tab_size :: Int +alex_tab_size = 8 +alex_base :: Array Int Int +alex_base = listArray (0 :: Int, 28) + [ -8 + , -147 + , -76 + , 0 + , 37 + , 0 + , 165 + , -121 + , 293 + , 549 + , 485 + , 0 + , -1 + , 731 + , 939 + , 1014 + , -35 + , 0 + , 0 + , -22 + , 0 + , 0 + , 0 + , 0 + , 0 + , 1101 + , 1176 + , 1263 + , 1338 + ] + +alex_table :: Array Int Int +alex_table = listArray (0 :: Int, 1593) + [ 0 + , 12 + , 12 + , 12 + , 12 + , 12 + , 26 + , 1 + , 12 + , 12 + , 12 + , 12 + , 12 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 13 + , 12 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 12 + , 22 + , 23 + , 20 + , 18 + , 0 + , 19 + , 0 + , 21 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 16 + , 0 + , 0 + , 0 + , 17 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 24 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 27 + , 26 + , 26 + , 25 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 10 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 2 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 8 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 9 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 9 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 11 + , 10 + , 8 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 3 + , 2 + , 6 + , 5 + , 5 + , 5 + , 4 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 28 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 15 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 26 + , 0 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 14 + , 26 + , 26 + , 26 + , 26 + , 26 + , 26 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 7 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + , 0 + ] + +alex_check :: Array Int Int +alex_check = listArray (0 :: Int, 1593) + [ -1 + , 9 + , 10 + , 11 + , 12 + , 13 + , 153 + , 128 + , 9 + , 10 + , 11 + , 12 + , 13 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , 45 + , 32 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 32 + , 40 + , 41 + , 42 + , 43 + , -1 + , 45 + , -1 + , 47 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , 61 + , -1 + , -1 + , -1 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , 94 + , -1 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 143 + , 144 + , 145 + , 146 + , 147 + , 148 + , 149 + , 150 + , 151 + , 152 + , 153 + , 154 + , 155 + , 156 + , 157 + , 158 + , 159 + , 160 + , 161 + , 162 + , 163 + , 164 + , 165 + , 166 + , 167 + , 168 + , 169 + , 170 + , 171 + , 172 + , 173 + , 174 + , 175 + , 176 + , 177 + , 178 + , 179 + , 180 + , 181 + , 182 + , 183 + , 184 + , 185 + , 186 + , 187 + , 188 + , 189 + , 190 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 128 + , 129 + , 130 + , 131 + , 132 + , 133 + , 134 + , 135 + , 136 + , 137 + , 138 + , 139 + , 140 + , 141 + , 142 + , 143 + , 144 + , 145 + , 146 + , 147 + , 148 + , 149 + , 150 + , 151 + , 152 + , 153 + , 154 + , 155 + , 156 + , 157 + , 158 + , 159 + , 160 + , 161 + , 162 + , 163 + , 164 + , 165 + , 166 + , 167 + , 168 + , 169 + , 170 + , 171 + , 172 + , 173 + , 174 + , 175 + , 176 + , 177 + , 178 + , 179 + , 180 + , 181 + , 182 + , 183 + , 184 + , 185 + , 186 + , 187 + , 188 + , 189 + , 190 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 128 + , 129 + , 130 + , 131 + , 132 + , 133 + , 134 + , 135 + , 136 + , 137 + , 138 + , 139 + , 140 + , 141 + , 142 + , 143 + , 144 + , 145 + , 146 + , 147 + , 148 + , 149 + , 150 + , 151 + , 152 + , 153 + , 154 + , 155 + , 156 + , 157 + , 158 + , 159 + , 160 + , 161 + , 162 + , 163 + , 164 + , 165 + , 166 + , 167 + , 168 + , 169 + , 170 + , 171 + , 172 + , 173 + , 174 + , 175 + , 176 + , 177 + , 178 + , 179 + , 180 + , 181 + , 182 + , 183 + , 184 + , 185 + , 186 + , 187 + , 188 + , 189 + , 190 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 0 + , 1 + , 2 + , 3 + , 4 + , 5 + , 6 + , 7 + , 8 + , 9 + , 10 + , 11 + , 12 + , 13 + , 14 + , 15 + , 16 + , 17 + , 18 + , 19 + , 20 + , 21 + , 22 + , 23 + , 24 + , 25 + , 26 + , 27 + , 28 + , 29 + , 30 + , 31 + , 32 + , 33 + , 34 + , 35 + , 36 + , 37 + , 38 + , 39 + , 40 + , 41 + , 42 + , 43 + , 44 + , 45 + , 46 + , 47 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , 58 + , 59 + , 60 + , 61 + , 62 + , 63 + , 64 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , 91 + , 92 + , 93 + , 94 + , 95 + , 96 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 123 + , 124 + , 125 + , 126 + , 127 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 10 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 128 + , 129 + , 130 + , 131 + , 132 + , 133 + , 134 + , 135 + , 136 + , 137 + , 138 + , 139 + , 140 + , 141 + , 142 + , 143 + , 144 + , 145 + , 146 + , 147 + , 148 + , 149 + , 150 + , 151 + , 152 + , 153 + , 154 + , 155 + , 156 + , 157 + , 158 + , 159 + , 160 + , 161 + , 162 + , 163 + , 164 + , 165 + , 166 + , 167 + , 168 + , 169 + , 170 + , 171 + , 172 + , 173 + , 174 + , 175 + , 176 + , 177 + , 178 + , 179 + , 180 + , 181 + , 182 + , 183 + , 184 + , 185 + , 186 + , 187 + , 188 + , 189 + , 190 + , 191 + , 192 + , 193 + , 194 + , 195 + , 196 + , 197 + , 198 + , 199 + , 200 + , 201 + , 202 + , 203 + , 204 + , 205 + , 206 + , 207 + , 208 + , 209 + , 210 + , 211 + , 212 + , 213 + , 214 + , 215 + , 216 + , 217 + , 218 + , 219 + , 220 + , 221 + , 222 + , 223 + , 224 + , 225 + , 226 + , 227 + , 228 + , 229 + , 230 + , 231 + , 232 + , 233 + , 234 + , 235 + , 236 + , 237 + , 238 + , 239 + , 240 + , 241 + , 242 + , 243 + , 244 + , 245 + , 246 + , 247 + , 248 + , 249 + , 250 + , 251 + , 252 + , 253 + , 254 + , 255 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , -1 + , -1 + , -1 + , -1 + , 95 + , -1 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + , 112 + , 113 + , 114 + , 115 + , 116 + , 117 + , 118 + , 119 + , 120 + , 121 + , 122 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , 226 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + ] + +alex_deflt :: Array Int Int +alex_deflt = listArray (0 :: Int, 28) + [ -1 + , -1 + , 11 + , 11 + , 3 + , 3 + , -1 + , -1 + , -1 + , 13 + , 13 + , 13 + , -1 + , 13 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + , -1 + ] + +alex_accept = listArray (0 :: Int, 28) + [ AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccSkip + , AlexAccSkip + , AlexAcc 14 + , AlexAcc 13 + , AlexAcc 12 + , AlexAcc 11 + , AlexAcc 10 + , AlexAcc 9 + , AlexAcc 8 + , AlexAcc 7 + , AlexAcc 6 + , AlexAcc 5 + , AlexAcc 4 + , AlexAcc 3 + , AlexAcc 2 + , AlexAcc 1 + , AlexAcc 0 + ] + +alex_actions = array (0 :: Int, 15) + [ (14,alex_action_2) + , (13,alex_action_3) + , (12,alex_action_4) + , (11,alex_action_5) + , (10,alex_action_6) + , (9,alex_action_7) + , (8,alex_action_8) + , (7,alex_action_9) + , (6,alex_action_10) + , (5,alex_action_11) + , (4,alex_action_12) + , (3,alex_action_13) + , (2,alex_action_13) + , (1,alex_action_13) + , (0,alex_action_13) + ] + +{-# LINE 27 "Tokens.x" #-} + +-- Each action has type :: String -> Token +-- The token type: +data Token = + TokenLet | + TokenIn | + TokenInt Int | + TokenVar String | + TokenEq | + TokenPlus | + TokenMinus | + TokenTimes | + TokenDiv | + TokenExp | + TokenLParen | + TokenRParen + deriving (Eq,Show) + + +alex_action_2 = \s -> TokenLet +alex_action_3 = \s -> TokenIn +alex_action_4 = \s -> TokenInt (read s) +alex_action_5 = \s -> TokenEq +alex_action_6 = \s -> TokenPlus +alex_action_7 = \s -> TokenMinus +alex_action_8 = \s -> TokenTimes +alex_action_9 = \s -> TokenDiv +alex_action_10 = \s -> TokenLParen +alex_action_11 = \s -> TokenRParen +alex_action_12 = \s -> TokenExp +alex_action_13 = \s -> TokenVar s +{-# 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +alexIndexInt16OffAddr arr off = arr ! off + + + + + + + + + + + + + + + + + + + + + + + + +alexIndexInt32OffAddr arr off = arr ! off + + + + + + + + + + + +quickIndex arr i = arr ! i + + +-- ----------------------------------------------------------------------------- +-- Main lexing routines + +data AlexReturn a + = AlexEOF + | AlexError !AlexInput + | AlexSkip !AlexInput !Int + | AlexToken !AlexInput !Int a + +-- alexScan :: AlexInput -> StartCode -> AlexReturn a +alexScan input__ (sc) + = alexScanUser undefined input__ (sc) + +alexScanUser user__ input__ (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 (alex_actions ! 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` (s))) + in + new_acc `seq` + case alexGetByte input__ of + Nothing -> (new_acc, input__) + Just (c, new_input) -> + + + + case fromIntegral c of { (ord_c) -> + let + base = alexIndexInt32OffAddr alex_base s + offset = (base + ord_c) + check = alexIndexInt16OffAddr alex_check offset + + new_s = if (offset >= (0)) && (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__ (len) + check_accs (AlexAccSkip) = AlexLastSkip input__ (len) + + check_accs (AlexAccPred a predx rest) + | predx user__ orig_input (len) input__ + = AlexLastAcc a input__ (len) + | otherwise + = check_accs rest + check_accs (AlexAccSkipPred predx rest) + | predx user__ orig_input (len) input__ + = AlexLastSkip input__ (len) + | otherwise + = check_accs rest + + +data AlexLastAcc + = AlexNone + | AlexLastAcc !Int !AlexInput !Int + | AlexLastSkip !AlexInput !Int + +data AlexAcc user + = AlexAccNone + | AlexAcc Int + | AlexAccSkip + + | AlexAccPred Int (AlexAccPred user) (AlexAcc user) + | AlexAccSkipPred (AlexAccPred user) (AlexAcc user) + +type AlexAccPred user = user -> AlexInput -> Int -> AlexInput -> Bool + +-- ----------------------------------------------------------------------------- +-- Predicates on a rule + +alexAndPred p1 p2 user__ in1 len in2 + = p1 user__ in1 len in2 && p2 user__ in1 len in2 + +--alexPrevCharIsPred :: Char -> AlexAccPred _ +alexPrevCharIs c _ input__ _ _ = c == alexInputPrevChar input__ + +alexPrevCharMatches f _ input__ _ _ = f (alexInputPrevChar input__) + +--alexPrevCharIsOneOfPred :: Array Char Bool -> AlexAccPred _ +alexPrevCharIsOneOf arr _ input__ _ _ = arr ! alexInputPrevChar input__ + +--alexRightContext :: Int -> AlexAccPred _ +alexRightContext (sc) user__ _ _ input__ = + case alex_scan_tkn user__ input__ (0) input__ sc AlexNone of + (AlexNone, _) -> False + _ -> True + -- TODO: there's no need to find the longest + -- match when checking the right context, just + -- the first match will do. + diff --git a/exercise2/part 3/test.txt b/exercise2/part 3/test.txt new file mode 100644 index 0000000..0867e4f --- /dev/null +++ b/exercise2/part 3/test.txt @@ -0,0 +1 @@ +let x = 34 in x + 17 \ No newline at end of file diff --git a/exercise2stack/Sheet2/.DS_Store b/exercise2/solutions/.DS_Store similarity index 100% rename from exercise2stack/Sheet2/.DS_Store rename to exercise2/solutions/.DS_Store diff --git a/exercise2stack/Sheet2/Task1/.DS_Store b/exercise2/solutions/Task1/.DS_Store similarity index 100% rename from exercise2stack/Sheet2/Task1/.DS_Store rename to exercise2/solutions/Task1/.DS_Store diff --git a/exercise2stack/Sheet2/Task1/Main.hs b/exercise2/solutions/Task1/Main.hs similarity index 100% rename from exercise2stack/Sheet2/Task1/Main.hs rename to exercise2/solutions/Task1/Main.hs diff --git a/exercise2stack/Sheet2/Task1/Tokens.x b/exercise2/solutions/Task1/Tokens.x similarity index 100% rename from exercise2stack/Sheet2/Task1/Tokens.x rename to exercise2/solutions/Task1/Tokens.x diff --git a/exercise2stack/Sheet2/Task2/.DS_Store b/exercise2/solutions/Task2/.DS_Store similarity index 100% rename from exercise2stack/Sheet2/Task2/.DS_Store rename to exercise2/solutions/Task2/.DS_Store diff --git a/exercise2stack/Sheet2/Task2/Main.hs b/exercise2/solutions/Task2/Main.hs similarity index 100% rename from exercise2stack/Sheet2/Task2/Main.hs rename to exercise2/solutions/Task2/Main.hs diff --git a/exercise2stack/Sheet2/Task2/Tokens.x b/exercise2/solutions/Task2/Tokens.x similarity index 100% rename from exercise2stack/Sheet2/Task2/Tokens.x rename to exercise2/solutions/Task2/Tokens.x diff --git a/exercise2stack/Sheet2/Task3/.DS_Store b/exercise2/solutions/Task3/.DS_Store similarity index 100% rename from exercise2stack/Sheet2/Task3/.DS_Store rename to exercise2/solutions/Task3/.DS_Store diff --git a/exercise2stack/Sheet2/Task3/MDLTokens.x b/exercise2/solutions/Task3/MDLTokens.x similarity index 100% rename from exercise2stack/Sheet2/Task3/MDLTokens.x rename to exercise2/solutions/Task3/MDLTokens.x diff --git a/exercise2stack/Sheet2/Task3/Main.hs b/exercise2/solutions/Task3/Main.hs similarity index 100% rename from exercise2stack/Sheet2/Task3/Main.hs rename to exercise2/solutions/Task3/Main.hs diff --git a/exercise2stack/Sheet2/Task3/example.mdl b/exercise2/solutions/Task3/example.mdl similarity index 100% rename from exercise2stack/Sheet2/Task3/example.mdl rename to exercise2/solutions/Task3/example.mdl diff --git a/exercise2stack/Sheet2/Task3/exampleErr.mdl b/exercise2/solutions/Task3/exampleErr.mdl similarity index 100% rename from exercise2stack/Sheet2/Task3/exampleErr.mdl rename to exercise2/solutions/Task3/exampleErr.mdl -- GitLab