diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 595c8be..34b5766 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,14 @@ # ---> Agda -*.agdai +**.agdai MAlonzo/** +**.hi +**/*.hi +**/*.o +**/*.log +**/*.aux +**/*.dvi +**/*.agdai +Alisaie/Test # ---> Nix # Ignore build outputs from performing a nix-build or `nix build` command @@ -10,3 +18,4 @@ result-* # Ignore automatically generated direnv output .direnv +Main diff --git a/Alisaie.cf b/Alisaie.cf new file mode 100644 index 0000000..165ed7c --- /dev/null +++ b/Alisaie.cf @@ -0,0 +1,44 @@ + +Prog. Program ::= [Definition]; + +Def. Definition ::= Ident ":" Type "\n" Ident [Ident] "=" Exp; + +KStar. Kind ::= "*"; +KArr. Kind1 ::= Kind "→" Kind; +_. Kind1 ::= Kind; + +token UIdent (upper (letter | digit | '_')*); + +TString. Type1 ::= "String"; +TInt. Type1 ::= "Int"; +TDouble. Type1 ::= "Double"; +TChar. Type1 ::= "Char"; +TCustom. Type1 ::= UIdent; +TArr. Type ::= Type1 "→" Type; +TForall. Type ::= "∀" Ident ":" Kind "." Type; +TLambda. Type ::= "λ" Ident ":" Kind "." Type; + +coercions Type 1; + +terminator Definition ""; + +terminator Ident ""; + +EVar. Exp4 ::= Ident; +EInt. Exp4 ::= Integer; +EDouble. Exp4 ::= Double; +EChar. Exp4 ::= Char; +EText. Exp4 ::= String; +EApp. Exp2 ::= Exp2 Exp3; -- TODO: Fix shift reduce conflicts from these +ETApp. Exp2 ::= Exp2 Type; -- TODO: Fix shift reduce conflicts from these +EAdd. Exp1 ::= Exp1 "+" Exp2; +ESub. Exp1 ::= Exp1 "-" Exp2; +ELt. Exp1 ::= Exp1 "<" Exp2; +EIf. Exp ::= "if" Exp "then" Exp "else" Exp; +ETAbs. Exp ::= "Λ" Ident ":" Kind "." Exp; +EAbs. Exp ::= "λ" Ident ":" Type "." Exp; + +coercions Exp 4; + +comment "--"; +comment "{-" "-}"; diff --git a/Alisaie/AST.agda b/Alisaie/AST.agda new file mode 100644 index 0000000..61ef4b7 --- /dev/null +++ b/Alisaie/AST.agda @@ -0,0 +1,136 @@ +-- File generated by the BNF Converter (bnfc 2.9.6.1). + +-- Agda bindings for the Haskell abstract syntax data types. + +module Alisaie.AST where + +open import Agda.Builtin.Char using (Char) +open import Agda.Builtin.Float public using () renaming (Float to Double) +open import Agda.Builtin.Int public using () renaming (Int to Integer) +open import Agda.Builtin.Int using () renaming (pos to #pos) +open import Agda.Builtin.List using ([]; _∷_) renaming (List to #List) +open import Agda.Builtin.String using () renaming + ( String to #String + ; primStringFromList to #stringFromList + ) + +String = #List Char + +{-# FOREIGN GHC import Prelude (Bool, Char, Double, Integer, String, (.)) #-} +{-# FOREIGN GHC import qualified Data.Text #-} +{-# FOREIGN GHC import qualified Alisaie.Abs #-} +{-# FOREIGN GHC import Alisaie.Print (printTree) #-} + +data Ident : Set where + ident : #String → Ident + +{-# COMPILE GHC Ident = data Alisaie.Abs.Ident (Alisaie.Abs.Ident) #-} + +data UIdent : Set where + uIdent : #String → UIdent + +{-# COMPILE GHC UIdent = data Alisaie.Abs.UIdent (Alisaie.Abs.UIdent) #-} + +mutual + + data Program : Set where + prog : (ds : #List Definition) → Program + + {-# COMPILE GHC Program = data Alisaie.Abs.Program (Alisaie.Abs.Prog) #-} + + data Definition : Set where + def : (x₁ : Ident) (t : Type) (x₂ : Ident) (xs : #List Ident) (e : Exp) → Definition + + {-# COMPILE GHC Definition = data Alisaie.Abs.Definition (Alisaie.Abs.Def) #-} + + data Kind : Set where + kStar : Kind + kArr : (k₁ k₂ : Kind) → Kind + + {-# COMPILE GHC Kind = data Alisaie.Abs.Kind + ( Alisaie.Abs.KStar + | Alisaie.Abs.KArr + ) #-} + + data Type : Set where + tString : Type + tInt : Type + tDouble : Type + tChar : Type + tCustom : (x : UIdent) → Type + tArr : (t₁ t₂ : Type) → Type + tForall : (x : Ident) (k : Kind) (t : Type) → Type + tLambda : (x : Ident) (k : Kind) (t : Type) → Type + + {-# COMPILE GHC Type = data Alisaie.Abs.Type + ( Alisaie.Abs.TString + | Alisaie.Abs.TInt + | Alisaie.Abs.TDouble + | Alisaie.Abs.TChar + | Alisaie.Abs.TCustom + | Alisaie.Abs.TArr + | Alisaie.Abs.TForall + | Alisaie.Abs.TLambda + ) #-} + + data Exp : Set where + eVar : (x : Ident) → Exp + eInt : (x : Integer) → Exp + eDouble : (x : Double) → Exp + eChar : (x : Char) → Exp + eText : (x : String) → Exp + eApp : (e₁ e₂ : Exp) → Exp + eTApp : (e : Exp) (t : Type) → Exp + eAdd : (e₁ e₂ : Exp) → Exp + eSub : (e₁ e₂ : Exp) → Exp + eLt : (e₁ e₂ : Exp) → Exp + eIf : (e₁ e₂ e₃ : Exp) → Exp + eTAbs : (x : Ident) (k : Kind) (e : Exp) → Exp + eAbs : (x : Ident) (t : Type) (e : Exp) → Exp + + {-# COMPILE GHC Exp = data Alisaie.Abs.Exp + ( Alisaie.Abs.EVar + | Alisaie.Abs.EInt + | Alisaie.Abs.EDouble + | Alisaie.Abs.EChar + | Alisaie.Abs.EText + | Alisaie.Abs.EApp + | Alisaie.Abs.ETApp + | Alisaie.Abs.EAdd + | Alisaie.Abs.ESub + | Alisaie.Abs.ELt + | Alisaie.Abs.EIf + | Alisaie.Abs.ETAbs + | Alisaie.Abs.EAbs + ) #-} + +-- Binding the pretty printers. + +postulate + printProgram : Program → #String + printDefinition : Definition → #String + printKind : Kind → #String + printType : Type → #String + printListDefinition : #List Definition → #String + printListIdent : #List Ident → #String + printExp : Exp → #String + printIdent : Ident → #String + printChar : Char → #String + printDouble : Double → #String + printInteger : Integer → #String + printString : String → #String + printUIdent : UIdent → #String + +{-# COMPILE GHC printProgram = \ p -> Data.Text.pack (printTree (p :: Alisaie.Abs.Program)) #-} +{-# COMPILE GHC printDefinition = \ d -> Data.Text.pack (printTree (d :: Alisaie.Abs.Definition)) #-} +{-# COMPILE GHC printKind = \ k -> Data.Text.pack (printTree (k :: Alisaie.Abs.Kind)) #-} +{-# COMPILE GHC printType = \ t -> Data.Text.pack (printTree (t :: Alisaie.Abs.Type)) #-} +{-# COMPILE GHC printListDefinition = \ ds -> Data.Text.pack (printTree (ds :: [Alisaie.Abs.Definition])) #-} +{-# COMPILE GHC printListIdent = \ xs -> Data.Text.pack (printTree (xs :: [Alisaie.Abs.Ident])) #-} +{-# COMPILE GHC printExp = \ e -> Data.Text.pack (printTree (e :: Alisaie.Abs.Exp)) #-} +{-# COMPILE GHC printIdent = \ x -> Data.Text.pack (printTree (x :: Alisaie.Abs.Ident)) #-} +{-# COMPILE GHC printChar = \ x -> Data.Text.pack (printTree (x :: Char)) #-} +{-# COMPILE GHC printDouble = \ x -> Data.Text.pack (printTree (x :: Double)) #-} +{-# COMPILE GHC printInteger = \ x -> Data.Text.pack (printTree (x :: Integer)) #-} +{-# COMPILE GHC printString = \ x -> Data.Text.pack (printTree (x :: String)) #-} +{-# COMPILE GHC printUIdent = \ x -> Data.Text.pack (printTree (x :: Alisaie.Abs.UIdent)) #-} diff --git a/Alisaie/Abs.hs b/Alisaie/Abs.hs new file mode 100644 index 0000000..739d699 --- /dev/null +++ b/Alisaie/Abs.hs @@ -0,0 +1,56 @@ +-- File generated by the BNF Converter (bnfc 2.9.6.1). + +{-# LANGUAGE GeneralizedNewtypeDeriving #-} + +-- | The abstract syntax of language Alisaie. + +module Alisaie.Abs where + +import Prelude (Char, Double, Integer, String) +import qualified Prelude as C (Eq, Ord, Show, Read) +import qualified Data.String + +import qualified Data.Text + +data Program = Prog [Definition] + deriving (C.Eq, C.Ord, C.Show, C.Read) + +data Definition = Def Ident Type Ident [Ident] Exp + deriving (C.Eq, C.Ord, C.Show, C.Read) + +data Kind = KStar | KArr Kind Kind + deriving (C.Eq, C.Ord, C.Show, C.Read) + +data Type + = TString + | TInt + | TDouble + | TChar + | TCustom UIdent + | TArr Type Type + | TForall Ident Kind Type + | TLambda Ident Kind Type + deriving (C.Eq, C.Ord, C.Show, C.Read) + +data Exp + = EVar Ident + | EInt Integer + | EDouble Double + | EChar Char + | EText String + | EApp Exp Exp + | ETApp Exp Type + | EAdd Exp Exp + | ESub Exp Exp + | ELt Exp Exp + | EIf Exp Exp Exp + | ETAbs Ident Kind Exp + | EAbs Ident Type Exp + deriving (C.Eq, C.Ord, C.Show, C.Read) + +newtype Ident = Ident Data.Text.Text + deriving (C.Eq, C.Ord, C.Show, C.Read, Data.String.IsString) + +newtype UIdent = UIdent Data.Text.Text + deriving (C.Eq, C.Ord, C.Show, C.Read, Data.String.IsString) + diff --git a/Alisaie/Doc.txt b/Alisaie/Doc.txt new file mode 100644 index 0000000..406f0cb --- /dev/null +++ b/Alisaie/Doc.txt @@ -0,0 +1,105 @@ +The Language Alisaie +BNF Converter + + +%Process by txt2tags to generate html or latex + + + +This document was automatically generated by the //BNF-Converter//. It was generated together with the lexer, the parser, and the abstract syntax module, which guarantees that the document matches with the implementation of the language (provided no hand-hacking has taken place). + +==The lexical structure of Alisaie== +===Identifiers=== +Identifiers //Ident// are unquoted strings beginning with a letter, +followed by any combination of letters, digits, and the characters ``_ '`` +reserved words excluded. + + +===Literals=== +Character literals //Char// have the form +``'``//c//``'``, where //c// is any single character. + + +Double-precision float literals //Double// have the structure +indicated by the regular expression ``digit+ '.' digit+ ('e' ('-')? digit+)?`` i.e.\ +two sequences of digits separated by a decimal point, optionally +followed by an unsigned or negative exponent. + + +Integer literals //Integer// are nonempty sequences of digits. + + +String literals //String// have the form +``"``//x//``"``}, where //x// is any sequence of any characters +except ``"`` unless preceded by ``\``. + + + + +UIdent literals are recognized by the regular expression +`````upper ('_' | digit | letter)*````` + + +===Reserved words and symbols=== +The set of reserved words is the set of terminals appearing in the grammar. Those reserved words that consist of non-letter characters are called symbols, and they are treated in a different way from those that are similar to identifiers. The lexer follows rules familiar from languages like Haskell, C, and Java, including longest match and spacing conventions. + +The reserved words used in Alisaie are the following: + | ``Char`` | ``Double`` | ``Int`` | ``String`` + | ``else`` | ``if`` | ``then`` | ``Λ`` + | ``λ`` | | | + +The symbols used in Alisaie are the following: + | : | = | * | → + | ∀ | . | ( | ) + | + | - | < | + +===Comments=== +Single-line comments begin with --.Multiple-line comments are enclosed with {- and -}. + +==The syntactic structure of Alisaie== +Non-terminals are enclosed between < and >. +The symbols -> (production), **|** (union) +and **eps** (empty rule) belong to the BNF notation. +All other symbols are terminals. + + | //Program// | -> | //[Definition]// + | //Definition// | -> | //Ident// ``:`` //Type// //Ident// //[Ident]// ``=`` //Exp// + | //Kind// | -> | ``*`` + | //Kind1// | -> | //Kind// ``→`` //Kind// + | | **|** | //Kind// + | //Type1// | -> | ``String`` + | | **|** | ``Int`` + | | **|** | ``Double`` + | | **|** | ``Char`` + | | **|** | //UIdent// + | | **|** | ``(`` //Type// ``)`` + | //Type// | -> | //Type1// ``→`` //Type// + | | **|** | ``∀`` //Ident// ``:`` //Kind// ``.`` //Type// + | | **|** | ``λ`` //Ident// ``:`` //Kind// ``.`` //Type// + | | **|** | //Type1// + | //[Definition]// | -> | **eps** + | | **|** | //Definition// //[Definition]// + | //[Ident]// | -> | **eps** + | | **|** | //Ident// //[Ident]// + | //Exp4// | -> | //Ident// + | | **|** | //Integer// + | | **|** | //Double// + | | **|** | //Char// + | | **|** | //String// + | | **|** | ``(`` //Exp// ``)`` + | //Exp2// | -> | //Exp2// //Exp3// + | | **|** | //Exp2// //Type// + | | **|** | //Exp3// + | //Exp1// | -> | //Exp1// ``+`` //Exp2// + | | **|** | //Exp1// ``-`` //Exp2// + | | **|** | //Exp1// ``<`` //Exp2// + | | **|** | //Exp2// + | //Exp// | -> | ``if`` //Exp// ``then`` //Exp// ``else`` //Exp// + | | **|** | ``Λ`` //Ident// ``:`` //Kind// ``.`` //Exp// + | | **|** | ``λ`` //Ident// ``:`` //Type// ``.`` //Exp// + | | **|** | //Exp1// + | //Exp3// | -> | //Exp4// + + + +%% File generated by the BNF Converter (bnfc 2.9.6.1). diff --git a/Alisaie/ErrM.hs b/Alisaie/ErrM.hs new file mode 100644 index 0000000..9c8d984 --- /dev/null +++ b/Alisaie/ErrM.hs @@ -0,0 +1,44 @@ +-- File generated by the BNF Converter (bnfc 2.9.6.1). + +{-# LANGUAGE CPP #-} + +-- | BNF Converter: Error Monad. +-- +-- Module for backwards compatibility. +-- +-- The generated parser now uses @'Either' String@ as error monad. +-- This module defines a type synonym 'Err' and pattern synonyms +-- 'Bad' and 'Ok' for 'Left' and 'Right'. + +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE FlexibleInstances #-} + +module Alisaie.ErrM where + +import Prelude (id, const, Either(..), String) + +import Control.Monad (MonadPlus(..)) +import Control.Applicative (Alternative(..)) +#if __GLASGOW_HASKELL__ >= 808 +import Control.Monad (MonadFail(..)) +#endif + +-- | Error monad with 'String' error messages. +type Err = Either String + +pattern Bad msg = Left msg +pattern Ok a = Right a + +#if __GLASGOW_HASKELL__ >= 808 +instance MonadFail Err where + fail = Bad +#endif + +instance Alternative Err where + empty = Left "Err.empty" + (<|>) Left{} = id + (<|>) x@Right{} = const x + +instance MonadPlus Err where + mzero = empty + mplus = (<|>) diff --git a/Alisaie/IOLib.agda b/Alisaie/IOLib.agda new file mode 100644 index 0000000..d611d4e --- /dev/null +++ b/Alisaie/IOLib.agda @@ -0,0 +1,56 @@ +-- File generated by the BNF Converter (bnfc 2.9.6.1). + +-- Basic I/O library. + +module Alisaie.IOLib where + +open import Agda.Builtin.IO public using (IO) +open import Agda.Builtin.List public using (List; []; _∷_) +open import Agda.Builtin.String public using (String) + renaming (primStringFromList to stringFromList) +open import Agda.Builtin.Unit public using (⊤) + +-- I/O monad. + +postulate + return : ∀ {a} {A : Set a} → A → IO A + _>>=_ : ∀ {a b} {A : Set a} {B : Set b} → IO A → (A → IO B) → IO B + +{-# COMPILE GHC return = \ _ _ -> return #-} +{-# COMPILE GHC _>>=_ = \ _ _ _ _ -> (>>=) #-} + +infixl 1 _>>=_ _>>_ + +_>>_ : ∀ {b} {B : Set b} → IO ⊤ → IO B → IO B +_>>_ = λ m m' → m >>= λ _ → m' + +-- Co-bind and functoriality. + +infixr 1 _=<<_ _<$>_ + +_=<<_ : ∀ {a b} {A : Set a} {B : Set b} → (A → IO B) → IO A → IO B +k =<< m = m >>= k + +_<$>_ : ∀ {a b} {A : Set a} {B : Set b} → (A → B) → IO A → IO B +f <$> m = do + a ← m + return (f a) + +-- Binding basic I/O functionality. + +{-# FOREIGN GHC import qualified Data.Text #-} +{-# FOREIGN GHC import qualified Data.Text.IO #-} +{-# FOREIGN GHC import qualified System.Exit #-} +{-# FOREIGN GHC import qualified System.Environment #-} +{-# FOREIGN GHC import qualified System.IO #-} + +postulate + exitFailure : ∀{a} {A : Set a} → IO A + getArgs : IO (List String) + putStrLn : String → IO ⊤ + readFiniteFile : String → IO String + +{-# COMPILE GHC exitFailure = \ _ _ -> System.Exit.exitFailure #-} +{-# COMPILE GHC getArgs = fmap (map Data.Text.pack) System.Environment.getArgs #-} +{-# COMPILE GHC putStrLn = System.IO.putStrLn . Data.Text.unpack #-} +{-# COMPILE GHC readFiniteFile = Data.Text.IO.readFile . Data.Text.unpack #-} diff --git a/Alisaie/Lex.hs b/Alisaie/Lex.hs new file mode 100644 index 0000000..0a088ad --- /dev/null +++ b/Alisaie/Lex.hs @@ -0,0 +1,564 @@ +{-# OPTIONS_GHC -fno-warn-missing-signatures #-} +{-# OPTIONS_GHC -fno-warn-tabs #-} +{-# OPTIONS_GHC -fno-warn-unused-binds #-} +{-# OPTIONS_GHC -fno-warn-unused-imports #-} +{-# LANGUAGE CPP #-} +{-# LANGUAGE MagicHash #-} +{-# LINE 4 "Alisaie/Lex.x" #-} +{-# OPTIONS -Wno-incomplete-patterns #-} +{-# OPTIONS_GHC -w #-} + +{-# LANGUAGE PatternSynonyms #-} + +module Alisaie.Lex where + +import Prelude + +import qualified Data.Text +import qualified Data.Bits +import Data.Char (ord) +import Data.Function (on) +import Data.Word (Word8) +#include "ghcconfig.h" +import qualified Data.Array +import qualified Data.Char +import Data.Array.Base (unsafeAt) +import GHC.Exts (Addr#,Int#,Int(I#),(*#),(+#),(-#),(==#),(>=#),indexCharOffAddr#,indexInt16OffAddr#,indexInt32OffAddr#,int2Word#,narrow16Int#,narrow32Int#,negateInt#,or#,ord#,uncheckedShiftL#,word2Int#) +import qualified GHC.Exts +alex_tab_size :: Int +alex_tab_size = 8 +alex_base :: AlexAddr +alex_base = AlexA# + "\xf8\xff\xff\xff\xdb\x00\x00\x00\xb4\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x74\xff\xff\xff\xdc\x00\x00\x00\x1c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x01\x00\x00\x9d\x01\x00\x00\x1d\x02\x00\x00\xe0\xff\xff\xff\xd8\xff\xff\xff\xe5\xff\xff\xff\x8c\x00\x00\x00\x9a\x00\x00\x00\xe6\xff\xff\xff\xf6\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\x02\x00\x00\x1d\x03\x00\x00\x5d\x03\x00\x00\x53\x04\x00\x00\x00\x00\x00\x00\xc4\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x05\x00\x00\xd7\x05\x00\x00\x48\x06\x00\x00\x45\x05\x00\x00\x00\x00\x00\x00\x89\x06\x00\x00\xfa\x06\x00\x00\x3b\x07\x00\x00\x0e\x08\x00\x00\xe7\x08\x00\x00\xee\x02\x00\x00\xf8\x02\x00\x00\x04\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x09\x00\x00\x23\x0a\x00\x00\x00\x00\x00\x00\x35\x03\x00\x00\x00\x00\x00\x00\x74\x0a\x00\x00\x3c\x04\x00\x00\x74\x0b\x00\x00\xf4\x0b\x00\x00\x74\x0c\x00\x00\x75\x0c\x00\x00\xf5\x0c\x00\x00\x75\x0d\x00\x00\xf5\x0d\x00\x00\x75\x0e\x00\x00\xf5\x0e\x00\x00\x8e\xff\xff\xff\xbc\x07\x00\x00\x95\xff\xff\xff\x7c\xff\xff\xff"# + +alex_table :: AlexAddr +alex_table = AlexA# + "\x00\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x31\x00\x2d\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x34\x00\x21\x00\x06\x00\x31\x00\x41\x00\x31\x00\x32\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x29\x00\x31\x00\x31\x00\x31\x00\x31\x00\x00\x00\x10\x00\x31\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x31\x00\x00\x00\x31\x00\x31\x00\x00\x00\x31\x00\x00\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\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\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x13\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x42\x00\x11\x00\x00\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\x00\x00\x00\x00\x00\x00\x3f\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\x00\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x00\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x02\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\x0d\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x01\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x0e\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x0f\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x0e\x00\x19\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\x1a\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\x1b\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x35\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x37\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x1a\x00\x3c\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x19\x00\x3b\x00\x15\x00\x15\x00\x15\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\x27\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\x28\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x36\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x23\x00\x3e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x25\x00\x3d\x00\x1c\x00\x1c\x00\x1c\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x25\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\x23\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\x0b\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\x20\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\x28\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x00\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x00\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x33\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\x36\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x23\x00\x3e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x25\x00\x3d\x00\x1c\x00\x1c\x00\x1c\x00\x22\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x38\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x20\x00\x39\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\x27\x00\x3a\x00\x09\x00\x09\x00\x09\x00\x1d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2f\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\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\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\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\x2f\x00\x00\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\x00\x2f\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\xff\xff\x00\x00\x00\x00\x00\x00\x30\x00\x08\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x01\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x05\x00\x02\x00\x0d\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x04\x00\x0b\x00\x0c\x00\x03\x00\x03\x00\x03\x00\x26\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\x00\x00\x38\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x24\x00\x39\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\x3c\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x37\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x3e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x1e\x00\x36\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00\x1f\x00"# + +alex_check :: AlexAddr +alex_check = AlexA# + "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x92\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x2d\x00\x2d\x00\x86\x00\x80\x00\x88\x00\x9b\x00\x20\x00\xff\xff\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\xff\xff\x2d\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\x3a\x00\xff\xff\x3c\x00\x3d\x00\xff\xff\xbb\x00\xff\xff\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\xff\xff\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\x7b\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc3\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xce\x00\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\xe2\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\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\xff\xff\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\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\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\xff\xff\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\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\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\x27\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\x2e\x00\xff\xff\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\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\x5c\x00\xff\xff\xff\xff\x20\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\x65\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\xff\xff\x74\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\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\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\x0a\x00\x22\x00\xff\xff\xff\xff\xff\xff\xff\xff\x27\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\x22\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\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x66\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\x72\x00\x5c\x00\x74\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\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\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\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\x2d\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\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\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\x2d\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\xff\xff\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\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\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\x7d\x00\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\x27\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\x5c\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\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\x27\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x0a\x00\xff\xff\xff\xff\xff\xff\x5f\x00\xc3\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\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\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\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\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\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\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"# + +alex_deflt :: AlexAddr +alex_deflt = AlexA# + "\xff\xff\x34\x00\x34\x00\x04\x00\x05\x00\x34\x00\xff\xff\xff\xff\xff\xff\x0a\x00\x24\x00\x05\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x16\x00\x17\x00\x1b\x00\x16\x00\x17\x00\x1b\x00\x1b\x00\x1e\x00\x0a\x00\x1f\x00\x21\x00\x0e\x00\x21\x00\x1e\x00\x21\x00\x0e\x00\x1f\x00\x04\x00\x24\x00\x21\x00\x0e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\xff\xff\x21\x00\x1b\x00\x0e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# + +alex_accept = Data.Array.listArray (0 :: Int, 66) + [ AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAcc 8 + , 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 + , AlexAcc 7 + , AlexAcc 6 + , AlexAcc 5 + , AlexAcc 4 + , AlexAcc 3 + , AlexAcc 2 + , AlexAcc 1 + , AlexAcc 0 + , AlexAccSkip + , AlexAccSkip + , AlexAccSkip + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + , AlexAccNone + ] + +alex_actions = Data.Array.array (0 :: Int, 9) + [ (8,alex_action_3) + , (7,alex_action_9) + , (6,alex_action_9) + , (5,alex_action_8) + , (4,alex_action_7) + , (3,alex_action_6) + , (2,alex_action_5) + , (1,alex_action_4) + , (0,alex_action_3) + ] + +alex_action_3 = tok (eitherResIdent TV) +alex_action_4 = tok (eitherResIdent T_UIdent) +alex_action_5 = tok (eitherResIdent TV) +alex_action_6 = tok (TL . unescapeInitTail) +alex_action_7 = tok TC +alex_action_8 = tok TI +alex_action_9 = tok TD + +#define ALEX_GHC 1 +#define ALEX_NOPRED 1 +-- ----------------------------------------------------------------------------- +-- 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 + +#ifdef ALEX_GHC +# define ILIT(n) n# +# define IBOX(n) (I# (n)) +# define FAST_INT Int# +-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex. +# if __GLASGOW_HASKELL__ > 706 +# define CMP_GEQ(n,m) (((n) >=# (m)) :: Int#) +# define CMP_EQ(n,m) (((n) ==# (m)) :: Int#) +# define CMP_MKBOOL(x) ((GHC.Exts.tagToEnum# (x)) :: Bool) +# else +# define CMP_GEQ(n,m) (((n) >= (m)) :: Bool) +# define CMP_EQ(n,m) (((n) == (m)) :: Bool) +# define CMP_MKBOOL(x) ((x) :: Bool) +# endif +# define GTE(n,m) CMP_MKBOOL(CMP_GEQ(n,m)) +# define EQ(n,m) CMP_MKBOOL(CMP_EQ(n,m)) +# define PLUS(n,m) (n +# m) +# define MINUS(n,m) (n -# m) +# define TIMES(n,m) (n *# m) +# define NEGATE(n) (negateInt# (n)) +# define IF_GHC(x) (x) +#else +# define ILIT(n) (n) +# define IBOX(n) (n) +# define FAST_INT Int +# define GTE(n,m) (n >= m) +# define EQ(n,m) (n == m) +# define PLUS(n,m) (n + m) +# define MINUS(n,m) (n - m) +# define TIMES(n,m) (n * m) +# define NEGATE(n) (negate (n)) +# define IF_GHC(x) +#endif + +#ifdef ALEX_GHC +data AlexAddr = AlexA# Addr# +-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex. + +{-# INLINE alexIndexInt16OffAddr #-} +alexIndexInt16OffAddr :: AlexAddr -> Int# -> Int# +alexIndexInt16OffAddr (AlexA# arr) off = +#if __GLASGOW_HASKELL__ >= 901 + GHC.Exts.int16ToInt# -- qualified import because it doesn't exist on older GHC's +#endif +#ifdef WORDS_BIGENDIAN + (GHC.Exts.word16ToInt16# (GHC.Exts.wordToWord16# (GHC.Exts.byteSwap16# (GHC.Exts.word16ToWord# (GHC.Exts.int16ToWord16# +#endif + (indexInt16OffAddr# arr off) +#ifdef WORDS_BIGENDIAN + ))))) +#endif +#else +alexIndexInt16OffAddr = (Data.Array.!) +#endif + +#ifdef ALEX_GHC +{-# INLINE alexIndexInt32OffAddr #-} +alexIndexInt32OffAddr :: AlexAddr -> Int# -> Int# +alexIndexInt32OffAddr (AlexA# arr) off = +#if __GLASGOW_HASKELL__ >= 901 + GHC.Exts.int32ToInt# -- qualified import because it doesn't exist on older GHC's +#endif +#ifdef WORDS_BIGENDIAN + (GHC.Exts.word32ToInt32# (GHC.Exts.wordToWord32# (GHC.Exts.byteSwap32# (GHC.Exts.word32ToWord# (GHC.Exts.int32ToWord32# +#endif + (indexInt32OffAddr# arr off) +#ifdef WORDS_BIGENDIAN + ))))) +#endif +#else +alexIndexInt32OffAddr = (Data.Array.!) +#endif + +#ifdef ALEX_GHC +-- GHC >= 503, unsafeAt is available from Data.Array.Base. +quickIndex = unsafeAt +#else +quickIndex = (Data.Array.!) +#endif + +-- ----------------------------------------------------------------------------- +-- Main lexing routines + +data AlexReturn a + = AlexEOF + | AlexError !AlexInput + | AlexSkip !AlexInput !Int + | AlexToken !AlexInput !Int a + +-- alexScan :: AlexInput -> StartCode -> AlexReturn a +alexScan input__ IBOX(sc) + = alexScanUser (error "alex rule requiring context was invoked by alexScan; use alexScanUser instead?") input__ IBOX(sc) + +-- If the generated alexScan/alexScanUser functions are called multiple times +-- in the same file, alexScanUser gets broken out into a separate function and +-- increases memory usage. Make sure GHC inlines this function and optimizes it. +{-# INLINE alexScanUser #-} + +alexScanUser user__ input__ IBOX(sc) + = case alex_scan_tkn user__ input__ ILIT(0) input__ sc AlexNone of + (AlexNone, input__') -> + case alexGetByte input__ of + Nothing -> +#ifdef ALEX_DEBUG + Debug.Trace.trace ("End of input.") $ +#endif + AlexEOF + Just _ -> +#ifdef ALEX_DEBUG + Debug.Trace.trace ("Error.") $ +#endif + AlexError input__' + + (AlexLastSkip input__'' len, _) -> +#ifdef ALEX_DEBUG + Debug.Trace.trace ("Skipping.") $ +#endif + AlexSkip input__'' len + + (AlexLastAcc k input__''' len, _) -> +#ifdef ALEX_DEBUG + Debug.Trace.trace ("Accept.") $ +#endif + AlexToken input__''' len ((Data.Array.!) 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` IBOX(s))) + in + new_acc `seq` + case alexGetByte input__ of + Nothing -> (new_acc, input__) + Just (c, new_input) -> +#ifdef ALEX_DEBUG + Debug.Trace.trace ("State: " ++ show IBOX(s) ++ ", char: " ++ show c ++ " " ++ (show . Data.Char.chr . fromIntegral) c) $ +#endif + case fromIntegral c of { IBOX(ord_c) -> + let + base = alexIndexInt32OffAddr alex_base s + offset = PLUS(base,ord_c) + + new_s = if GTE(offset,ILIT(0)) + && let check = alexIndexInt16OffAddr alex_check offset + in EQ(check,ord_c) + then alexIndexInt16OffAddr alex_table offset + else alexIndexInt16OffAddr alex_deflt s + in + case new_s of + ILIT(-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 +#ifdef ALEX_LATIN1 + PLUS(len,ILIT(1)) + -- issue 119: in the latin1 encoding, *each* byte is one character +#else + (if c < 0x80 || c >= 0xC0 then PLUS(len,ILIT(1)) else len) + -- note that the length is increased ONLY if this is the 1st byte in a char encoding) +#endif + new_input new_s new_acc + } + where + check_accs (AlexAccNone) = last_acc + check_accs (AlexAcc a ) = AlexLastAcc a input__ IBOX(len) + check_accs (AlexAccSkip) = AlexLastSkip input__ IBOX(len) +#ifndef ALEX_NOPRED + check_accs (AlexAccPred a predx rest) + | predx user__ orig_input IBOX(len) input__ + = AlexLastAcc a input__ IBOX(len) + | otherwise + = check_accs rest + check_accs (AlexAccSkipPred predx rest) + | predx user__ orig_input IBOX(len) input__ + = AlexLastSkip input__ IBOX(len) + | otherwise + = check_accs rest +#endif + +data AlexLastAcc + = AlexNone + | AlexLastAcc !Int !AlexInput !Int + | AlexLastSkip !AlexInput !Int + +data AlexAcc user + = AlexAccNone + | AlexAcc Int + | AlexAccSkip +#ifndef ALEX_NOPRED + | 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 Data.Array.! alexInputPrevChar input__ + +--alexRightContext :: Int -> AlexAccPred _ +alexRightContext IBOX(sc) user__ _ _ input__ = + case alex_scan_tkn user__ input__ ILIT(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. +#endif +{-# LINE 73 "Alisaie/Lex.x" #-} +-- | Create a token with position. +tok :: (Data.Text.Text -> Tok) -> (Posn -> Data.Text.Text -> Token) +tok f p = PT p . f + +-- | Token without position. +data Tok + = TK {-# UNPACK #-} !TokSymbol -- ^ Reserved word or symbol. + | TL !Data.Text.Text -- ^ String literal. + | TI !Data.Text.Text -- ^ Integer literal. + | TV !Data.Text.Text -- ^ Identifier. + | TD !Data.Text.Text -- ^ Float literal. + | TC !Data.Text.Text -- ^ Character literal. + | T_UIdent !Data.Text.Text + deriving (Eq, Show, Ord) + +-- | Smart constructor for 'Tok' for the sake of backwards compatibility. +pattern TS :: Data.Text.Text -> Int -> Tok +pattern TS t i = TK (TokSymbol t i) + +-- | Keyword or symbol tokens have a unique ID. +data TokSymbol = TokSymbol + { tsText :: Data.Text.Text + -- ^ Keyword or symbol text. + , tsID :: !Int + -- ^ Unique ID. + } deriving (Show) + +-- | Keyword/symbol equality is determined by the unique ID. +instance Eq TokSymbol where (==) = (==) `on` tsID + +-- | Keyword/symbol ordering is determined by the unique ID. +instance Ord TokSymbol where compare = compare `on` tsID + +-- | Token with position. +data Token + = PT Posn Tok + | Err Posn + deriving (Eq, Show, Ord) + +-- | Pretty print a position. +printPosn :: Posn -> String +printPosn (Pn _ l c) = "line " ++ show l ++ ", column " ++ show c + +-- | Pretty print the position of the first token in the list. +tokenPos :: [Token] -> String +tokenPos (t:_) = printPosn (tokenPosn t) +tokenPos [] = "end of file" + +-- | Get the position of a token. +tokenPosn :: Token -> Posn +tokenPosn (PT p _) = p +tokenPosn (Err p) = p + +-- | Get line and column of a token. +tokenLineCol :: Token -> (Int, Int) +tokenLineCol = posLineCol . tokenPosn + +-- | Get line and column of a position. +posLineCol :: Posn -> (Int, Int) +posLineCol (Pn _ l c) = (l,c) + +-- | Convert a token into "position token" form. +mkPosToken :: Token -> ((Int, Int), Data.Text.Text) +mkPosToken t = (tokenLineCol t, tokenText t) + +-- | Convert a token to its text. +tokenText :: Token -> Data.Text.Text +tokenText t = case t of + PT _ (TS s _) -> s + PT _ (TL s) -> Data.Text.pack (show s) + PT _ (TI s) -> s + PT _ (TV s) -> s + PT _ (TD s) -> s + PT _ (TC s) -> s + Err _ -> Data.Text.pack "#error" + PT _ (T_UIdent s) -> s + +-- | Convert a token to a string. +prToken :: Token -> String +prToken t = Data.Text.unpack (tokenText t) + +-- | Finite map from text to token organized as binary search tree. +data BTree + = N -- ^ Nil (leaf). + | B Data.Text.Text Tok BTree BTree + -- ^ Binary node. + deriving (Show) + +-- | Convert potential keyword into token or use fallback conversion. +eitherResIdent :: (Data.Text.Text -> Tok) -> Data.Text.Text -> Tok +eitherResIdent tv s = treeFind resWords + where + treeFind N = tv s + treeFind (B a t left right) = + case compare s a of + LT -> treeFind left + GT -> treeFind right + EQ -> t + +-- | The keywords and symbols of the language organized as binary search tree. +resWords :: BTree +resWords = + b "Double" 11 + (b "." 6 + (b "*" 3 (b ")" 2 (b "(" 1 N N) N) (b "-" 5 (b "+" 4 N N) N)) + (b "=" 9 (b "<" 8 (b ":" 7 N N) N) (b "Char" 10 N N))) + (b "then" 16 + (b "else" 14 (b "String" 13 (b "Int" 12 N N) N) (b "if" 15 N N)) + (b "\8594" 19 + (b "\955" 18 (b "\923" 17 N N) N) (b "\8704" 20 N N))) + where + b s n = B bs (TS bs n) + where + bs = Data.Text.pack s + +-- | Unquote string literal. +unescapeInitTail :: Data.Text.Text -> Data.Text.Text +unescapeInitTail = Data.Text.pack . unesc . tail . Data.Text.unpack + where + unesc s = case s of + '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs + '\\':'n':cs -> '\n' : unesc cs + '\\':'t':cs -> '\t' : unesc cs + '\\':'r':cs -> '\r' : unesc cs + '\\':'f':cs -> '\f' : unesc cs + '"':[] -> [] + c:cs -> c : unesc cs + _ -> [] + +------------------------------------------------------------------- +-- Alex wrapper code. +-- A modified "posn" wrapper. +------------------------------------------------------------------- + +data Posn = Pn !Int !Int !Int + deriving (Eq, Show, Ord) + +alexStartPos :: Posn +alexStartPos = Pn 0 1 1 + +alexMove :: Posn -> Char -> Posn +alexMove (Pn a l c) '\t' = Pn (a+1) l (((c+7) `div` 8)*8+1) +alexMove (Pn a l c) '\n' = Pn (a+1) (l+1) 1 +alexMove (Pn a l c) _ = Pn (a+1) l (c+1) + +type Byte = Word8 + +type AlexInput = (Posn, -- current position, + Char, -- previous char + [Byte], -- pending bytes on the current char + Data.Text.Text) -- current input string + +tokens :: Data.Text.Text -> [Token] +tokens str = go (alexStartPos, '\n', [], str) + where + go :: AlexInput -> [Token] + go inp@(pos, _, _, str) = + case alexScan inp 0 of + AlexEOF -> [] + AlexError (pos, _, _, _) -> [Err pos] + AlexSkip inp' len -> go inp' + AlexToken inp' len act -> act pos (Data.Text.take len str) : (go inp') + +alexGetByte :: AlexInput -> Maybe (Byte,AlexInput) +alexGetByte (p, c, (b:bs), s) = Just (b, (p, c, bs, s)) +alexGetByte (p, _, [], s) = + case Data.Text.uncons s of + Nothing -> Nothing + Just (c,s) -> + let p' = alexMove p c + (b:bs) = utf8Encode c + in p' `seq` Just (b, (p', c, bs, s)) + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar (p, c, bs, s) = c + +-- | 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 + ] diff --git a/Alisaie/Lex.x b/Alisaie/Lex.x new file mode 100644 index 0000000..ff28e10 --- /dev/null +++ b/Alisaie/Lex.x @@ -0,0 +1,270 @@ +-- -*- haskell -*- File generated by the BNF Converter (bnfc 2.9.6.1). + +-- Lexer definition for use with Alex 3 +{ +{-# OPTIONS -Wno-incomplete-patterns #-} +{-# OPTIONS_GHC -w #-} + +{-# LANGUAGE PatternSynonyms #-} + +module Alisaie.Lex where + +import Prelude + +import qualified Data.Text +import qualified Data.Bits +import Data.Char (ord) +import Data.Function (on) +import Data.Word (Word8) +} + +-- Predefined character classes + +$c = [A-Z\192-\222] # [\215] -- capital isolatin1 letter (215 = \times) +$s = [a-z\223-\255] # [\247] -- small isolatin1 letter (247 = \div ) +$l = [$c $s] -- letter +$d = [0-9] -- digit +$i = [$l $d _ '] -- identifier character +$u = [. \n] -- universal: any character + +-- Symbols and non-identifier-like reserved words + +@rsyms = \λ | \Λ | \: | \= | \* | \→ | \∀ | \. | \( | \) | \+ | \- | \< + +:- + +-- Line comment "--" +"--" [.]* ; + +-- Block comment "{-" "-}" +\{ \- [$u # \-]* \- ([$u # [\- \}]] [$u # \-]* \- | \-)* \} ; + +-- Whitespace (skipped) +$white+ ; + +-- Symbols +@rsyms + { tok (eitherResIdent TV) } + +-- token UIdent +$c (\_ | ($d | $l)) * + { tok (eitherResIdent T_UIdent) } + +-- Keywords and Ident +$l $i* + { tok (eitherResIdent TV) } + +-- String +\" ([$u # [\" \\ \n]] | (\\ (\" | \\ | \' | n | t | r | f)))* \" + { tok (TL . unescapeInitTail) } + +-- Char +\' ($u # [\' \\] | \\ [\\ \' n t r f]) \' + { tok TC } + +-- Integer +$d+ + { tok TI } + +-- Double +$d+ \. $d+ (e (\-)? $d+)? + { tok TD } + +{ +-- | Create a token with position. +tok :: (Data.Text.Text -> Tok) -> (Posn -> Data.Text.Text -> Token) +tok f p = PT p . f + +-- | Token without position. +data Tok + = TK {-# UNPACK #-} !TokSymbol -- ^ Reserved word or symbol. + | TL !Data.Text.Text -- ^ String literal. + | TI !Data.Text.Text -- ^ Integer literal. + | TV !Data.Text.Text -- ^ Identifier. + | TD !Data.Text.Text -- ^ Float literal. + | TC !Data.Text.Text -- ^ Character literal. + | T_UIdent !Data.Text.Text + deriving (Eq, Show, Ord) + +-- | Smart constructor for 'Tok' for the sake of backwards compatibility. +pattern TS :: Data.Text.Text -> Int -> Tok +pattern TS t i = TK (TokSymbol t i) + +-- | Keyword or symbol tokens have a unique ID. +data TokSymbol = TokSymbol + { tsText :: Data.Text.Text + -- ^ Keyword or symbol text. + , tsID :: !Int + -- ^ Unique ID. + } deriving (Show) + +-- | Keyword/symbol equality is determined by the unique ID. +instance Eq TokSymbol where (==) = (==) `on` tsID + +-- | Keyword/symbol ordering is determined by the unique ID. +instance Ord TokSymbol where compare = compare `on` tsID + +-- | Token with position. +data Token + = PT Posn Tok + | Err Posn + deriving (Eq, Show, Ord) + +-- | Pretty print a position. +printPosn :: Posn -> String +printPosn (Pn _ l c) = "line " ++ show l ++ ", column " ++ show c + +-- | Pretty print the position of the first token in the list. +tokenPos :: [Token] -> String +tokenPos (t:_) = printPosn (tokenPosn t) +tokenPos [] = "end of file" + +-- | Get the position of a token. +tokenPosn :: Token -> Posn +tokenPosn (PT p _) = p +tokenPosn (Err p) = p + +-- | Get line and column of a token. +tokenLineCol :: Token -> (Int, Int) +tokenLineCol = posLineCol . tokenPosn + +-- | Get line and column of a position. +posLineCol :: Posn -> (Int, Int) +posLineCol (Pn _ l c) = (l,c) + +-- | Convert a token into "position token" form. +mkPosToken :: Token -> ((Int, Int), Data.Text.Text) +mkPosToken t = (tokenLineCol t, tokenText t) + +-- | Convert a token to its text. +tokenText :: Token -> Data.Text.Text +tokenText t = case t of + PT _ (TS s _) -> s + PT _ (TL s) -> Data.Text.pack (show s) + PT _ (TI s) -> s + PT _ (TV s) -> s + PT _ (TD s) -> s + PT _ (TC s) -> s + Err _ -> Data.Text.pack "#error" + PT _ (T_UIdent s) -> s + +-- | Convert a token to a string. +prToken :: Token -> String +prToken t = Data.Text.unpack (tokenText t) + +-- | Finite map from text to token organized as binary search tree. +data BTree + = N -- ^ Nil (leaf). + | B Data.Text.Text Tok BTree BTree + -- ^ Binary node. + deriving (Show) + +-- | Convert potential keyword into token or use fallback conversion. +eitherResIdent :: (Data.Text.Text -> Tok) -> Data.Text.Text -> Tok +eitherResIdent tv s = treeFind resWords + where + treeFind N = tv s + treeFind (B a t left right) = + case compare s a of + LT -> treeFind left + GT -> treeFind right + EQ -> t + +-- | The keywords and symbols of the language organized as binary search tree. +resWords :: BTree +resWords = + b "Double" 11 + (b "." 6 + (b "*" 3 (b ")" 2 (b "(" 1 N N) N) (b "-" 5 (b "+" 4 N N) N)) + (b "=" 9 (b "<" 8 (b ":" 7 N N) N) (b "Char" 10 N N))) + (b "then" 16 + (b "else" 14 (b "String" 13 (b "Int" 12 N N) N) (b "if" 15 N N)) + (b "\8594" 19 + (b "\955" 18 (b "\923" 17 N N) N) (b "\8704" 20 N N))) + where + b s n = B bs (TS bs n) + where + bs = Data.Text.pack s + +-- | Unquote string literal. +unescapeInitTail :: Data.Text.Text -> Data.Text.Text +unescapeInitTail = Data.Text.pack . unesc . tail . Data.Text.unpack + where + unesc s = case s of + '\\':c:cs | elem c ['\"', '\\', '\''] -> c : unesc cs + '\\':'n':cs -> '\n' : unesc cs + '\\':'t':cs -> '\t' : unesc cs + '\\':'r':cs -> '\r' : unesc cs + '\\':'f':cs -> '\f' : unesc cs + '"':[] -> [] + c:cs -> c : unesc cs + _ -> [] + +------------------------------------------------------------------- +-- Alex wrapper code. +-- A modified "posn" wrapper. +------------------------------------------------------------------- + +data Posn = Pn !Int !Int !Int + deriving (Eq, Show, Ord) + +alexStartPos :: Posn +alexStartPos = Pn 0 1 1 + +alexMove :: Posn -> Char -> Posn +alexMove (Pn a l c) '\t' = Pn (a+1) l (((c+7) `div` 8)*8+1) +alexMove (Pn a l c) '\n' = Pn (a+1) (l+1) 1 +alexMove (Pn a l c) _ = Pn (a+1) l (c+1) + +type Byte = Word8 + +type AlexInput = (Posn, -- current position, + Char, -- previous char + [Byte], -- pending bytes on the current char + Data.Text.Text) -- current input string + +tokens :: Data.Text.Text -> [Token] +tokens str = go (alexStartPos, '\n', [], str) + where + go :: AlexInput -> [Token] + go inp@(pos, _, _, str) = + case alexScan inp 0 of + AlexEOF -> [] + AlexError (pos, _, _, _) -> [Err pos] + AlexSkip inp' len -> go inp' + AlexToken inp' len act -> act pos (Data.Text.take len str) : (go inp') + +alexGetByte :: AlexInput -> Maybe (Byte,AlexInput) +alexGetByte (p, c, (b:bs), s) = Just (b, (p, c, bs, s)) +alexGetByte (p, _, [], s) = + case Data.Text.uncons s of + Nothing -> Nothing + Just (c,s) -> + let p' = alexMove p c + (b:bs) = utf8Encode c + in p' `seq` Just (b, (p', c, bs, s)) + +alexInputPrevChar :: AlexInput -> Char +alexInputPrevChar (p, c, bs, s) = c + +-- | 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 + ] +} diff --git a/Alisaie/Main.agda b/Alisaie/Main.agda new file mode 100644 index 0000000..084af59 --- /dev/null +++ b/Alisaie/Main.agda @@ -0,0 +1,22 @@ +-- File generated by the BNF Converter (bnfc 2.9.6.1). + +-- Test for Agda binding of parser. Requires Agda >= 2.5.4. + +module Alisaie.Main where +open import Alisaie.IOLib +open import Alisaie.AST using (printProgram) +open import Alisaie.Parser using (Err; parseProgram) + +main : IO ⊤ +main = do + file ∷ [] ← getArgs where + _ → do + putStrLn "usage: Main " + exitFailure + Err.ok result ← parseProgram <$> readFiniteFile file where + Err.bad msg → do + putStrLn "PARSE FAILED\n" + putStrLn (stringFromList msg) + exitFailure + putStrLn "PARSE SUCCESSFUL\n" + putStrLn (printProgram result) diff --git a/Alisaie/Par.hs b/Alisaie/Par.hs new file mode 100644 index 0000000..6a2dcf2 --- /dev/null +++ b/Alisaie/Par.hs @@ -0,0 +1,1272 @@ +{-# OPTIONS_GHC -w #-} +{-# LANGUAGE CPP #-} +{-# LANGUAGE MagicHash #-} +{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE PatternGuards #-} +{-# LANGUAGE NoStrictData #-} +{-# LANGUAGE UnboxedTuples #-} +{-# LANGUAGE PartialTypeSignatures #-} +{-# OPTIONS_GHC -Wno-incomplete-patterns -Wno-overlapping-patterns #-} +{-# LANGUAGE PatternSynonyms #-} + +module Alisaie.Par + ( happyError + , myLexer + , pProgram + , pDefinition + , pKind + , pKind1 + , pType1 + , pType + , pListDefinition + , pListIdent + , pExp4 + , pExp2 + , pExp1 + , pExp + , pExp3 + ) where + +import Prelude + +import qualified Alisaie.Abs +import Alisaie.Lex +import qualified Data.Text +import qualified Control.Monad as Happy_Prelude +import qualified Data.Bool as Happy_Prelude +import qualified Data.Function as Happy_Prelude +import qualified Data.Int as Happy_Prelude +import qualified Data.List as Happy_Prelude +import qualified Data.Maybe as Happy_Prelude +import qualified Data.String as Happy_Prelude +import qualified Data.Tuple as Happy_Prelude +import qualified GHC.Err as Happy_Prelude +import qualified GHC.Num as Happy_Prelude +import qualified Text.Show as Happy_Prelude +import qualified Data.Array as Happy_Data_Array +import qualified Data.Bits as Bits +import qualified GHC.Exts as Happy_GHC_Exts +import Control.Applicative(Applicative(..)) +import Control.Monad (ap) + +-- parser produced by Happy Version 2.1.7 + +newtype HappyAbsSyn = HappyAbsSyn HappyAny +#if __GLASGOW_HASKELL__ >= 607 +type HappyAny = Happy_GHC_Exts.Any +#else +type HappyAny = forall a . a +#endif +newtype HappyWrap17 = HappyWrap17 (Alisaie.Abs.Ident) +happyIn17 :: (Alisaie.Abs.Ident) -> (HappyAbsSyn ) +happyIn17 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap17 x) +{-# INLINE happyIn17 #-} +happyOut17 :: (HappyAbsSyn ) -> HappyWrap17 +happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut17 #-} +newtype HappyWrap18 = HappyWrap18 (Char) +happyIn18 :: (Char) -> (HappyAbsSyn ) +happyIn18 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap18 x) +{-# INLINE happyIn18 #-} +happyOut18 :: (HappyAbsSyn ) -> HappyWrap18 +happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut18 #-} +newtype HappyWrap19 = HappyWrap19 (Double) +happyIn19 :: (Double) -> (HappyAbsSyn ) +happyIn19 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap19 x) +{-# INLINE happyIn19 #-} +happyOut19 :: (HappyAbsSyn ) -> HappyWrap19 +happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut19 #-} +newtype HappyWrap20 = HappyWrap20 (Integer) +happyIn20 :: (Integer) -> (HappyAbsSyn ) +happyIn20 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap20 x) +{-# INLINE happyIn20 #-} +happyOut20 :: (HappyAbsSyn ) -> HappyWrap20 +happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut20 #-} +newtype HappyWrap21 = HappyWrap21 (String) +happyIn21 :: (String) -> (HappyAbsSyn ) +happyIn21 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap21 x) +{-# INLINE happyIn21 #-} +happyOut21 :: (HappyAbsSyn ) -> HappyWrap21 +happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut21 #-} +newtype HappyWrap22 = HappyWrap22 (Alisaie.Abs.UIdent) +happyIn22 :: (Alisaie.Abs.UIdent) -> (HappyAbsSyn ) +happyIn22 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap22 x) +{-# INLINE happyIn22 #-} +happyOut22 :: (HappyAbsSyn ) -> HappyWrap22 +happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut22 #-} +newtype HappyWrap23 = HappyWrap23 (Alisaie.Abs.Program) +happyIn23 :: (Alisaie.Abs.Program) -> (HappyAbsSyn ) +happyIn23 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap23 x) +{-# INLINE happyIn23 #-} +happyOut23 :: (HappyAbsSyn ) -> HappyWrap23 +happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut23 #-} +newtype HappyWrap24 = HappyWrap24 (Alisaie.Abs.Definition) +happyIn24 :: (Alisaie.Abs.Definition) -> (HappyAbsSyn ) +happyIn24 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap24 x) +{-# INLINE happyIn24 #-} +happyOut24 :: (HappyAbsSyn ) -> HappyWrap24 +happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut24 #-} +newtype HappyWrap25 = HappyWrap25 (Alisaie.Abs.Kind) +happyIn25 :: (Alisaie.Abs.Kind) -> (HappyAbsSyn ) +happyIn25 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap25 x) +{-# INLINE happyIn25 #-} +happyOut25 :: (HappyAbsSyn ) -> HappyWrap25 +happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut25 #-} +newtype HappyWrap26 = HappyWrap26 (Alisaie.Abs.Kind) +happyIn26 :: (Alisaie.Abs.Kind) -> (HappyAbsSyn ) +happyIn26 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap26 x) +{-# INLINE happyIn26 #-} +happyOut26 :: (HappyAbsSyn ) -> HappyWrap26 +happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut26 #-} +newtype HappyWrap27 = HappyWrap27 (Alisaie.Abs.Type) +happyIn27 :: (Alisaie.Abs.Type) -> (HappyAbsSyn ) +happyIn27 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap27 x) +{-# INLINE happyIn27 #-} +happyOut27 :: (HappyAbsSyn ) -> HappyWrap27 +happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut27 #-} +newtype HappyWrap28 = HappyWrap28 (Alisaie.Abs.Type) +happyIn28 :: (Alisaie.Abs.Type) -> (HappyAbsSyn ) +happyIn28 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap28 x) +{-# INLINE happyIn28 #-} +happyOut28 :: (HappyAbsSyn ) -> HappyWrap28 +happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut28 #-} +newtype HappyWrap29 = HappyWrap29 ([Alisaie.Abs.Definition]) +happyIn29 :: ([Alisaie.Abs.Definition]) -> (HappyAbsSyn ) +happyIn29 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap29 x) +{-# INLINE happyIn29 #-} +happyOut29 :: (HappyAbsSyn ) -> HappyWrap29 +happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut29 #-} +newtype HappyWrap30 = HappyWrap30 ([Alisaie.Abs.Ident]) +happyIn30 :: ([Alisaie.Abs.Ident]) -> (HappyAbsSyn ) +happyIn30 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap30 x) +{-# INLINE happyIn30 #-} +happyOut30 :: (HappyAbsSyn ) -> HappyWrap30 +happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut30 #-} +newtype HappyWrap31 = HappyWrap31 (Alisaie.Abs.Exp) +happyIn31 :: (Alisaie.Abs.Exp) -> (HappyAbsSyn ) +happyIn31 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap31 x) +{-# INLINE happyIn31 #-} +happyOut31 :: (HappyAbsSyn ) -> HappyWrap31 +happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut31 #-} +newtype HappyWrap32 = HappyWrap32 (Alisaie.Abs.Exp) +happyIn32 :: (Alisaie.Abs.Exp) -> (HappyAbsSyn ) +happyIn32 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap32 x) +{-# INLINE happyIn32 #-} +happyOut32 :: (HappyAbsSyn ) -> HappyWrap32 +happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut32 #-} +newtype HappyWrap33 = HappyWrap33 (Alisaie.Abs.Exp) +happyIn33 :: (Alisaie.Abs.Exp) -> (HappyAbsSyn ) +happyIn33 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap33 x) +{-# INLINE happyIn33 #-} +happyOut33 :: (HappyAbsSyn ) -> HappyWrap33 +happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut33 #-} +newtype HappyWrap34 = HappyWrap34 (Alisaie.Abs.Exp) +happyIn34 :: (Alisaie.Abs.Exp) -> (HappyAbsSyn ) +happyIn34 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap34 x) +{-# INLINE happyIn34 #-} +happyOut34 :: (HappyAbsSyn ) -> HappyWrap34 +happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut34 #-} +newtype HappyWrap35 = HappyWrap35 (Alisaie.Abs.Exp) +happyIn35 :: (Alisaie.Abs.Exp) -> (HappyAbsSyn ) +happyIn35 x = Happy_GHC_Exts.unsafeCoerce# (HappyWrap35 x) +{-# INLINE happyIn35 #-} +happyOut35 :: (HappyAbsSyn ) -> HappyWrap35 +happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut35 #-} +happyInTok :: (Token) -> (HappyAbsSyn ) +happyInTok x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyInTok #-} +happyOutTok :: (HappyAbsSyn ) -> (Token) +happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOutTok #-} + + +{-# NOINLINE happyTokenStrings #-} +happyTokenStrings = ["'('","')'","'*'","'+'","'-'","'.'","':'","'<'","'='","'Char'","'Double'","'Int'","'String'","'else'","'if'","'then'","'\923'","'\955'","'\8594'","'\8704'","L_Ident","L_charac","L_doubl","L_integ","L_quoted","L_UIdent","%eof"] + +happyActOffsets :: HappyAddr +happyActOffsets = HappyA# "\xf2\xff\xff\xff\xf2\xff\xff\xff\x05\x00\x00\x00\x05\x00\x00\x00\x53\x00\x00\x00\x41\x00\x00\x00\xf9\xff\xff\xff\xf9\xff\xff\xff\x60\x00\x00\x00\x60\x00\x00\x00\x60\x00\x00\x00\x59\x00\x00\x00\x60\x00\x00\x00\xf9\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\xf5\xff\xff\xff\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x54\x00\x00\x00\xf5\xff\xff\xff\x00\x00\x00\x00\x59\x00\x00\x00\x0c\x00\x00\x00\x0c\x00\x00\x00\x5f\x00\x00\x00\xff\xff\xff\xff\x18\x00\x00\x00\x30\x00\x00\x00\x2b\x00\x00\x00\x49\x00\x00\x00\x4d\x00\x00\x00\x37\x00\x00\x00\x00\x00\x00\x00\x43\x00\x00\x00\x4a\x00\x00\x00\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x51\x00\x00\x00\x51\x00\x00\x00\x00\x00\x00\x00\x4e\x00\x00\x00\x61\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x58\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x7a\x00\x00\x00\x7d\x00\x00\x00\x81\x00\x00\x00\x41\x00\x00\x00\x00\x00\x00\x00\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x60\x00\x00\x00\x60\x00\x00\x00\x60\x00\x00\x00\x91\x00\x00\x00\x92\x00\x00\x00\x8a\x00\x00\x00\x99\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\xab\x00\x00\x00\x41\x00\x00\x00\x23\x00\x00\x00\x23\x00\x00\x00\x23\x00\x00\x00\x97\x00\x00\x00\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\xac\x00\x00\x00\x00\x00\x00\x00\xaf\x00\x00\x00\xb0\x00\x00\x00\xb1\x00\x00\x00\xb9\x00\x00\x00\xcc\x00\x00\x00\xce\x00\x00\x00\xb3\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x59\x00\x00\x00\x3d\x00\x00\x00\xd2\x00\x00\x00\x41\x00\x00\x00\x41\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x59\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# + +happyGotoOffsets :: HappyAddr +happyGotoOffsets = HappyA# "\x58\x01\x00\x00\x07\x00\x00\x00\xd5\x00\x00\x00\x3c\x00\x00\x00\x2d\x00\x00\x00\x7e\x00\x00\x00\xb8\x00\x00\x00\x20\x00\x00\x00\x02\x00\x00\x00\x3b\x01\x00\x00\x36\x01\x00\x00\x8f\x00\x00\x00\x6b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xba\x00\x00\x00\xd6\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x00\x00\x00\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf\x00\x00\x00\x00\x00\x00\x00\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7c\x00\x00\x00\x4e\x01\x00\x00\x53\x01\x00\x00\x66\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x00\x00\xf1\x00\x00\x00\xf5\x00\x00\x00\xf3\x00\x00\x00\xf3\x00\x00\x00\xf3\x00\x00\x00\xfb\x00\x00\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x0b\x01\x00\x00\x1e\x01\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x6c\x01\x00\x00\x75\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# + +happyDefActions :: HappyAddr +happyDefActions = HappyA# "\xdd\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xff\xff\xff\xdb\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\xf2\xff\xff\xff\xd9\xff\xff\xff\xd6\xff\xff\xff\xd7\xff\xff\xff\xd8\xff\xff\xff\xd5\xff\xff\xff\xc8\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xff\xff\xff\xf0\xff\xff\xff\xef\xff\xff\xff\xee\xff\xff\xff\xcd\xff\xff\xff\xc9\xff\xff\xff\x00\x00\x00\x00\xd1\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\xdb\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdd\xff\xff\xff\x00\x00\x00\x00\xe3\xff\xff\xff\xde\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xff\xff\xff\xe5\xff\xff\xff\xe6\xff\xff\xff\xe7\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xed\xff\xff\xff\x00\x00\x00\x00\xe8\xff\xff\xff\x00\x00\x00\x00\xea\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\xff\xff\x00\x00\x00\x00\xda\xff\xff\xff\xd2\xff\xff\xff\xd3\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\xd4\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\xff\xff\xff\xcf\xff\xff\xff\xd0\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xe1\xff\xff\xff\xe2\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xdb\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\x00\x00\x00\x00\x00\x00\x00\x00\xe0\xff\xff\xff\xdf\xff\xff\xff\x00\x00\x00\x00\xca\xff\xff\xff\xcb\xff\xff\xff\xcc\xff\xff\xff\xeb\xff\xff\xff"# + +happyCheck :: HappyAddr +happyCheck = HappyA# "\xff\xff\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x0e\x00\x00\x00\x07\x00\x00\x00\x16\x00\x00\x00\x0e\x00\x00\x00\x1c\x00\x00\x00\x13\x00\x00\x00\x02\x00\x00\x00\x15\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x16\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x02\x00\x00\x00\x15\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x0d\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x0e\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x0a\x00\x00\x00\x15\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x02\x00\x00\x00\x0d\x00\x00\x00\x04\x00\x00\x00\x0d\x00\x00\x00\x02\x00\x00\x00\x08\x00\x00\x00\x09\x00\x00\x00\x16\x00\x00\x00\x1c\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x0e\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x0e\x00\x00\x00\x13\x00\x00\x00\x08\x00\x00\x00\x15\x00\x00\x00\x1c\x00\x00\x00\x13\x00\x00\x00\x02\x00\x00\x00\x15\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x1b\x00\x00\x00\x09\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\x0d\x00\x00\x00\x0e\x00\x00\x00\x02\x00\x00\x00\x16\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x1c\x00\x00\x00\x16\x00\x00\x00\x09\x00\x00\x00\x10\x00\x00\x00\x1c\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x04\x00\x00\x00\x1b\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1c\x00\x00\x00\x14\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x08\x00\x00\x00\x05\x00\x00\x00\x03\x00\x00\x00\x08\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00\x00\x11\x00\x00\x00\x03\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x16\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x0e\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x07\x00\x00\x00\x05\x00\x00\x00\x08\x00\x00\x00\x0f\x00\x00\x00\x08\x00\x00\x00\x0c\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x16\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x07\x00\x00\x00\x05\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x0e\x00\x00\x00\x0a\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x07\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x08\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x08\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x0e\x00\x00\x00\x08\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\xff\xff\xff\xff\x12\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x00\x00\x0f\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x12\x00\x00\x00\x0e\x00\x00\x00\x0f\x00\x00\x00\xff\xff\xff\xff\x0c\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\xff\xff\xff\xff\x05\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\x00\x00\x0f\x00\x00\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x12\x00\x00\x00\x0e\x00\x00\x00\x05\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x12\x00\x00\x00\xff\xff\xff\xff\x0a\x00\x00\x00\x0b\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"# + +happyTable :: HappyAddr +happyTable = HappyA# "\x00\x00\x00\x00\x48\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x27\x00\x00\x00\x0f\x00\x00\x00\x39\x00\x00\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x3a\x00\x00\x00\x0f\x00\x00\x00\x24\x00\x00\x00\xff\xff\xff\xff\x33\x00\x00\x00\x48\x00\x00\x00\x34\x00\x00\x00\x0f\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x35\x00\x00\x00\xff\xff\xff\xff\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x25\x00\x00\x00\x20\x00\x00\x00\x0f\x00\x00\x00\x21\x00\x00\x00\x57\x00\x00\x00\x48\x00\x00\x00\x34\x00\x00\x00\x0f\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x35\x00\x00\x00\x26\x00\x00\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x2a\x00\x00\x00\x25\x00\x00\x00\xff\xff\xff\xff\x25\x00\x00\x00\x33\x00\x00\x00\x35\x00\x00\x00\x34\x00\x00\x00\x0f\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\x35\x00\x00\x00\x2e\x00\x00\x00\x44\x00\x00\x00\x39\x00\x00\x00\x68\x00\x00\x00\x2e\x00\x00\x00\x36\x00\x00\x00\x37\x00\x00\x00\x0f\x00\x00\x00\xff\xff\xff\xff\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x33\x00\x00\x00\x44\x00\x00\x00\x34\x00\x00\x00\xff\xff\xff\xff\x33\x00\x00\x00\x2e\x00\x00\x00\x34\x00\x00\x00\x42\x00\x00\x00\x35\x00\x00\x00\x49\x00\x00\x00\x4a\x00\x00\x00\x17\x00\x00\x00\x35\x00\x00\x00\x4b\x00\x00\x00\x2f\x00\x00\x00\x30\x00\x00\x00\x31\x00\x00\x00\x32\x00\x00\x00\x17\x00\x00\x00\x0f\x00\x00\x00\x49\x00\x00\x00\x4a\x00\x00\x00\xff\xff\xff\xff\x0f\x00\x00\x00\x4b\x00\x00\x00\x20\x00\x00\x00\xff\xff\xff\xff\x21\x00\x00\x00\x22\x00\x00\x00\x39\x00\x00\x00\x35\x00\x00\x00\x0f\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\xff\xff\xff\xff\x3e\x00\x00\x00\x0f\x00\x00\x00\x18\x00\x00\x00\x19\x00\x00\x00\x1a\x00\x00\x00\x1b\x00\x00\x00\xff\xff\xff\xff\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x2a\x00\x00\x00\x5c\x00\x00\x00\x2a\x00\x00\x00\x5a\x00\x00\x00\x5b\x00\x00\x00\x2b\x00\x00\x00\x40\x00\x00\x00\x2b\x00\x00\x00\x2c\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x4e\x00\x00\x00\x1e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x53\x00\x00\x00\x52\x00\x00\x00\x51\x00\x00\x00\x50\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x1d\x00\x00\x00\x1e\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x4e\x00\x00\x00\x1e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x2a\x00\x00\x00\x0f\x00\x00\x00\x2a\x00\x00\x00\x39\x00\x00\x00\x39\x00\x00\x00\x2b\x00\x00\x00\x45\x00\x00\x00\x2b\x00\x00\x00\x40\x00\x00\x00\x14\x00\x00\x00\x6b\x00\x00\x00\x6a\x00\x00\x00\x27\x00\x00\x00\x46\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x28\x00\x00\x00\x2a\x00\x00\x00\x68\x00\x00\x00\x65\x00\x00\x00\x5e\x00\x00\x00\x29\x00\x00\x00\x2b\x00\x00\x00\x61\x00\x00\x00\x0f\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x4d\x00\x00\x00\x1e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x2a\x00\x00\x00\x67\x00\x00\x00\x2a\x00\x00\x00\x66\x00\x00\x00\x4c\x00\x00\x00\x2b\x00\x00\x00\x45\x00\x00\x00\x2b\x00\x00\x00\x58\x00\x00\x00\x14\x00\x00\x00\x6e\x00\x00\x00\x39\x00\x00\x00\x27\x00\x00\x00\x46\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x28\x00\x00\x00\x2a\x00\x00\x00\x4b\x00\x00\x00\x3f\x00\x00\x00\x3e\x00\x00\x00\x42\x00\x00\x00\x2b\x00\x00\x00\x57\x00\x00\x00\x5c\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x63\x00\x00\x00\x1e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x2a\x00\x00\x00\x62\x00\x00\x00\x2a\x00\x00\x00\x60\x00\x00\x00\x5f\x00\x00\x00\x2b\x00\x00\x00\x45\x00\x00\x00\x2b\x00\x00\x00\x61\x00\x00\x00\x14\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x5d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x70\x00\x00\x00\x1e\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x6f\x00\x00\x00\x1e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x6e\x00\x00\x00\x1e\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x1c\x00\x00\x00\x71\x00\x00\x00\x1e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x1b\x00\x00\x00\x22\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x14\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x55\x00\x00\x00\x3b\x00\x00\x00\x28\x00\x00\x00\x1e\x00\x00\x00\x14\x00\x00\x00\x54\x00\x00\x00\x00\x00\x00\x00\x3c\x00\x00\x00\x1e\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x0f\x00\x00\x00\x10\x00\x00\x00\x11\x00\x00\x00\x12\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x53\x00\x00\x00\x2b\x00\x00\x00\x6c\x00\x00\x00\x1e\x00\x00\x00\x14\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x6b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# + +happyReduceArr = Happy_Data_Array.array (13, 55) [ + (13 , happyReduce_13), + (14 , happyReduce_14), + (15 , happyReduce_15), + (16 , happyReduce_16), + (17 , happyReduce_17), + (18 , happyReduce_18), + (19 , happyReduce_19), + (20 , happyReduce_20), + (21 , happyReduce_21), + (22 , happyReduce_22), + (23 , happyReduce_23), + (24 , happyReduce_24), + (25 , happyReduce_25), + (26 , happyReduce_26), + (27 , happyReduce_27), + (28 , happyReduce_28), + (29 , happyReduce_29), + (30 , happyReduce_30), + (31 , happyReduce_31), + (32 , happyReduce_32), + (33 , happyReduce_33), + (34 , happyReduce_34), + (35 , happyReduce_35), + (36 , happyReduce_36), + (37 , happyReduce_37), + (38 , happyReduce_38), + (39 , happyReduce_39), + (40 , happyReduce_40), + (41 , happyReduce_41), + (42 , happyReduce_42), + (43 , happyReduce_43), + (44 , happyReduce_44), + (45 , happyReduce_45), + (46 , happyReduce_46), + (47 , happyReduce_47), + (48 , happyReduce_48), + (49 , happyReduce_49), + (50 , happyReduce_50), + (51 , happyReduce_51), + (52 , happyReduce_52), + (53 , happyReduce_53), + (54 , happyReduce_54), + (55 , happyReduce_55) + ] + +happyRuleArr :: HappyAddr +happyRuleArr = HappyA# "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\x01\x00\x00\x00\x09\x00\x00\x00\x03\x00\x00\x00\x09\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00\x03\x00\x00\x00\x0b\x00\x00\x00\x03\x00\x00\x00\x0b\x00\x00\x00\x06\x00\x00\x00\x0b\x00\x00\x00\x06\x00\x00\x00\x0b\x00\x00\x00\x01\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x02\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x02\x00\x00\x00\x0e\x00\x00\x00\x01\x00\x00\x00\x0e\x00\x00\x00\x01\x00\x00\x00\x0e\x00\x00\x00\x01\x00\x00\x00\x0e\x00\x00\x00\x01\x00\x00\x00\x0e\x00\x00\x00\x01\x00\x00\x00\x0e\x00\x00\x00\x03\x00\x00\x00\x0f\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x01\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x11\x00\x00\x00\x06\x00\x00\x00\x11\x00\x00\x00\x06\x00\x00\x00\x11\x00\x00\x00\x06\x00\x00\x00\x11\x00\x00\x00\x01\x00\x00\x00\x12\x00\x00\x00\x01\x00\x00\x00"# + +happyCatchStates :: [Happy_Prelude.Int] +happyCatchStates = [] + +happy_n_terms = 29 :: Happy_Prelude.Int +happy_n_nonterms = 19 :: Happy_Prelude.Int + +happy_n_starts = 13 :: Happy_Prelude.Int + +happyReduce_13 = happySpecReduce_1 0# happyReduction_13 +happyReduction_13 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (TV happy_var_1)) -> + happyIn17 + (Alisaie.Abs.Ident happy_var_1 + )} + +happyReduce_14 = happySpecReduce_1 1# happyReduction_14 +happyReduction_14 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (TC happy_var_1)) -> + happyIn18 + ((read (Data.Text.unpack happy_var_1)) :: Char + )} + +happyReduce_15 = happySpecReduce_1 2# happyReduction_15 +happyReduction_15 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (TD happy_var_1)) -> + happyIn19 + ((read (Data.Text.unpack happy_var_1)) :: Double + )} + +happyReduce_16 = happySpecReduce_1 3# happyReduction_16 +happyReduction_16 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (TI happy_var_1)) -> + happyIn20 + ((read (Data.Text.unpack happy_var_1)) :: Integer + )} + +happyReduce_17 = happySpecReduce_1 4# happyReduction_17 +happyReduction_17 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (TL happy_var_1)) -> + happyIn21 + ((Data.Text.unpack happy_var_1) + )} + +happyReduce_18 = happySpecReduce_1 5# happyReduction_18 +happyReduction_18 happy_x_1 + = case happyOutTok happy_x_1 of { (PT _ (T_UIdent happy_var_1)) -> + happyIn22 + (Alisaie.Abs.UIdent happy_var_1 + )} + +happyReduce_19 = happySpecReduce_1 6# happyReduction_19 +happyReduction_19 happy_x_1 + = case happyOut29 happy_x_1 of { (HappyWrap29 happy_var_1) -> + happyIn23 + (Alisaie.Abs.Prog happy_var_1 + )} + +happyReduce_20 = happyReduce 7# 7# happyReduction_20 +happyReduction_20 (happy_x_7 `HappyStk` + happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut17 happy_x_1 of { (HappyWrap17 happy_var_1) -> + case happyOut28 happy_x_3 of { (HappyWrap28 happy_var_3) -> + case happyOut17 happy_x_4 of { (HappyWrap17 happy_var_4) -> + case happyOut30 happy_x_5 of { (HappyWrap30 happy_var_5) -> + case happyOut34 happy_x_7 of { (HappyWrap34 happy_var_7) -> + happyIn24 + (Alisaie.Abs.Def happy_var_1 happy_var_3 happy_var_4 happy_var_5 happy_var_7 + ) `HappyStk` happyRest}}}}} + +happyReduce_21 = happySpecReduce_1 8# happyReduction_21 +happyReduction_21 happy_x_1 + = happyIn25 + (Alisaie.Abs.KStar + ) + +happyReduce_22 = happySpecReduce_3 9# happyReduction_22 +happyReduction_22 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut25 happy_x_1 of { (HappyWrap25 happy_var_1) -> + case happyOut25 happy_x_3 of { (HappyWrap25 happy_var_3) -> + happyIn26 + (Alisaie.Abs.KArr happy_var_1 happy_var_3 + )}} + +happyReduce_23 = happySpecReduce_1 9# happyReduction_23 +happyReduction_23 happy_x_1 + = case happyOut25 happy_x_1 of { (HappyWrap25 happy_var_1) -> + happyIn26 + (happy_var_1 + )} + +happyReduce_24 = happySpecReduce_1 10# happyReduction_24 +happyReduction_24 happy_x_1 + = happyIn27 + (Alisaie.Abs.TString + ) + +happyReduce_25 = happySpecReduce_1 10# happyReduction_25 +happyReduction_25 happy_x_1 + = happyIn27 + (Alisaie.Abs.TInt + ) + +happyReduce_26 = happySpecReduce_1 10# happyReduction_26 +happyReduction_26 happy_x_1 + = happyIn27 + (Alisaie.Abs.TDouble + ) + +happyReduce_27 = happySpecReduce_1 10# happyReduction_27 +happyReduction_27 happy_x_1 + = happyIn27 + (Alisaie.Abs.TChar + ) + +happyReduce_28 = happySpecReduce_1 10# happyReduction_28 +happyReduction_28 happy_x_1 + = case happyOut22 happy_x_1 of { (HappyWrap22 happy_var_1) -> + happyIn27 + (Alisaie.Abs.TCustom happy_var_1 + )} + +happyReduce_29 = happySpecReduce_3 10# happyReduction_29 +happyReduction_29 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut28 happy_x_2 of { (HappyWrap28 happy_var_2) -> + happyIn27 + (happy_var_2 + )} + +happyReduce_30 = happySpecReduce_3 11# happyReduction_30 +happyReduction_30 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut27 happy_x_1 of { (HappyWrap27 happy_var_1) -> + case happyOut28 happy_x_3 of { (HappyWrap28 happy_var_3) -> + happyIn28 + (Alisaie.Abs.TArr happy_var_1 happy_var_3 + )}} + +happyReduce_31 = happyReduce 6# 11# happyReduction_31 +happyReduction_31 (happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut17 happy_x_2 of { (HappyWrap17 happy_var_2) -> + case happyOut25 happy_x_4 of { (HappyWrap25 happy_var_4) -> + case happyOut28 happy_x_6 of { (HappyWrap28 happy_var_6) -> + happyIn28 + (Alisaie.Abs.TForall happy_var_2 happy_var_4 happy_var_6 + ) `HappyStk` happyRest}}} + +happyReduce_32 = happyReduce 6# 11# happyReduction_32 +happyReduction_32 (happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut17 happy_x_2 of { (HappyWrap17 happy_var_2) -> + case happyOut25 happy_x_4 of { (HappyWrap25 happy_var_4) -> + case happyOut28 happy_x_6 of { (HappyWrap28 happy_var_6) -> + happyIn28 + (Alisaie.Abs.TLambda happy_var_2 happy_var_4 happy_var_6 + ) `HappyStk` happyRest}}} + +happyReduce_33 = happySpecReduce_1 11# happyReduction_33 +happyReduction_33 happy_x_1 + = case happyOut27 happy_x_1 of { (HappyWrap27 happy_var_1) -> + happyIn28 + (happy_var_1 + )} + +happyReduce_34 = happySpecReduce_0 12# happyReduction_34 +happyReduction_34 = happyIn29 + ([] + ) + +happyReduce_35 = happySpecReduce_2 12# happyReduction_35 +happyReduction_35 happy_x_2 + happy_x_1 + = case happyOut24 happy_x_1 of { (HappyWrap24 happy_var_1) -> + case happyOut29 happy_x_2 of { (HappyWrap29 happy_var_2) -> + happyIn29 + ((:) happy_var_1 happy_var_2 + )}} + +happyReduce_36 = happySpecReduce_0 13# happyReduction_36 +happyReduction_36 = happyIn30 + ([] + ) + +happyReduce_37 = happySpecReduce_2 13# happyReduction_37 +happyReduction_37 happy_x_2 + happy_x_1 + = case happyOut17 happy_x_1 of { (HappyWrap17 happy_var_1) -> + case happyOut30 happy_x_2 of { (HappyWrap30 happy_var_2) -> + happyIn30 + ((:) happy_var_1 happy_var_2 + )}} + +happyReduce_38 = happySpecReduce_1 14# happyReduction_38 +happyReduction_38 happy_x_1 + = case happyOut17 happy_x_1 of { (HappyWrap17 happy_var_1) -> + happyIn31 + (Alisaie.Abs.EVar happy_var_1 + )} + +happyReduce_39 = happySpecReduce_1 14# happyReduction_39 +happyReduction_39 happy_x_1 + = case happyOut20 happy_x_1 of { (HappyWrap20 happy_var_1) -> + happyIn31 + (Alisaie.Abs.EInt happy_var_1 + )} + +happyReduce_40 = happySpecReduce_1 14# happyReduction_40 +happyReduction_40 happy_x_1 + = case happyOut19 happy_x_1 of { (HappyWrap19 happy_var_1) -> + happyIn31 + (Alisaie.Abs.EDouble happy_var_1 + )} + +happyReduce_41 = happySpecReduce_1 14# happyReduction_41 +happyReduction_41 happy_x_1 + = case happyOut18 happy_x_1 of { (HappyWrap18 happy_var_1) -> + happyIn31 + (Alisaie.Abs.EChar happy_var_1 + )} + +happyReduce_42 = happySpecReduce_1 14# happyReduction_42 +happyReduction_42 happy_x_1 + = case happyOut21 happy_x_1 of { (HappyWrap21 happy_var_1) -> + happyIn31 + (Alisaie.Abs.EText happy_var_1 + )} + +happyReduce_43 = happySpecReduce_3 14# happyReduction_43 +happyReduction_43 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut34 happy_x_2 of { (HappyWrap34 happy_var_2) -> + happyIn31 + (happy_var_2 + )} + +happyReduce_44 = happySpecReduce_2 15# happyReduction_44 +happyReduction_44 happy_x_2 + happy_x_1 + = case happyOut32 happy_x_1 of { (HappyWrap32 happy_var_1) -> + case happyOut35 happy_x_2 of { (HappyWrap35 happy_var_2) -> + happyIn32 + (Alisaie.Abs.EApp happy_var_1 happy_var_2 + )}} + +happyReduce_45 = happySpecReduce_2 15# happyReduction_45 +happyReduction_45 happy_x_2 + happy_x_1 + = case happyOut32 happy_x_1 of { (HappyWrap32 happy_var_1) -> + case happyOut28 happy_x_2 of { (HappyWrap28 happy_var_2) -> + happyIn32 + (Alisaie.Abs.ETApp happy_var_1 happy_var_2 + )}} + +happyReduce_46 = happySpecReduce_1 15# happyReduction_46 +happyReduction_46 happy_x_1 + = case happyOut35 happy_x_1 of { (HappyWrap35 happy_var_1) -> + happyIn32 + (happy_var_1 + )} + +happyReduce_47 = happySpecReduce_3 16# happyReduction_47 +happyReduction_47 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut33 happy_x_1 of { (HappyWrap33 happy_var_1) -> + case happyOut32 happy_x_3 of { (HappyWrap32 happy_var_3) -> + happyIn33 + (Alisaie.Abs.EAdd happy_var_1 happy_var_3 + )}} + +happyReduce_48 = happySpecReduce_3 16# happyReduction_48 +happyReduction_48 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut33 happy_x_1 of { (HappyWrap33 happy_var_1) -> + case happyOut32 happy_x_3 of { (HappyWrap32 happy_var_3) -> + happyIn33 + (Alisaie.Abs.ESub happy_var_1 happy_var_3 + )}} + +happyReduce_49 = happySpecReduce_3 16# happyReduction_49 +happyReduction_49 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut33 happy_x_1 of { (HappyWrap33 happy_var_1) -> + case happyOut32 happy_x_3 of { (HappyWrap32 happy_var_3) -> + happyIn33 + (Alisaie.Abs.ELt happy_var_1 happy_var_3 + )}} + +happyReduce_50 = happySpecReduce_1 16# happyReduction_50 +happyReduction_50 happy_x_1 + = case happyOut32 happy_x_1 of { (HappyWrap32 happy_var_1) -> + happyIn33 + (happy_var_1 + )} + +happyReduce_51 = happyReduce 6# 17# happyReduction_51 +happyReduction_51 (happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut34 happy_x_2 of { (HappyWrap34 happy_var_2) -> + case happyOut34 happy_x_4 of { (HappyWrap34 happy_var_4) -> + case happyOut34 happy_x_6 of { (HappyWrap34 happy_var_6) -> + happyIn34 + (Alisaie.Abs.EIf happy_var_2 happy_var_4 happy_var_6 + ) `HappyStk` happyRest}}} + +happyReduce_52 = happyReduce 6# 17# happyReduction_52 +happyReduction_52 (happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut17 happy_x_2 of { (HappyWrap17 happy_var_2) -> + case happyOut25 happy_x_4 of { (HappyWrap25 happy_var_4) -> + case happyOut34 happy_x_6 of { (HappyWrap34 happy_var_6) -> + happyIn34 + (Alisaie.Abs.ETAbs happy_var_2 happy_var_4 happy_var_6 + ) `HappyStk` happyRest}}} + +happyReduce_53 = happyReduce 6# 17# happyReduction_53 +happyReduction_53 (happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut17 happy_x_2 of { (HappyWrap17 happy_var_2) -> + case happyOut28 happy_x_4 of { (HappyWrap28 happy_var_4) -> + case happyOut34 happy_x_6 of { (HappyWrap34 happy_var_6) -> + happyIn34 + (Alisaie.Abs.EAbs happy_var_2 happy_var_4 happy_var_6 + ) `HappyStk` happyRest}}} + +happyReduce_54 = happySpecReduce_1 17# happyReduction_54 +happyReduction_54 happy_x_1 + = case happyOut33 happy_x_1 of { (HappyWrap33 happy_var_1) -> + happyIn34 + (happy_var_1 + )} + +happyReduce_55 = happySpecReduce_1 18# happyReduction_55 +happyReduction_55 happy_x_1 + = case happyOut31 happy_x_1 of { (HappyWrap31 happy_var_1) -> + happyIn35 + (happy_var_1 + )} + +happyTerminalToTok term = case term of { + PT _ (TS _ 1) -> 2#; + PT _ (TS _ 2) -> 3#; + PT _ (TS _ 3) -> 4#; + PT _ (TS _ 4) -> 5#; + PT _ (TS _ 5) -> 6#; + PT _ (TS _ 6) -> 7#; + PT _ (TS _ 7) -> 8#; + PT _ (TS _ 8) -> 9#; + PT _ (TS _ 9) -> 10#; + PT _ (TS _ 10) -> 11#; + PT _ (TS _ 11) -> 12#; + PT _ (TS _ 12) -> 13#; + PT _ (TS _ 13) -> 14#; + PT _ (TS _ 14) -> 15#; + PT _ (TS _ 15) -> 16#; + PT _ (TS _ 16) -> 17#; + PT _ (TS _ 17) -> 18#; + PT _ (TS _ 18) -> 19#; + PT _ (TS _ 19) -> 20#; + PT _ (TS _ 20) -> 21#; + PT _ (TV happy_dollar_dollar) -> 22#; + PT _ (TC happy_dollar_dollar) -> 23#; + PT _ (TD happy_dollar_dollar) -> 24#; + PT _ (TI happy_dollar_dollar) -> 25#; + PT _ (TL happy_dollar_dollar) -> 26#; + PT _ (T_UIdent happy_dollar_dollar) -> 27#; + _ -> -1#; + } +{-# NOINLINE happyTerminalToTok #-} + +happyLex kend _kmore [] = kend notHappyAtAll [] +happyLex _kend kmore (tk:tks) = kmore (happyTerminalToTok tk) tk tks +{-# INLINE happyLex #-} + +happyNewToken action sts stk = happyLex (\tk -> happyDoAction 28# notHappyAtAll action sts stk) (\i tk -> happyDoAction i tk action sts stk) + +happyReport 28# tk explist resume tks = happyReport' tks explist resume +happyReport _ tk explist resume tks = happyReport' (tk:tks) explist (\tks -> resume (Happy_Prelude.tail tks)) + + +happyThen :: () => (Err a) -> (a -> (Err b)) -> (Err b) +happyThen = ((>>=)) +happyReturn :: () => a -> (Err a) +happyReturn = (return) +happyThen1 m k tks = ((>>=)) m (\a -> k a tks) +happyFmap1 f m tks = happyThen (m tks) (\a -> happyReturn (f a)) +happyReturn1 :: () => a -> b -> (Err a) +happyReturn1 = \a tks -> (return) a +happyReport' :: () => [(Token)] -> [Happy_Prelude.String] -> ([(Token)] -> (Err a)) -> (Err a) +happyReport' = (\tokens expected resume -> happyError tokens) + +happyAbort :: () => [(Token)] -> (Err a) +happyAbort = Happy_Prelude.error "Called abort handler in non-resumptive parser" + +pProgram tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 0# tks) (\x -> happyReturn (let {(HappyWrap23 x') = happyOut23 x} in x')) + +pDefinition tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 1# tks) (\x -> happyReturn (let {(HappyWrap24 x') = happyOut24 x} in x')) + +pKind tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 2# tks) (\x -> happyReturn (let {(HappyWrap25 x') = happyOut25 x} in x')) + +pKind1 tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 3# tks) (\x -> happyReturn (let {(HappyWrap26 x') = happyOut26 x} in x')) + +pType1 tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 4# tks) (\x -> happyReturn (let {(HappyWrap27 x') = happyOut27 x} in x')) + +pType tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 5# tks) (\x -> happyReturn (let {(HappyWrap28 x') = happyOut28 x} in x')) + +pListDefinition tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 6# tks) (\x -> happyReturn (let {(HappyWrap29 x') = happyOut29 x} in x')) + +pListIdent tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 7# tks) (\x -> happyReturn (let {(HappyWrap30 x') = happyOut30 x} in x')) + +pExp4 tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 8# tks) (\x -> happyReturn (let {(HappyWrap31 x') = happyOut31 x} in x')) + +pExp2 tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 9# tks) (\x -> happyReturn (let {(HappyWrap32 x') = happyOut32 x} in x')) + +pExp1 tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 10# tks) (\x -> happyReturn (let {(HappyWrap33 x') = happyOut33 x} in x')) + +pExp tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 11# tks) (\x -> happyReturn (let {(HappyWrap34 x') = happyOut34 x} in x')) + +pExp3 tks = happySomeParser where + happySomeParser = happyThen (happyDoParse 12# tks) (\x -> happyReturn (let {(HappyWrap35 x') = happyOut35 x} in x')) + +happySeq = happyDontSeq + + +type Err = Either String + +happyError :: [Token] -> Err a +happyError ts = Left $ + "syntax error at " ++ tokenPos ts ++ + case ts of + [] -> [] + [Err _] -> " due to lexer error" + t:_ -> " before `" ++ (prToken t) ++ "'" + +myLexer :: Data.Text.Text -> [Token] +myLexer = tokens +#define HAPPY_COERCE 1 +-- $Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp $ + +#if !defined(__GLASGOW_HASKELL__) +# error This code isn't being built with GHC. +#endif + +-- Get WORDS_BIGENDIAN (if defined) +#include "MachDeps.h" + +-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex. +#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Happy_Prelude.Bool) +#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Happy_Prelude.Bool) +#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Happy_Prelude.Bool) +#define PLUS(n,m) (n Happy_GHC_Exts.+# m) +#define MINUS(n,m) (n Happy_GHC_Exts.-# m) +#define TIMES(n,m) (n Happy_GHC_Exts.*# m) +#define NEGATE(n) (Happy_GHC_Exts.negateInt# (n)) + +type Happy_Int = Happy_GHC_Exts.Int# +data Happy_IntList = HappyCons Happy_Int Happy_IntList + +#define INVALID_TOK -1# +#define ERROR_TOK 0# +#define CATCH_TOK 1# + +#if defined(HAPPY_COERCE) +# define GET_ERROR_TOKEN(x) (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# i) -> i }) +# define MK_ERROR_TOKEN(i) (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# i)) +# define MK_TOKEN(x) (happyInTok (x)) +#else +# define GET_ERROR_TOKEN(x) (case x of { HappyErrorToken (Happy_GHC_Exts.I# i) -> i }) +# define MK_ERROR_TOKEN(i) (HappyErrorToken (Happy_GHC_Exts.I# i)) +# define MK_TOKEN(x) (HappyTerminal (x)) +#endif + +#if defined(HAPPY_DEBUG) +# define DEBUG_TRACE(s) (happyTrace (s)) Happy_Prelude.$ +happyTrace string expr = Happy_System_IO_Unsafe.unsafePerformIO Happy_Prelude.$ do + Happy_System_IO.hPutStr Happy_System_IO.stderr string + Happy_Prelude.return expr +#else +# define DEBUG_TRACE(s) {- nothing -} +#endif + +infixr 9 `HappyStk` +data HappyStk a = HappyStk a (HappyStk a) + +----------------------------------------------------------------------------- +-- starting the parse + +happyDoParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll + +----------------------------------------------------------------------------- +-- Accepting the parse + +-- If the current token is ERROR_TOK, it means we've just accepted a partial +-- parse (a %partial parser). We must ignore the saved token on the top of +-- the stack in this case. +happyAccept ERROR_TOK tk st sts (_ `HappyStk` ans `HappyStk` _) = + happyReturn1 ans +happyAccept j tk st sts (HappyStk ans _) = + (happyTcHack j (happyTcHack st)) (happyReturn1 ans) + +----------------------------------------------------------------------------- +-- Arrays only: do the next action + +happyDoAction i tk st = + DEBUG_TRACE("state: " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# st) Happy_Prelude.++ + ",\ttoken: " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# i) Happy_Prelude.++ + ",\taction: ") + case happyDecodeAction (happyNextAction i st) of + HappyFail -> DEBUG_TRACE("failing.\n") + happyFail i tk st + HappyAccept -> DEBUG_TRACE("accept.\n") + happyAccept i tk st + HappyReduce rule -> DEBUG_TRACE("reduce (rule " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# rule) Happy_Prelude.++ ")") + (happyReduceArr Happy_Data_Array.! (Happy_GHC_Exts.I# rule)) i tk st + HappyShift new_state -> DEBUG_TRACE("shift, enter state " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# new_state) Happy_Prelude.++ "\n") + happyShift new_state i tk st + +{-# INLINE happyNextAction #-} +happyNextAction i st = case happyIndexActionTable i st of + Happy_Prelude.Just (Happy_GHC_Exts.I# act) -> act + Happy_Prelude.Nothing -> happyIndexOffAddr happyDefActions st + +{-# INLINE happyIndexActionTable #-} +happyIndexActionTable i st + | GTE(i, 0#), GTE(off, 0#), EQ(happyIndexOffAddr happyCheck off, i) + -- i >= 0: Guard against INVALID_TOK (do the default action, which ultimately errors) + -- off >= 0: Otherwise it's a default action + -- equality check: Ensure that the entry in the compressed array is owned by st + = Happy_Prelude.Just (Happy_GHC_Exts.I# (happyIndexOffAddr happyTable off)) + | Happy_Prelude.otherwise + = Happy_Prelude.Nothing + where + off = PLUS(happyIndexOffAddr happyActOffsets st, i) + +data HappyAction + = HappyFail + | HappyAccept + | HappyReduce Happy_Int -- rule number + | HappyShift Happy_Int -- new state + deriving Happy_Prelude.Show + +{-# INLINE happyDecodeAction #-} +happyDecodeAction :: Happy_Int -> HappyAction +happyDecodeAction 0# = HappyFail +happyDecodeAction -1# = HappyAccept +happyDecodeAction action | LT(action, 0#) = HappyReduce NEGATE(PLUS(action, 1#)) + | Happy_Prelude.otherwise = HappyShift MINUS(action, 1#) + +{-# INLINE happyIndexGotoTable #-} +happyIndexGotoTable nt st = happyIndexOffAddr happyTable off + where + off = PLUS(happyIndexOffAddr happyGotoOffsets st, nt) + +{-# INLINE happyIndexOffAddr #-} +happyIndexOffAddr :: HappyAddr -> Happy_Int -> Happy_Int +happyIndexOffAddr (HappyA# arr) off = +#if __GLASGOW_HASKELL__ >= 901 + Happy_GHC_Exts.int32ToInt# -- qualified import because it doesn't exist on older GHC's +#endif +#ifdef WORDS_BIGENDIAN + -- The CI of `alex` tests this code path + (Happy_GHC_Exts.word32ToInt32# (Happy_GHC_Exts.wordToWord32# (Happy_GHC_Exts.byteSwap32# (Happy_GHC_Exts.word32ToWord# (Happy_GHC_Exts.int32ToWord32# +#endif + (Happy_GHC_Exts.indexInt32OffAddr# arr off) +#ifdef WORDS_BIGENDIAN + ))))) +#endif + +happyIndexRuleArr :: Happy_Int -> (# Happy_Int, Happy_Int #) +happyIndexRuleArr r = (# nt, len #) + where + !(Happy_GHC_Exts.I# n_starts) = happy_n_starts + offs = TIMES(MINUS(r,n_starts),2#) + nt = happyIndexOffAddr happyRuleArr offs + len = happyIndexOffAddr happyRuleArr PLUS(offs,1#) + +data HappyAddr = HappyA# Happy_GHC_Exts.Addr# + +----------------------------------------------------------------------------- +-- Shifting a token + +happyShift new_state ERROR_TOK tk st sts stk@(x `HappyStk` _) = + -- See "Error Fixup" below + let i = GET_ERROR_TOKEN(x) in + DEBUG_TRACE("shifting the error token") + happyDoAction i tk new_state (HappyCons st sts) stk + +happyShift new_state i tk st sts stk = + happyNewToken new_state (HappyCons st sts) (MK_TOKEN(tk) `HappyStk` stk) + +-- happyReduce is specialised for the common cases. + +happySpecReduce_0 nt fn j tk st sts stk + = happySeq fn (happyGoto nt j tk st (HappyCons st sts) (fn `HappyStk` stk)) + +happySpecReduce_1 nt fn j tk old_st sts@(HappyCons st _) (v1 `HappyStk` stk') + = let r = fn v1 in + happyTcHack old_st (happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))) + +happySpecReduce_2 nt fn j tk old_st + (HappyCons _ sts@(HappyCons st _)) + (v1 `HappyStk` v2 `HappyStk` stk') + = let r = fn v1 v2 in + happyTcHack old_st (happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))) + +happySpecReduce_3 nt fn j tk old_st + (HappyCons _ (HappyCons _ sts@(HappyCons st _))) + (v1 `HappyStk` v2 `HappyStk` v3 `HappyStk` stk') + = let r = fn v1 v2 v3 in + happyTcHack old_st (happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))) + +happyReduce k nt fn j tk st sts stk + = case happyDrop MINUS(k,(1# :: Happy_Int)) sts of + sts1@(HappyCons st1 _) -> + let r = fn stk in -- it doesn't hurt to always seq here... + st `happyTcHack` happyDoSeq r (happyGoto nt j tk st1 sts1 r) + +happyMonadReduce k nt fn j tk st sts stk = + case happyDrop k (HappyCons st sts) of + sts1@(HappyCons st1 _) -> + let drop_stk = happyDropStk k stk in + j `happyTcHack` happyThen1 (fn stk tk) + (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk)) + +happyMonad2Reduce k nt fn j tk st sts stk = + case happyDrop k (HappyCons st sts) of + sts1@(HappyCons st1 _) -> + let drop_stk = happyDropStk k stk + off = happyIndexOffAddr happyGotoOffsets st1 + off_i = PLUS(off, nt) + new_state = happyIndexOffAddr happyTable off_i + in + j `happyTcHack` happyThen1 (fn stk tk) + (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk)) + +happyDrop 0# l = l +happyDrop n (HappyCons _ t) = happyDrop MINUS(n,(1# :: Happy_Int)) t + +happyDropStk 0# l = l +happyDropStk n (x `HappyStk` xs) = happyDropStk MINUS(n,(1#::Happy_Int)) xs + +----------------------------------------------------------------------------- +-- Moving to a new state after a reduction + +happyGoto nt j tk st = + DEBUG_TRACE(", goto state " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# new_state) Happy_Prelude.++ "\n") + happyDoAction j tk new_state + where new_state = happyIndexGotoTable nt st + +{- Note [Error recovery] +~~~~~~~~~~~~~~~~~~~~~~~~ +When there is no applicable action for the current lookahead token `tk`, +happy enters error recovery mode. Depending on whether the grammar file +declares the two action form `%error { abort } { report }` for + Resumptive Error Handling, +it works in one (not resumptive) or two phases (resumptive): + + 1. Fixup mode: + Try to see if there is an action for the error token ERROR_TOK. If there + is, do *not* emit an error and pretend instead that an `error` token was + inserted. + When there is no ERROR_TOK action, report an error. + + In non-resumptive error handling, calling the single error handler + (e.g. `happyError`) will throw an exception and abort the parser. + However, in resumptive error handling we enter *error resumption mode*. + + 2. Error resumption mode: + After reporting the error (with `report`), happy will attempt to find + a good state stack to resume parsing in. + For each candidate stack, it discards input until one of the candidates + resumes (i.e. shifts the current input). + If no candidate resumes before the end of input, resumption failed and + calls the `abort` function, to much the same effect as in non-resumptive + error handling. + + Candidate stacks are declared by the grammar author using the special + `catch` terminal and called "catch frames". + This mechanism is described in detail in Note [happyResume]. + +The `catch` resumption mechanism (2) is what usually is associated with +`error` in `bison` or `menhir`. Since `error` is used for the Fixup mechanism +(1) above, we call the corresponding token `catch`. +Furthermore, in constrast to `bison`, our implementation of `catch` +non-deterministically considers multiple catch frames on the stack for +resumption (See Note [Multiple catch frames]). + +Note [happyResume] +~~~~~~~~~~~~~~~~~~ +`happyResume` implements the resumption mechanism from Note [Error recovery]. +It is best understood by example. Consider + +Exp :: { String } +Exp : '1' { "1" } + | catch { "catch" } + | Exp '+' Exp %shift { $1 Happy_Prelude.++ " + " Happy_Prelude.++ $3 } -- %shift: associate 1 + 1 + 1 to the right + | '(' Exp ')' { "(" Happy_Prelude.++ $2 Happy_Prelude.++ ")" } + +The idea of the use of `catch` here is that upon encountering a parse error +during expression parsing, we can gracefully degrade using the `catch` rule, +still producing a partial syntax tree and keep on parsing to find further +syntax errors. + +Let's trace the parser state for input 11+1, which will error out after shifting 1. +After shifting, we have the following item stack (growing downwards and omitting +transitive closure items): + + State 0: %start_parseExp -> . Exp + State 5: Exp -> '1' . + +(Stack as a list of state numbers: [5,0].) +As Note [Error recovery] describes, we will first try Fixup mode. +That fails because no production can shift the `error` token. +Next we try Error resumption mode. This works as follows: + + 1. Pop off the item stack until we find an item that can shift the `catch` + token. (Implemented in `pop_items`.) + * State 5 cannot shift catch. Pop. + * State 0 can shift catch, which would transition into + State 4: Exp -> catch . + So record the *stack* `[4,0]` after doing the shift transition. + We call this a *catch frame*, where the top is a *catch state*, + corresponding to an item in which we just shifted a `catch` token. + There can be multiple such catch stacks, see Note [Multiple catch frames]. + + 2. Discard tokens from the input until the lookahead can be shifted in one + of the catch stacks. (Implemented in `discard_input_until_exp` and + `some_catch_state_shifts`.) + * We cannot shift the current lookahead '1' in state 4, so we discard + * We *can* shift the next lookahead '+' in state 4, but only after + reducing, which pops State 4 and goes to State 3: + State 3: %start_parseExp -> Exp . + Exp -> Exp . '+' Exp + Here we can shift '+'. + As you can see, to implement this machinery we need to simulate + the operation of the LALR automaton, especially reduction + (`happySimulateReduce`). + +Note [Multiple catch frames] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +For fewer spurious error messages, it can be beneficial to trace multiple catch +items. Consider + +Exp : '1' + | catch + | Exp '+' Exp %shift + | '(' Exp ')' + +Let's trace the parser state for input (;+1, which will error out after shifting (. +After shifting, we have the following item stack (growing downwards): + + State 0: %start_parseExp -> . Exp + State 6: Exp -> '(' . Exp ')' + +Upon error, we want to find items in the stack which can shift a catch token. +Note that both State 0 and State 6 can shift a catch token, transitioning into + State 4: Exp -> catch . +Hence we record the catch frames `[4,6,0]` and `[4,0]` for possible resumption. + +Which catch frame do we pick for resumption? +Note that resuming catch frame `[4,0]` will parse as "catch+1", whereas +resuming the innermost frame `[4,6,0]` corresponds to parsing "(catch+1". +The latter would keep discarding input until the closing ')' is found. +So we will discard + and 1, leading to a spurious syntax error at the end of +input, aborting the parse and never producing a partial syntax tree. Bad! + +It is far preferable to resume with catch frame `[4,0]`, where we can resume +successfully on input +, so that is what we do. + +In general, we pick the catch frame for resumption that discards the least +amount of input for a successful shift, preferring the topmost such catch frame. +-} + +-- happyFail :: Happy_Int -> Token -> Happy_Int -> _ +-- This function triggers Note [Error recovery]. +-- If the current token is ERROR_TOK, phase (1) has failed and we might try +-- phase (2). +happyFail ERROR_TOK = happyFixupFailed +happyFail i = happyTryFixup i + +-- Enter Error Fixup (see Note [Error recovery]): +-- generate an error token, save the old token and carry on. +-- When a `happyShift` accepts the error token, we will pop off the error token +-- to resume parsing with the current lookahead `i`. +happyTryFixup i tk action sts stk = + DEBUG_TRACE("entering `error` fixup.\n") + happyDoAction ERROR_TOK tk action sts (MK_ERROR_TOKEN(i) `HappyStk` stk) + -- NB: `happyShift` will simply pop the error token and carry on with + -- `tk`. Hence we don't change `tk` in the call here + +-- See Note [Error recovery], phase (2). +-- Enter resumption mode after reporting the error by calling `happyResume`. +happyFixupFailed tk st sts (x `HappyStk` stk) = + let i = GET_ERROR_TOKEN(x) in + DEBUG_TRACE("`error` fixup failed.\n") + let resume = happyResume i tk st sts stk + expected = happyExpectedTokens st sts in + happyReport i tk expected resume + +-- happyResume :: Happy_Int -> Token -> Happy_Int -> _ +-- See Note [happyResume] +happyResume i tk st sts stk = pop_items [] st sts stk + where + !(Happy_GHC_Exts.I# n_starts) = happy_n_starts -- this is to test whether we have a start token + !(Happy_GHC_Exts.I# eof_i) = happy_n_terms Happy_Prelude.- 1 -- this is the token number of the EOF token + happy_list_to_list :: Happy_IntList -> [Happy_Prelude.Int] + happy_list_to_list (HappyCons st sts) + | LT(st, n_starts) + = [(Happy_GHC_Exts.I# st)] + | Happy_Prelude.otherwise + = (Happy_GHC_Exts.I# st) : happy_list_to_list sts + + -- See (1) of Note [happyResume] + pop_items catch_frames st sts stk + | LT(st, n_starts) + = DEBUG_TRACE("reached start state " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# st) Happy_Prelude.++ ", ") + if Happy_Prelude.null catch_frames_new + then DEBUG_TRACE("no resumption.\n") + happyAbort + else DEBUG_TRACE("now discard input, trying to anchor in states " Happy_Prelude.++ Happy_Prelude.show (Happy_Prelude.map (happy_list_to_list . Happy_Prelude.fst) (Happy_Prelude.reverse catch_frames_new)) Happy_Prelude.++ ".\n") + discard_input_until_exp i tk (Happy_Prelude.reverse catch_frames_new) + | (HappyCons st1 sts1) <- sts, _ `HappyStk` stk1 <- stk + = pop_items catch_frames_new st1 sts1 stk1 + where + !catch_frames_new + | HappyShift new_state <- happyDecodeAction (happyNextAction CATCH_TOK st) + , DEBUG_TRACE("can shift catch token in state " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# st) Happy_Prelude.++ ", into state " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# new_state) Happy_Prelude.++ "\n") + Happy_Prelude.null (Happy_Prelude.filter (\(HappyCons _ (HappyCons h _),_) -> EQ(st,h)) catch_frames) + = (HappyCons new_state (HappyCons st sts), MK_ERROR_TOKEN(i) `HappyStk` stk):catch_frames -- MK_ERROR_TOKEN(i) is just some dummy that should not be accessed by user code + | Happy_Prelude.otherwise + = DEBUG_TRACE("already shifted or can't shift catch in " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# st) Happy_Prelude.++ "\n") + catch_frames + + -- See (2) of Note [happyResume] + discard_input_until_exp i tk catch_frames + | Happy_Prelude.Just (HappyCons st (HappyCons catch_st sts), catch_frame) <- some_catch_state_shifts i catch_frames + = DEBUG_TRACE("found expected token in state " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# st) Happy_Prelude.++ " after shifting from " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# catch_st) Happy_Prelude.++ ": " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# i) Happy_Prelude.++ "\n") + happyDoAction i tk st (HappyCons catch_st sts) catch_frame + | EQ(i,eof_i) -- is i EOF? + = DEBUG_TRACE("reached EOF, cannot resume. abort parse :(\n") + happyAbort + | Happy_Prelude.otherwise + = DEBUG_TRACE("discard token " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# i) Happy_Prelude.++ "\n") + happyLex (\eof_tk -> discard_input_until_exp eof_i eof_tk catch_frames) -- eof + (\i tk -> discard_input_until_exp i tk catch_frames) -- not eof + + some_catch_state_shifts _ [] = DEBUG_TRACE("no catch state could shift.\n") Happy_Prelude.Nothing + some_catch_state_shifts i catch_frames@(((HappyCons st sts),_):_) = try_head i st sts catch_frames + where + try_head i st sts catch_frames = -- PRECONDITION: head catch_frames = (HappyCons st sts) + DEBUG_TRACE("trying token " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# i) Happy_Prelude.++ " in state " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# st) Happy_Prelude.++ ": ") + case happyDecodeAction (happyNextAction i st) of + HappyFail -> DEBUG_TRACE("fail.\n") some_catch_state_shifts i (Happy_Prelude.tail catch_frames) + HappyAccept -> DEBUG_TRACE("accept.\n") Happy_Prelude.Just (Happy_Prelude.head catch_frames) + HappyShift _ -> DEBUG_TRACE("shift.\n") Happy_Prelude.Just (Happy_Prelude.head catch_frames) + HappyReduce r -> case happySimulateReduce r st sts of + (HappyCons st1 sts1) -> try_head i st1 sts1 catch_frames + +happySimulateReduce r st sts = + DEBUG_TRACE("simulate reduction of rule " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# r) Happy_Prelude.++ ", ") + let (# nt, len #) = happyIndexRuleArr r in + DEBUG_TRACE("nt " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# nt) Happy_Prelude.++ ", len: " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# len) Happy_Prelude.++ ", new_st ") + let !(sts1@(HappyCons st1 _)) = happyDrop len (HappyCons st sts) + new_st = happyIndexGotoTable nt st1 in + DEBUG_TRACE(Happy_Prelude.show (Happy_GHC_Exts.I# new_st) Happy_Prelude.++ ".\n") + (HappyCons new_st sts1) + +happyTokenToString :: Happy_Prelude.Int -> Happy_Prelude.String +happyTokenToString i = happyTokenStrings Happy_Prelude.!! (i Happy_Prelude.- 2) -- 2: errorTok, catchTok + +happyExpectedTokens :: Happy_Int -> Happy_IntList -> [Happy_Prelude.String] +-- Upon a parse error, we want to suggest tokens that are expected in that +-- situation. This function computes such tokens. +-- It works by examining the top of the state stack. +-- For every token number that does a shift transition, record that token number. +-- For every token number that does a reduce transition, simulate that reduction +-- on the state state stack and repeat. +-- The recorded token numbers are then formatted with 'happyTokenToString' and +-- returned. +happyExpectedTokens st sts = + DEBUG_TRACE("constructing expected tokens.\n") + Happy_Prelude.map happyTokenToString (search_shifts st sts []) + where + search_shifts st sts shifts = Happy_Prelude.foldr (add_action st sts) shifts (distinct_actions st) + add_action st sts (Happy_GHC_Exts.I# i, Happy_GHC_Exts.I# act) shifts = + DEBUG_TRACE("found action in state " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# st) Happy_Prelude.++ ", input " Happy_Prelude.++ Happy_Prelude.show (Happy_GHC_Exts.I# i) Happy_Prelude.++ ", " Happy_Prelude.++ Happy_Prelude.show (happyDecodeAction act) Happy_Prelude.++ "\n") + case happyDecodeAction act of + HappyFail -> shifts + HappyAccept -> shifts -- This would always be %eof or error... Not helpful + HappyShift _ -> Happy_Prelude.insert (Happy_GHC_Exts.I# i) shifts + HappyReduce r -> case happySimulateReduce r st sts of + (HappyCons st1 sts1) -> search_shifts st1 sts1 shifts + distinct_actions st + -- The (token number, action) pairs of all actions in the given state + = ((-1), (Happy_GHC_Exts.I# (happyIndexOffAddr happyDefActions st))) + : [ (i, act) | i <- [begin_i..happy_n_terms], act <- get_act row_off i ] + where + row_off = happyIndexOffAddr happyActOffsets st + begin_i = 2 -- +2: errorTok,catchTok + get_act off (Happy_GHC_Exts.I# i) -- happyIndexActionTable with cached row offset + | let off_i = PLUS(off,i) + , GTE(off_i,0#) + , EQ(happyIndexOffAddr happyCheck off_i,i) + = [(Happy_GHC_Exts.I# (happyIndexOffAddr happyTable off_i))] + | Happy_Prelude.otherwise + = [] + +-- Internal happy errors: + +notHappyAtAll :: a +notHappyAtAll = Happy_Prelude.error "Internal Happy parser panic. This is not supposed to happen! Please open a bug report at https://github.com/haskell/happy/issues.\n" + +----------------------------------------------------------------------------- +-- Hack to get the typechecker to accept our action functions + +happyTcHack :: Happy_Int -> a -> a +happyTcHack x y = y +{-# INLINE happyTcHack #-} + +----------------------------------------------------------------------------- +-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq +-- otherwise it emits +-- happySeq = happyDontSeq + +happyDoSeq, happyDontSeq :: a -> b -> b +happyDoSeq a b = a `Happy_GHC_Exts.seq` b +happyDontSeq a b = b + +----------------------------------------------------------------------------- +-- Don't inline any functions from the template. GHC has a nasty habit +-- of deciding to inline happyGoto everywhere, which increases the size of +-- the generated parser quite a bit. + +{-# NOINLINE happyDoAction #-} +{-# NOINLINE happyTable #-} +{-# NOINLINE happyCheck #-} +{-# NOINLINE happyActOffsets #-} +{-# NOINLINE happyGotoOffsets #-} +{-# NOINLINE happyDefActions #-} + +{-# NOINLINE happyShift #-} +{-# NOINLINE happySpecReduce_0 #-} +{-# NOINLINE happySpecReduce_1 #-} +{-# NOINLINE happySpecReduce_2 #-} +{-# NOINLINE happySpecReduce_3 #-} +{-# NOINLINE happyReduce #-} +{-# NOINLINE happyMonadReduce #-} +{-# NOINLINE happyGoto #-} +{-# NOINLINE happyFail #-} + +-- end of Happy Template. diff --git a/Alisaie/Par.info b/Alisaie/Par.info new file mode 100644 index 0000000..ce3fdd6 --- /dev/null +++ b/Alisaie/Par.info @@ -0,0 +1,2041 @@ +----------------------------------------------------------------------------- +Info file generated by Happy Version 2.1.7 from Alisaie/Par.y +----------------------------------------------------------------------------- + +state 27 contains 1 shift/reduce conflicts. +state 83 contains 1 shift/reduce conflicts. +state 84 contains 1 shift/reduce conflicts. +state 85 contains 1 shift/reduce conflicts. + +----------------------------------------------------------------------------- +Grammar +----------------------------------------------------------------------------- + %start_pProgram -> Program (0) + %start_pDefinition -> Definition (1) + %start_pKind -> Kind (2) + %start_pKind1 -> Kind1 (3) + %start_pType1 -> Type1 (4) + %start_pType -> Type (5) + %start_pListDefinition -> ListDefinition (6) + %start_pListIdent -> ListIdent (7) + %start_pExp4 -> Exp4 (8) + %start_pExp2 -> Exp2 (9) + %start_pExp1 -> Exp1 (10) + %start_pExp -> Exp (11) + %start_pExp3 -> Exp3 (12) + Ident -> L_Ident (13) + Char -> L_charac (14) + Double -> L_doubl (15) + Integer -> L_integ (16) + String -> L_quoted (17) + UIdent -> L_UIdent (18) + Program -> ListDefinition (19) + Definition -> Ident ':' Type Ident ListIdent '=' Exp (20) + Kind -> '*' (21) + Kind1 -> Kind '→' Kind (22) + Kind1 -> Kind (23) + Type1 -> 'String' (24) + Type1 -> 'Int' (25) + Type1 -> 'Double' (26) + Type1 -> 'Char' (27) + Type1 -> UIdent (28) + Type1 -> '(' Type ')' (29) + Type -> Type1 '→' Type (30) + Type -> '∀' Ident ':' Kind '.' Type (31) + Type -> 'λ' Ident ':' Kind '.' Type (32) + Type -> Type1 (33) + ListDefinition -> (34) + ListDefinition -> Definition ListDefinition (35) + ListIdent -> (36) + ListIdent -> Ident ListIdent (37) + Exp4 -> Ident (38) + Exp4 -> Integer (39) + Exp4 -> Double (40) + Exp4 -> Char (41) + Exp4 -> String (42) + Exp4 -> '(' Exp ')' (43) + Exp2 -> Exp2 Exp3 (44) + Exp2 -> Exp2 Type (45) + Exp2 -> Exp3 (46) + Exp1 -> Exp1 '+' Exp2 (47) + Exp1 -> Exp1 '-' Exp2 (48) + Exp1 -> Exp1 '<' Exp2 (49) + Exp1 -> Exp2 (50) + Exp -> 'if' Exp 'then' Exp 'else' Exp (51) + Exp -> 'Λ' Ident ':' Kind '.' Exp (52) + Exp -> 'λ' Ident ':' Type '.' Exp (53) + Exp -> Exp1 (54) + Exp3 -> Exp4 (55) + +----------------------------------------------------------------------------- +Terminals +----------------------------------------------------------------------------- + '(' { PT _ (TS _ 1) } + ')' { PT _ (TS _ 2) } + '*' { PT _ (TS _ 3) } + '+' { PT _ (TS _ 4) } + '-' { PT _ (TS _ 5) } + '.' { PT _ (TS _ 6) } + ':' { PT _ (TS _ 7) } + '<' { PT _ (TS _ 8) } + '=' { PT _ (TS _ 9) } + 'Char' { PT _ (TS _ 10) } + 'Double' { PT _ (TS _ 11) } + 'Int' { PT _ (TS _ 12) } + 'String' { PT _ (TS _ 13) } + 'else' { PT _ (TS _ 14) } + 'if' { PT _ (TS _ 15) } + 'then' { PT _ (TS _ 16) } + 'Λ' { PT _ (TS _ 17) } + 'λ' { PT _ (TS _ 18) } + '→' { PT _ (TS _ 19) } + '∀' { PT _ (TS _ 20) } + L_Ident { PT _ (TV $$) } + L_charac { PT _ (TC $$) } + L_doubl { PT _ (TD $$) } + L_integ { PT _ (TI $$) } + L_quoted { PT _ (TL $$) } + L_UIdent { PT _ (T_UIdent $$) } + +----------------------------------------------------------------------------- +Non-terminals +----------------------------------------------------------------------------- + %start_pProgram rule 0 + %start_pDefinition rule 1 + %start_pKind rule 2 + %start_pKind1 rule 3 + %start_pType1 rule 4 + %start_pType rule 5 + %start_pListDefinition rule 6 + %start_pListIdent rule 7 + %start_pExp4 rule 8 + %start_pExp2 rule 9 + %start_pExp1 rule 10 + %start_pExp rule 11 + %start_pExp3 rule 12 + Ident rule 13 + Char rule 14 + Double rule 15 + Integer rule 16 + String rule 17 + UIdent rule 18 + Program rule 19 + Definition rule 20 + Kind rule 21 + Kind1 rules 22, 23 + Type1 rules 24, 25, 26, 27, 28, 29 + Type rules 30, 31, 32, 33 + ListDefinition rules 34, 35 + ListIdent rules 36, 37 + Exp4 rules 38, 39, 40, 41, 42, 43 + Exp2 rules 44, 45, 46 + Exp1 rules 47, 48, 49, 50 + Exp rules 51, 52, 53, 54 + Exp3 rule 55 + +----------------------------------------------------------------------------- +States +----------------------------------------------------------------------------- +State 0 + + %start_pProgram -> . Program (rule 0) + + L_Ident shift, and enter state 14 + %eof reduce using rule 34 + + Ident goto state 39 + Program goto state 59 + Definition goto state 40 + ListDefinition goto state 60 + +State 1 + + %start_pDefinition -> . Definition (rule 1) + + L_Ident shift, and enter state 14 + + Ident goto state 39 + Definition goto state 58 + +State 2 + + %start_pKind -> . Kind (rule 2) + + '*' shift, and enter state 56 + + Kind goto state 57 + +State 3 + + %start_pKind1 -> . Kind1 (rule 3) + + '*' shift, and enter state 56 + + Kind goto state 54 + Kind1 goto state 55 + +State 4 + + %start_pType1 -> . Type1 (rule 4) + + '(' shift, and enter state 45 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + L_UIdent shift, and enter state 52 + + UIdent goto state 42 + Type1 goto state 53 + +State 5 + + %start_pType -> . Type (rule 5) + + '(' shift, and enter state 45 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_UIdent shift, and enter state 52 + + UIdent goto state 42 + Type1 goto state 43 + Type goto state 44 + +State 6 + + %start_pListDefinition -> . ListDefinition (rule 6) + + L_Ident shift, and enter state 14 + %eof reduce using rule 34 + + Ident goto state 39 + Definition goto state 40 + ListDefinition goto state 41 + +State 7 + + %start_pListIdent -> . ListIdent (rule 7) + + L_Ident shift, and enter state 14 + %eof reduce using rule 36 + + Ident goto state 37 + ListIdent goto state 38 + +State 8 + + %start_pExp4 -> . Exp4 (rule 8) + + '(' shift, and enter state 22 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 36 + +State 9 + + %start_pExp2 -> . Exp2 (rule 9) + + '(' shift, and enter state 22 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 35 + Exp3 goto state 30 + +State 10 + + %start_pExp1 -> . Exp1 (rule 10) + + '(' shift, and enter state 22 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 34 + Exp3 goto state 30 + +State 11 + + %start_pExp -> . Exp (rule 11) + + '(' shift, and enter state 22 + 'if' shift, and enter state 31 + 'Λ' shift, and enter state 32 + 'λ' shift, and enter state 33 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 28 + Exp goto state 29 + Exp3 goto state 30 + +State 12 + + %start_pExp3 -> . Exp3 (rule 12) + + '(' shift, and enter state 22 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp3 goto state 21 + +State 13 + + Ident -> . L_Ident (rule 13) + + L_Ident shift, and enter state 14 + + +State 14 + + Ident -> L_Ident . (rule 13) + + '(' reduce using rule 13 + ')' reduce using rule 13 + '+' reduce using rule 13 + '-' reduce using rule 13 + ':' reduce using rule 13 + '<' reduce using rule 13 + '=' reduce using rule 13 + 'Char' reduce using rule 13 + 'Double' reduce using rule 13 + 'Int' reduce using rule 13 + 'String' reduce using rule 13 + 'else' reduce using rule 13 + 'then' reduce using rule 13 + 'λ' reduce using rule 13 + '∀' reduce using rule 13 + L_Ident reduce using rule 13 + L_charac reduce using rule 13 + L_doubl reduce using rule 13 + L_integ reduce using rule 13 + L_quoted reduce using rule 13 + L_UIdent reduce using rule 13 + %eof reduce using rule 13 + + +State 15 + + Exp4 -> Ident . (rule 38) + + '(' reduce using rule 38 + ')' reduce using rule 38 + '+' reduce using rule 38 + '-' reduce using rule 38 + '<' reduce using rule 38 + 'Char' reduce using rule 38 + 'Double' reduce using rule 38 + 'Int' reduce using rule 38 + 'String' reduce using rule 38 + 'else' reduce using rule 38 + 'then' reduce using rule 38 + 'λ' reduce using rule 38 + '∀' reduce using rule 38 + L_Ident reduce using rule 38 + L_charac reduce using rule 38 + L_doubl reduce using rule 38 + L_integ reduce using rule 38 + L_quoted reduce using rule 38 + L_UIdent reduce using rule 38 + %eof reduce using rule 38 + + +State 16 + + Exp4 -> Char . (rule 41) + + '(' reduce using rule 41 + ')' reduce using rule 41 + '+' reduce using rule 41 + '-' reduce using rule 41 + '<' reduce using rule 41 + 'Char' reduce using rule 41 + 'Double' reduce using rule 41 + 'Int' reduce using rule 41 + 'String' reduce using rule 41 + 'else' reduce using rule 41 + 'then' reduce using rule 41 + 'λ' reduce using rule 41 + '∀' reduce using rule 41 + L_Ident reduce using rule 41 + L_charac reduce using rule 41 + L_doubl reduce using rule 41 + L_integ reduce using rule 41 + L_quoted reduce using rule 41 + L_UIdent reduce using rule 41 + %eof reduce using rule 41 + + +State 17 + + Exp4 -> Double . (rule 40) + + '(' reduce using rule 40 + ')' reduce using rule 40 + '+' reduce using rule 40 + '-' reduce using rule 40 + '<' reduce using rule 40 + 'Char' reduce using rule 40 + 'Double' reduce using rule 40 + 'Int' reduce using rule 40 + 'String' reduce using rule 40 + 'else' reduce using rule 40 + 'then' reduce using rule 40 + 'λ' reduce using rule 40 + '∀' reduce using rule 40 + L_Ident reduce using rule 40 + L_charac reduce using rule 40 + L_doubl reduce using rule 40 + L_integ reduce using rule 40 + L_quoted reduce using rule 40 + L_UIdent reduce using rule 40 + %eof reduce using rule 40 + + +State 18 + + Exp4 -> Integer . (rule 39) + + '(' reduce using rule 39 + ')' reduce using rule 39 + '+' reduce using rule 39 + '-' reduce using rule 39 + '<' reduce using rule 39 + 'Char' reduce using rule 39 + 'Double' reduce using rule 39 + 'Int' reduce using rule 39 + 'String' reduce using rule 39 + 'else' reduce using rule 39 + 'then' reduce using rule 39 + 'λ' reduce using rule 39 + '∀' reduce using rule 39 + L_Ident reduce using rule 39 + L_charac reduce using rule 39 + L_doubl reduce using rule 39 + L_integ reduce using rule 39 + L_quoted reduce using rule 39 + L_UIdent reduce using rule 39 + %eof reduce using rule 39 + + +State 19 + + Exp4 -> String . (rule 42) + + '(' reduce using rule 42 + ')' reduce using rule 42 + '+' reduce using rule 42 + '-' reduce using rule 42 + '<' reduce using rule 42 + 'Char' reduce using rule 42 + 'Double' reduce using rule 42 + 'Int' reduce using rule 42 + 'String' reduce using rule 42 + 'else' reduce using rule 42 + 'then' reduce using rule 42 + 'λ' reduce using rule 42 + '∀' reduce using rule 42 + L_Ident reduce using rule 42 + L_charac reduce using rule 42 + L_doubl reduce using rule 42 + L_integ reduce using rule 42 + L_quoted reduce using rule 42 + L_UIdent reduce using rule 42 + %eof reduce using rule 42 + + +State 20 + + Exp3 -> Exp4 . (rule 55) + + '(' reduce using rule 55 + ')' reduce using rule 55 + '+' reduce using rule 55 + '-' reduce using rule 55 + '<' reduce using rule 55 + 'Char' reduce using rule 55 + 'Double' reduce using rule 55 + 'Int' reduce using rule 55 + 'String' reduce using rule 55 + 'else' reduce using rule 55 + 'then' reduce using rule 55 + 'λ' reduce using rule 55 + '∀' reduce using rule 55 + L_Ident reduce using rule 55 + L_charac reduce using rule 55 + L_doubl reduce using rule 55 + L_integ reduce using rule 55 + L_quoted reduce using rule 55 + L_UIdent reduce using rule 55 + %eof reduce using rule 55 + + +State 21 + + %start_pExp3 -> Exp3 . (rule 12) + + %eof accept + + +State 22 + + Exp4 -> '(' . Exp ')' (rule 43) + + '(' shift, and enter state 22 + 'if' shift, and enter state 31 + 'Λ' shift, and enter state 32 + 'λ' shift, and enter state 33 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 28 + Exp goto state 78 + Exp3 goto state 30 + +State 23 + + Char -> L_charac . (rule 14) + + '(' reduce using rule 14 + ')' reduce using rule 14 + '+' reduce using rule 14 + '-' reduce using rule 14 + '<' reduce using rule 14 + 'Char' reduce using rule 14 + 'Double' reduce using rule 14 + 'Int' reduce using rule 14 + 'String' reduce using rule 14 + 'else' reduce using rule 14 + 'then' reduce using rule 14 + 'λ' reduce using rule 14 + '∀' reduce using rule 14 + L_Ident reduce using rule 14 + L_charac reduce using rule 14 + L_doubl reduce using rule 14 + L_integ reduce using rule 14 + L_quoted reduce using rule 14 + L_UIdent reduce using rule 14 + %eof reduce using rule 14 + + +State 24 + + Double -> L_doubl . (rule 15) + + '(' reduce using rule 15 + ')' reduce using rule 15 + '+' reduce using rule 15 + '-' reduce using rule 15 + '<' reduce using rule 15 + 'Char' reduce using rule 15 + 'Double' reduce using rule 15 + 'Int' reduce using rule 15 + 'String' reduce using rule 15 + 'else' reduce using rule 15 + 'then' reduce using rule 15 + 'λ' reduce using rule 15 + '∀' reduce using rule 15 + L_Ident reduce using rule 15 + L_charac reduce using rule 15 + L_doubl reduce using rule 15 + L_integ reduce using rule 15 + L_quoted reduce using rule 15 + L_UIdent reduce using rule 15 + %eof reduce using rule 15 + + +State 25 + + Integer -> L_integ . (rule 16) + + '(' reduce using rule 16 + ')' reduce using rule 16 + '+' reduce using rule 16 + '-' reduce using rule 16 + '<' reduce using rule 16 + 'Char' reduce using rule 16 + 'Double' reduce using rule 16 + 'Int' reduce using rule 16 + 'String' reduce using rule 16 + 'else' reduce using rule 16 + 'then' reduce using rule 16 + 'λ' reduce using rule 16 + '∀' reduce using rule 16 + L_Ident reduce using rule 16 + L_charac reduce using rule 16 + L_doubl reduce using rule 16 + L_integ reduce using rule 16 + L_quoted reduce using rule 16 + L_UIdent reduce using rule 16 + %eof reduce using rule 16 + + +State 26 + + String -> L_quoted . (rule 17) + + '(' reduce using rule 17 + ')' reduce using rule 17 + '+' reduce using rule 17 + '-' reduce using rule 17 + '<' reduce using rule 17 + 'Char' reduce using rule 17 + 'Double' reduce using rule 17 + 'Int' reduce using rule 17 + 'String' reduce using rule 17 + 'else' reduce using rule 17 + 'then' reduce using rule 17 + 'λ' reduce using rule 17 + '∀' reduce using rule 17 + L_Ident reduce using rule 17 + L_charac reduce using rule 17 + L_doubl reduce using rule 17 + L_integ reduce using rule 17 + L_quoted reduce using rule 17 + L_UIdent reduce using rule 17 + %eof reduce using rule 17 + + +State 27 + + Exp2 -> Exp2 . Exp3 (rule 44) + Exp2 -> Exp2 . Type (rule 45) + Exp1 -> Exp2 . (rule 50) + + '(' shift, and enter state 71 + ')' reduce using rule 50 + '+' reduce using rule 50 + '-' reduce using rule 50 + '<' reduce using rule 50 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'else' reduce using rule 50 + 'then' reduce using rule 50 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_Ident shift, and enter state 14 + (reduce using rule 50) + + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + L_UIdent shift, and enter state 52 + %eof reduce using rule 50 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + UIdent goto state 42 + Type1 goto state 43 + Type goto state 69 + Exp4 goto state 20 + Exp3 goto state 70 + +State 28 + + Exp1 -> Exp1 . '+' Exp2 (rule 47) + Exp1 -> Exp1 . '-' Exp2 (rule 48) + Exp1 -> Exp1 . '<' Exp2 (rule 49) + Exp -> Exp1 . (rule 54) + + ')' reduce using rule 54 + '+' shift, and enter state 72 + '-' shift, and enter state 73 + '<' shift, and enter state 74 + 'else' reduce using rule 54 + 'then' reduce using rule 54 + L_Ident reduce using rule 54 + %eof reduce using rule 54 + + +State 29 + + %start_pExp -> Exp . (rule 11) + + %eof accept + + +State 30 + + Exp2 -> Exp3 . (rule 46) + + '(' reduce using rule 46 + ')' reduce using rule 46 + '+' reduce using rule 46 + '-' reduce using rule 46 + '<' reduce using rule 46 + 'Char' reduce using rule 46 + 'Double' reduce using rule 46 + 'Int' reduce using rule 46 + 'String' reduce using rule 46 + 'else' reduce using rule 46 + 'then' reduce using rule 46 + 'λ' reduce using rule 46 + '∀' reduce using rule 46 + L_Ident reduce using rule 46 + L_charac reduce using rule 46 + L_doubl reduce using rule 46 + L_integ reduce using rule 46 + L_quoted reduce using rule 46 + L_UIdent reduce using rule 46 + %eof reduce using rule 46 + + +State 31 + + Exp -> 'if' . Exp 'then' Exp 'else' Exp (rule 51) + + '(' shift, and enter state 22 + 'if' shift, and enter state 31 + 'Λ' shift, and enter state 32 + 'λ' shift, and enter state 33 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 28 + Exp goto state 77 + Exp3 goto state 30 + +State 32 + + Exp -> 'Λ' . Ident ':' Kind '.' Exp (rule 52) + + L_Ident shift, and enter state 14 + + Ident goto state 76 + +State 33 + + Exp -> 'λ' . Ident ':' Type '.' Exp (rule 53) + + L_Ident shift, and enter state 14 + + Ident goto state 75 + +State 34 + + %start_pExp1 -> Exp1 . (rule 10) + Exp1 -> Exp1 . '+' Exp2 (rule 47) + Exp1 -> Exp1 . '-' Exp2 (rule 48) + Exp1 -> Exp1 . '<' Exp2 (rule 49) + + '+' shift, and enter state 72 + '-' shift, and enter state 73 + '<' shift, and enter state 74 + %eof accept + + +State 35 + + %start_pExp2 -> Exp2 . (rule 9) + Exp2 -> Exp2 . Exp3 (rule 44) + Exp2 -> Exp2 . Type (rule 45) + + '(' shift, and enter state 71 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + L_UIdent shift, and enter state 52 + %eof accept + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + UIdent goto state 42 + Type1 goto state 43 + Type goto state 69 + Exp4 goto state 20 + Exp3 goto state 70 + +State 36 + + %start_pExp4 -> Exp4 . (rule 8) + + %eof accept + + +State 37 + + ListIdent -> Ident . ListIdent (rule 37) + + '=' reduce using rule 36 + L_Ident shift, and enter state 14 + %eof reduce using rule 36 + + Ident goto state 37 + ListIdent goto state 68 + +State 38 + + %start_pListIdent -> ListIdent . (rule 7) + + %eof accept + + +State 39 + + Definition -> Ident . ':' Type Ident ListIdent '=' Exp (rule 20) + + ':' shift, and enter state 67 + + +State 40 + + ListDefinition -> Definition . ListDefinition (rule 35) + + L_Ident shift, and enter state 14 + %eof reduce using rule 34 + + Ident goto state 39 + Definition goto state 40 + ListDefinition goto state 66 + +State 41 + + %start_pListDefinition -> ListDefinition . (rule 6) + + %eof accept + + +State 42 + + Type1 -> UIdent . (rule 28) + + '(' reduce using rule 28 + ')' reduce using rule 28 + '+' reduce using rule 28 + '-' reduce using rule 28 + '.' reduce using rule 28 + '<' reduce using rule 28 + 'Char' reduce using rule 28 + 'Double' reduce using rule 28 + 'Int' reduce using rule 28 + 'String' reduce using rule 28 + 'else' reduce using rule 28 + 'then' reduce using rule 28 + 'λ' reduce using rule 28 + '→' reduce using rule 28 + '∀' reduce using rule 28 + L_Ident reduce using rule 28 + L_charac reduce using rule 28 + L_doubl reduce using rule 28 + L_integ reduce using rule 28 + L_quoted reduce using rule 28 + L_UIdent reduce using rule 28 + %eof reduce using rule 28 + + +State 43 + + Type -> Type1 . '→' Type (rule 30) + Type -> Type1 . (rule 33) + + '(' reduce using rule 33 + ')' reduce using rule 33 + '+' reduce using rule 33 + '-' reduce using rule 33 + '.' reduce using rule 33 + '<' reduce using rule 33 + 'Char' reduce using rule 33 + 'Double' reduce using rule 33 + 'Int' reduce using rule 33 + 'String' reduce using rule 33 + 'else' reduce using rule 33 + 'then' reduce using rule 33 + 'λ' reduce using rule 33 + '→' shift, and enter state 65 + '∀' reduce using rule 33 + L_Ident reduce using rule 33 + L_charac reduce using rule 33 + L_doubl reduce using rule 33 + L_integ reduce using rule 33 + L_quoted reduce using rule 33 + L_UIdent reduce using rule 33 + %eof reduce using rule 33 + + +State 44 + + %start_pType -> Type . (rule 5) + + %eof accept + + +State 45 + + Type1 -> '(' . Type ')' (rule 29) + + '(' shift, and enter state 45 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_UIdent shift, and enter state 52 + + UIdent goto state 42 + Type1 goto state 43 + Type goto state 64 + +State 46 + + Type1 -> 'Char' . (rule 27) + + '(' reduce using rule 27 + ')' reduce using rule 27 + '+' reduce using rule 27 + '-' reduce using rule 27 + '.' reduce using rule 27 + '<' reduce using rule 27 + 'Char' reduce using rule 27 + 'Double' reduce using rule 27 + 'Int' reduce using rule 27 + 'String' reduce using rule 27 + 'else' reduce using rule 27 + 'then' reduce using rule 27 + 'λ' reduce using rule 27 + '→' reduce using rule 27 + '∀' reduce using rule 27 + L_Ident reduce using rule 27 + L_charac reduce using rule 27 + L_doubl reduce using rule 27 + L_integ reduce using rule 27 + L_quoted reduce using rule 27 + L_UIdent reduce using rule 27 + %eof reduce using rule 27 + + +State 47 + + Type1 -> 'Double' . (rule 26) + + '(' reduce using rule 26 + ')' reduce using rule 26 + '+' reduce using rule 26 + '-' reduce using rule 26 + '.' reduce using rule 26 + '<' reduce using rule 26 + 'Char' reduce using rule 26 + 'Double' reduce using rule 26 + 'Int' reduce using rule 26 + 'String' reduce using rule 26 + 'else' reduce using rule 26 + 'then' reduce using rule 26 + 'λ' reduce using rule 26 + '→' reduce using rule 26 + '∀' reduce using rule 26 + L_Ident reduce using rule 26 + L_charac reduce using rule 26 + L_doubl reduce using rule 26 + L_integ reduce using rule 26 + L_quoted reduce using rule 26 + L_UIdent reduce using rule 26 + %eof reduce using rule 26 + + +State 48 + + Type1 -> 'Int' . (rule 25) + + '(' reduce using rule 25 + ')' reduce using rule 25 + '+' reduce using rule 25 + '-' reduce using rule 25 + '.' reduce using rule 25 + '<' reduce using rule 25 + 'Char' reduce using rule 25 + 'Double' reduce using rule 25 + 'Int' reduce using rule 25 + 'String' reduce using rule 25 + 'else' reduce using rule 25 + 'then' reduce using rule 25 + 'λ' reduce using rule 25 + '→' reduce using rule 25 + '∀' reduce using rule 25 + L_Ident reduce using rule 25 + L_charac reduce using rule 25 + L_doubl reduce using rule 25 + L_integ reduce using rule 25 + L_quoted reduce using rule 25 + L_UIdent reduce using rule 25 + %eof reduce using rule 25 + + +State 49 + + Type1 -> 'String' . (rule 24) + + '(' reduce using rule 24 + ')' reduce using rule 24 + '+' reduce using rule 24 + '-' reduce using rule 24 + '.' reduce using rule 24 + '<' reduce using rule 24 + 'Char' reduce using rule 24 + 'Double' reduce using rule 24 + 'Int' reduce using rule 24 + 'String' reduce using rule 24 + 'else' reduce using rule 24 + 'then' reduce using rule 24 + 'λ' reduce using rule 24 + '→' reduce using rule 24 + '∀' reduce using rule 24 + L_Ident reduce using rule 24 + L_charac reduce using rule 24 + L_doubl reduce using rule 24 + L_integ reduce using rule 24 + L_quoted reduce using rule 24 + L_UIdent reduce using rule 24 + %eof reduce using rule 24 + + +State 50 + + Type -> 'λ' . Ident ':' Kind '.' Type (rule 32) + + L_Ident shift, and enter state 14 + + Ident goto state 63 + +State 51 + + Type -> '∀' . Ident ':' Kind '.' Type (rule 31) + + L_Ident shift, and enter state 14 + + Ident goto state 62 + +State 52 + + UIdent -> L_UIdent . (rule 18) + + '(' reduce using rule 18 + ')' reduce using rule 18 + '+' reduce using rule 18 + '-' reduce using rule 18 + '.' reduce using rule 18 + '<' reduce using rule 18 + 'Char' reduce using rule 18 + 'Double' reduce using rule 18 + 'Int' reduce using rule 18 + 'String' reduce using rule 18 + 'else' reduce using rule 18 + 'then' reduce using rule 18 + 'λ' reduce using rule 18 + '→' reduce using rule 18 + '∀' reduce using rule 18 + L_Ident reduce using rule 18 + L_charac reduce using rule 18 + L_doubl reduce using rule 18 + L_integ reduce using rule 18 + L_quoted reduce using rule 18 + L_UIdent reduce using rule 18 + %eof reduce using rule 18 + + +State 53 + + %start_pType1 -> Type1 . (rule 4) + + %eof accept + + +State 54 + + Kind1 -> Kind . '→' Kind (rule 22) + Kind1 -> Kind . (rule 23) + + '→' shift, and enter state 61 + %eof reduce using rule 23 + + +State 55 + + %start_pKind1 -> Kind1 . (rule 3) + + %eof accept + + +State 56 + + Kind -> '*' . (rule 21) + + '.' reduce using rule 21 + '→' reduce using rule 21 + %eof reduce using rule 21 + + +State 57 + + %start_pKind -> Kind . (rule 2) + + %eof accept + + +State 58 + + %start_pDefinition -> Definition . (rule 1) + + %eof accept + + +State 59 + + %start_pProgram -> Program . (rule 0) + + %eof accept + + +State 60 + + Program -> ListDefinition . (rule 19) + + %eof reduce using rule 19 + + +State 61 + + Kind1 -> Kind '→' . Kind (rule 22) + + '*' shift, and enter state 56 + + Kind goto state 92 + +State 62 + + Type -> '∀' Ident . ':' Kind '.' Type (rule 31) + + ':' shift, and enter state 91 + + +State 63 + + Type -> 'λ' Ident . ':' Kind '.' Type (rule 32) + + ':' shift, and enter state 90 + + +State 64 + + Type1 -> '(' Type . ')' (rule 29) + + ')' shift, and enter state 89 + + +State 65 + + Type -> Type1 '→' . Type (rule 30) + + '(' shift, and enter state 45 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_UIdent shift, and enter state 52 + + UIdent goto state 42 + Type1 goto state 43 + Type goto state 88 + +State 66 + + ListDefinition -> Definition ListDefinition . (rule 35) + + %eof reduce using rule 35 + + +State 67 + + Definition -> Ident ':' . Type Ident ListIdent '=' Exp (rule 20) + + '(' shift, and enter state 45 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_UIdent shift, and enter state 52 + + UIdent goto state 42 + Type1 goto state 43 + Type goto state 87 + +State 68 + + ListIdent -> Ident ListIdent . (rule 37) + + '=' reduce using rule 37 + %eof reduce using rule 37 + + +State 69 + + Exp2 -> Exp2 Type . (rule 45) + + '(' reduce using rule 45 + ')' reduce using rule 45 + '+' reduce using rule 45 + '-' reduce using rule 45 + '<' reduce using rule 45 + 'Char' reduce using rule 45 + 'Double' reduce using rule 45 + 'Int' reduce using rule 45 + 'String' reduce using rule 45 + 'else' reduce using rule 45 + 'then' reduce using rule 45 + 'λ' reduce using rule 45 + '∀' reduce using rule 45 + L_Ident reduce using rule 45 + L_charac reduce using rule 45 + L_doubl reduce using rule 45 + L_integ reduce using rule 45 + L_quoted reduce using rule 45 + L_UIdent reduce using rule 45 + %eof reduce using rule 45 + + +State 70 + + Exp2 -> Exp2 Exp3 . (rule 44) + + '(' reduce using rule 44 + ')' reduce using rule 44 + '+' reduce using rule 44 + '-' reduce using rule 44 + '<' reduce using rule 44 + 'Char' reduce using rule 44 + 'Double' reduce using rule 44 + 'Int' reduce using rule 44 + 'String' reduce using rule 44 + 'else' reduce using rule 44 + 'then' reduce using rule 44 + 'λ' reduce using rule 44 + '∀' reduce using rule 44 + L_Ident reduce using rule 44 + L_charac reduce using rule 44 + L_doubl reduce using rule 44 + L_integ reduce using rule 44 + L_quoted reduce using rule 44 + L_UIdent reduce using rule 44 + %eof reduce using rule 44 + + +State 71 + + Type1 -> '(' . Type ')' (rule 29) + Exp4 -> '(' . Exp ')' (rule 43) + + '(' shift, and enter state 71 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'if' shift, and enter state 31 + 'Λ' shift, and enter state 32 + 'λ' shift, and enter state 86 + '∀' shift, and enter state 51 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + L_UIdent shift, and enter state 52 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + UIdent goto state 42 + Type1 goto state 43 + Type goto state 64 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 28 + Exp goto state 78 + Exp3 goto state 30 + +State 72 + + Exp1 -> Exp1 '+' . Exp2 (rule 47) + + '(' shift, and enter state 22 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 85 + Exp3 goto state 30 + +State 73 + + Exp1 -> Exp1 '-' . Exp2 (rule 48) + + '(' shift, and enter state 22 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 84 + Exp3 goto state 30 + +State 74 + + Exp1 -> Exp1 '<' . Exp2 (rule 49) + + '(' shift, and enter state 22 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 83 + Exp3 goto state 30 + +State 75 + + Exp -> 'λ' Ident . ':' Type '.' Exp (rule 53) + + ':' shift, and enter state 82 + + +State 76 + + Exp -> 'Λ' Ident . ':' Kind '.' Exp (rule 52) + + ':' shift, and enter state 81 + + +State 77 + + Exp -> 'if' Exp . 'then' Exp 'else' Exp (rule 51) + + 'then' shift, and enter state 80 + + +State 78 + + Exp4 -> '(' Exp . ')' (rule 43) + + ')' shift, and enter state 79 + + +State 79 + + Exp4 -> '(' Exp ')' . (rule 43) + + '(' reduce using rule 43 + ')' reduce using rule 43 + '+' reduce using rule 43 + '-' reduce using rule 43 + '<' reduce using rule 43 + 'Char' reduce using rule 43 + 'Double' reduce using rule 43 + 'Int' reduce using rule 43 + 'String' reduce using rule 43 + 'else' reduce using rule 43 + 'then' reduce using rule 43 + 'λ' reduce using rule 43 + '∀' reduce using rule 43 + L_Ident reduce using rule 43 + L_charac reduce using rule 43 + L_doubl reduce using rule 43 + L_integ reduce using rule 43 + L_quoted reduce using rule 43 + L_UIdent reduce using rule 43 + %eof reduce using rule 43 + + +State 80 + + Exp -> 'if' Exp 'then' . Exp 'else' Exp (rule 51) + + '(' shift, and enter state 22 + 'if' shift, and enter state 31 + 'Λ' shift, and enter state 32 + 'λ' shift, and enter state 33 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 28 + Exp goto state 99 + Exp3 goto state 30 + +State 81 + + Exp -> 'Λ' Ident ':' . Kind '.' Exp (rule 52) + + '*' shift, and enter state 56 + + Kind goto state 98 + +State 82 + + Exp -> 'λ' Ident ':' . Type '.' Exp (rule 53) + + '(' shift, and enter state 45 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_UIdent shift, and enter state 52 + + UIdent goto state 42 + Type1 goto state 43 + Type goto state 97 + +State 83 + + Exp2 -> Exp2 . Exp3 (rule 44) + Exp2 -> Exp2 . Type (rule 45) + Exp1 -> Exp1 '<' Exp2 . (rule 49) + + '(' shift, and enter state 71 + ')' reduce using rule 49 + '+' reduce using rule 49 + '-' reduce using rule 49 + '<' reduce using rule 49 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'else' reduce using rule 49 + 'then' reduce using rule 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_Ident shift, and enter state 14 + (reduce using rule 49) + + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + L_UIdent shift, and enter state 52 + %eof reduce using rule 49 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + UIdent goto state 42 + Type1 goto state 43 + Type goto state 69 + Exp4 goto state 20 + Exp3 goto state 70 + +State 84 + + Exp2 -> Exp2 . Exp3 (rule 44) + Exp2 -> Exp2 . Type (rule 45) + Exp1 -> Exp1 '-' Exp2 . (rule 48) + + '(' shift, and enter state 71 + ')' reduce using rule 48 + '+' reduce using rule 48 + '-' reduce using rule 48 + '<' reduce using rule 48 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'else' reduce using rule 48 + 'then' reduce using rule 48 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_Ident shift, and enter state 14 + (reduce using rule 48) + + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + L_UIdent shift, and enter state 52 + %eof reduce using rule 48 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + UIdent goto state 42 + Type1 goto state 43 + Type goto state 69 + Exp4 goto state 20 + Exp3 goto state 70 + +State 85 + + Exp2 -> Exp2 . Exp3 (rule 44) + Exp2 -> Exp2 . Type (rule 45) + Exp1 -> Exp1 '+' Exp2 . (rule 47) + + '(' shift, and enter state 71 + ')' reduce using rule 47 + '+' reduce using rule 47 + '-' reduce using rule 47 + '<' reduce using rule 47 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'else' reduce using rule 47 + 'then' reduce using rule 47 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_Ident shift, and enter state 14 + (reduce using rule 47) + + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + L_UIdent shift, and enter state 52 + %eof reduce using rule 47 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + UIdent goto state 42 + Type1 goto state 43 + Type goto state 69 + Exp4 goto state 20 + Exp3 goto state 70 + +State 86 + + Type -> 'λ' . Ident ':' Kind '.' Type (rule 32) + Exp -> 'λ' . Ident ':' Type '.' Exp (rule 53) + + L_Ident shift, and enter state 14 + + Ident goto state 96 + +State 87 + + Definition -> Ident ':' Type . Ident ListIdent '=' Exp (rule 20) + + L_Ident shift, and enter state 14 + + Ident goto state 95 + +State 88 + + Type -> Type1 '→' Type . (rule 30) + + '(' reduce using rule 30 + ')' reduce using rule 30 + '+' reduce using rule 30 + '-' reduce using rule 30 + '.' reduce using rule 30 + '<' reduce using rule 30 + 'Char' reduce using rule 30 + 'Double' reduce using rule 30 + 'Int' reduce using rule 30 + 'String' reduce using rule 30 + 'else' reduce using rule 30 + 'then' reduce using rule 30 + 'λ' reduce using rule 30 + '∀' reduce using rule 30 + L_Ident reduce using rule 30 + L_charac reduce using rule 30 + L_doubl reduce using rule 30 + L_integ reduce using rule 30 + L_quoted reduce using rule 30 + L_UIdent reduce using rule 30 + %eof reduce using rule 30 + + +State 89 + + Type1 -> '(' Type ')' . (rule 29) + + '(' reduce using rule 29 + ')' reduce using rule 29 + '+' reduce using rule 29 + '-' reduce using rule 29 + '.' reduce using rule 29 + '<' reduce using rule 29 + 'Char' reduce using rule 29 + 'Double' reduce using rule 29 + 'Int' reduce using rule 29 + 'String' reduce using rule 29 + 'else' reduce using rule 29 + 'then' reduce using rule 29 + 'λ' reduce using rule 29 + '→' reduce using rule 29 + '∀' reduce using rule 29 + L_Ident reduce using rule 29 + L_charac reduce using rule 29 + L_doubl reduce using rule 29 + L_integ reduce using rule 29 + L_quoted reduce using rule 29 + L_UIdent reduce using rule 29 + %eof reduce using rule 29 + + +State 90 + + Type -> 'λ' Ident ':' . Kind '.' Type (rule 32) + + '*' shift, and enter state 56 + + Kind goto state 94 + +State 91 + + Type -> '∀' Ident ':' . Kind '.' Type (rule 31) + + '*' shift, and enter state 56 + + Kind goto state 93 + +State 92 + + Kind1 -> Kind '→' Kind . (rule 22) + + %eof reduce using rule 22 + + +State 93 + + Type -> '∀' Ident ':' Kind . '.' Type (rule 31) + + '.' shift, and enter state 106 + + +State 94 + + Type -> 'λ' Ident ':' Kind . '.' Type (rule 32) + + '.' shift, and enter state 105 + + +State 95 + + Definition -> Ident ':' Type Ident . ListIdent '=' Exp (rule 20) + + '=' reduce using rule 36 + L_Ident shift, and enter state 14 + + Ident goto state 37 + ListIdent goto state 104 + +State 96 + + Type -> 'λ' Ident . ':' Kind '.' Type (rule 32) + Exp -> 'λ' Ident . ':' Type '.' Exp (rule 53) + + ':' shift, and enter state 103 + + +State 97 + + Exp -> 'λ' Ident ':' Type . '.' Exp (rule 53) + + '.' shift, and enter state 102 + + +State 98 + + Exp -> 'Λ' Ident ':' Kind . '.' Exp (rule 52) + + '.' shift, and enter state 101 + + +State 99 + + Exp -> 'if' Exp 'then' Exp . 'else' Exp (rule 51) + + 'else' shift, and enter state 100 + + +State 100 + + Exp -> 'if' Exp 'then' Exp 'else' . Exp (rule 51) + + '(' shift, and enter state 22 + 'if' shift, and enter state 31 + 'Λ' shift, and enter state 32 + 'λ' shift, and enter state 33 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 28 + Exp goto state 112 + Exp3 goto state 30 + +State 101 + + Exp -> 'Λ' Ident ':' Kind '.' . Exp (rule 52) + + '(' shift, and enter state 22 + 'if' shift, and enter state 31 + 'Λ' shift, and enter state 32 + 'λ' shift, and enter state 33 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 28 + Exp goto state 111 + Exp3 goto state 30 + +State 102 + + Exp -> 'λ' Ident ':' Type '.' . Exp (rule 53) + + '(' shift, and enter state 22 + 'if' shift, and enter state 31 + 'Λ' shift, and enter state 32 + 'λ' shift, and enter state 33 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 28 + Exp goto state 110 + Exp3 goto state 30 + +State 103 + + Type -> 'λ' Ident ':' . Kind '.' Type (rule 32) + Exp -> 'λ' Ident ':' . Type '.' Exp (rule 53) + + '(' shift, and enter state 45 + '*' shift, and enter state 56 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_UIdent shift, and enter state 52 + + UIdent goto state 42 + Kind goto state 94 + Type1 goto state 43 + Type goto state 97 + +State 104 + + Definition -> Ident ':' Type Ident ListIdent . '=' Exp (rule 20) + + '=' shift, and enter state 109 + + +State 105 + + Type -> 'λ' Ident ':' Kind '.' . Type (rule 32) + + '(' shift, and enter state 45 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_UIdent shift, and enter state 52 + + UIdent goto state 42 + Type1 goto state 43 + Type goto state 108 + +State 106 + + Type -> '∀' Ident ':' Kind '.' . Type (rule 31) + + '(' shift, and enter state 45 + 'Char' shift, and enter state 46 + 'Double' shift, and enter state 47 + 'Int' shift, and enter state 48 + 'String' shift, and enter state 49 + 'λ' shift, and enter state 50 + '∀' shift, and enter state 51 + L_UIdent shift, and enter state 52 + + UIdent goto state 42 + Type1 goto state 43 + Type goto state 107 + +State 107 + + Type -> '∀' Ident ':' Kind '.' Type . (rule 31) + + '(' reduce using rule 31 + ')' reduce using rule 31 + '+' reduce using rule 31 + '-' reduce using rule 31 + '.' reduce using rule 31 + '<' reduce using rule 31 + 'Char' reduce using rule 31 + 'Double' reduce using rule 31 + 'Int' reduce using rule 31 + 'String' reduce using rule 31 + 'else' reduce using rule 31 + 'then' reduce using rule 31 + 'λ' reduce using rule 31 + '∀' reduce using rule 31 + L_Ident reduce using rule 31 + L_charac reduce using rule 31 + L_doubl reduce using rule 31 + L_integ reduce using rule 31 + L_quoted reduce using rule 31 + L_UIdent reduce using rule 31 + %eof reduce using rule 31 + + +State 108 + + Type -> 'λ' Ident ':' Kind '.' Type . (rule 32) + + '(' reduce using rule 32 + ')' reduce using rule 32 + '+' reduce using rule 32 + '-' reduce using rule 32 + '.' reduce using rule 32 + '<' reduce using rule 32 + 'Char' reduce using rule 32 + 'Double' reduce using rule 32 + 'Int' reduce using rule 32 + 'String' reduce using rule 32 + 'else' reduce using rule 32 + 'then' reduce using rule 32 + 'λ' reduce using rule 32 + '∀' reduce using rule 32 + L_Ident reduce using rule 32 + L_charac reduce using rule 32 + L_doubl reduce using rule 32 + L_integ reduce using rule 32 + L_quoted reduce using rule 32 + L_UIdent reduce using rule 32 + %eof reduce using rule 32 + + +State 109 + + Definition -> Ident ':' Type Ident ListIdent '=' . Exp (rule 20) + + '(' shift, and enter state 22 + 'if' shift, and enter state 31 + 'Λ' shift, and enter state 32 + 'λ' shift, and enter state 33 + L_Ident shift, and enter state 14 + L_charac shift, and enter state 23 + L_doubl shift, and enter state 24 + L_integ shift, and enter state 25 + L_quoted shift, and enter state 26 + + Ident goto state 15 + Char goto state 16 + Double goto state 17 + Integer goto state 18 + String goto state 19 + Exp4 goto state 20 + Exp2 goto state 27 + Exp1 goto state 28 + Exp goto state 113 + Exp3 goto state 30 + +State 110 + + Exp -> 'λ' Ident ':' Type '.' Exp . (rule 53) + + ')' reduce using rule 53 + 'else' reduce using rule 53 + 'then' reduce using rule 53 + L_Ident reduce using rule 53 + %eof reduce using rule 53 + + +State 111 + + Exp -> 'Λ' Ident ':' Kind '.' Exp . (rule 52) + + ')' reduce using rule 52 + 'else' reduce using rule 52 + 'then' reduce using rule 52 + L_Ident reduce using rule 52 + %eof reduce using rule 52 + + +State 112 + + Exp -> 'if' Exp 'then' Exp 'else' Exp . (rule 51) + + ')' reduce using rule 51 + 'else' reduce using rule 51 + 'then' reduce using rule 51 + L_Ident reduce using rule 51 + %eof reduce using rule 51 + + +State 113 + + Definition -> Ident ':' Type Ident ListIdent '=' Exp . (rule 20) + + L_Ident reduce using rule 20 + %eof reduce using rule 20 + + +----------------------------------------------------------------------------- +Grammar Totals +----------------------------------------------------------------------------- +Number of rules: 56 +Number of terminals: 26 +Number of non-terminals: 32 +Number of states: 114 diff --git a/Alisaie/Par.y b/Alisaie/Par.y new file mode 100644 index 0000000..2970423 --- /dev/null +++ b/Alisaie/Par.y @@ -0,0 +1,182 @@ +-- -*- haskell -*- File generated by the BNF Converter (bnfc 2.9.6.1). + +-- Parser definition for use with Happy +{ +{-# OPTIONS_GHC -Wno-incomplete-patterns -Wno-overlapping-patterns #-} +{-# LANGUAGE PatternSynonyms #-} + +module Alisaie.Par + ( happyError + , myLexer + , pProgram + , pDefinition + , pKind + , pKind1 + , pType1 + , pType + , pListDefinition + , pListIdent + , pExp4 + , pExp2 + , pExp1 + , pExp + , pExp3 + ) where + +import Prelude + +import qualified Alisaie.Abs +import Alisaie.Lex +import qualified Data.Text + +} + +%name pProgram Program +%name pDefinition Definition +%name pKind Kind +%name pKind1 Kind1 +%name pType1 Type1 +%name pType Type +%name pListDefinition ListDefinition +%name pListIdent ListIdent +%name pExp4 Exp4 +%name pExp2 Exp2 +%name pExp1 Exp1 +%name pExp Exp +%name pExp3 Exp3 +-- no lexer declaration +%monad { Err } { (>>=) } { return } +%tokentype {Token} +%token + '(' { PT _ (TS _ 1) } + ')' { PT _ (TS _ 2) } + '*' { PT _ (TS _ 3) } + '+' { PT _ (TS _ 4) } + '-' { PT _ (TS _ 5) } + '.' { PT _ (TS _ 6) } + ':' { PT _ (TS _ 7) } + '<' { PT _ (TS _ 8) } + '=' { PT _ (TS _ 9) } + 'Char' { PT _ (TS _ 10) } + 'Double' { PT _ (TS _ 11) } + 'Int' { PT _ (TS _ 12) } + 'String' { PT _ (TS _ 13) } + 'else' { PT _ (TS _ 14) } + 'if' { PT _ (TS _ 15) } + 'then' { PT _ (TS _ 16) } + 'Λ' { PT _ (TS _ 17) } + 'λ' { PT _ (TS _ 18) } + '→' { PT _ (TS _ 19) } + '∀' { PT _ (TS _ 20) } + L_Ident { PT _ (TV $$) } + L_charac { PT _ (TC $$) } + L_doubl { PT _ (TD $$) } + L_integ { PT _ (TI $$) } + L_quoted { PT _ (TL $$) } + L_UIdent { PT _ (T_UIdent $$) } + +%% + +Ident :: { Alisaie.Abs.Ident } +Ident : L_Ident { Alisaie.Abs.Ident $1 } + +Char :: { Char } +Char : L_charac { (read (Data.Text.unpack $1)) :: Char } + +Double :: { Double } +Double : L_doubl { (read (Data.Text.unpack $1)) :: Double } + +Integer :: { Integer } +Integer : L_integ { (read (Data.Text.unpack $1)) :: Integer } + +String :: { String } +String : L_quoted { (Data.Text.unpack $1) } + +UIdent :: { Alisaie.Abs.UIdent } +UIdent : L_UIdent { Alisaie.Abs.UIdent $1 } + +Program :: { Alisaie.Abs.Program } +Program : ListDefinition { Alisaie.Abs.Prog $1 } + +Definition :: { Alisaie.Abs.Definition } +Definition + : Ident ':' Type Ident ListIdent '=' Exp { Alisaie.Abs.Def $1 $3 $4 $5 $7 } + +Kind :: { Alisaie.Abs.Kind } +Kind : '*' { Alisaie.Abs.KStar } + +Kind1 :: { Alisaie.Abs.Kind } +Kind1 : Kind '→' Kind { Alisaie.Abs.KArr $1 $3 } | Kind { $1 } + +Type1 :: { Alisaie.Abs.Type } +Type1 + : 'String' { Alisaie.Abs.TString } + | 'Int' { Alisaie.Abs.TInt } + | 'Double' { Alisaie.Abs.TDouble } + | 'Char' { Alisaie.Abs.TChar } + | UIdent { Alisaie.Abs.TCustom $1 } + | '(' Type ')' { $2 } + +Type :: { Alisaie.Abs.Type } +Type + : Type1 '→' Type { Alisaie.Abs.TArr $1 $3 } + | '∀' Ident ':' Kind '.' Type { Alisaie.Abs.TForall $2 $4 $6 } + | 'λ' Ident ':' Kind '.' Type { Alisaie.Abs.TLambda $2 $4 $6 } + | Type1 { $1 } + +ListDefinition :: { [Alisaie.Abs.Definition] } +ListDefinition + : {- empty -} { [] } | Definition ListDefinition { (:) $1 $2 } + +ListIdent :: { [Alisaie.Abs.Ident] } +ListIdent : {- empty -} { [] } | Ident ListIdent { (:) $1 $2 } + +Exp4 :: { Alisaie.Abs.Exp } +Exp4 + : Ident { Alisaie.Abs.EVar $1 } + | Integer { Alisaie.Abs.EInt $1 } + | Double { Alisaie.Abs.EDouble $1 } + | Char { Alisaie.Abs.EChar $1 } + | String { Alisaie.Abs.EText $1 } + | '(' Exp ')' { $2 } + +Exp2 :: { Alisaie.Abs.Exp } +Exp2 + : Exp2 Exp3 { Alisaie.Abs.EApp $1 $2 } + | Exp2 Type { Alisaie.Abs.ETApp $1 $2 } + | Exp3 { $1 } + +Exp1 :: { Alisaie.Abs.Exp } +Exp1 + : Exp1 '+' Exp2 { Alisaie.Abs.EAdd $1 $3 } + | Exp1 '-' Exp2 { Alisaie.Abs.ESub $1 $3 } + | Exp1 '<' Exp2 { Alisaie.Abs.ELt $1 $3 } + | Exp2 { $1 } + +Exp :: { Alisaie.Abs.Exp } +Exp + : 'if' Exp 'then' Exp 'else' Exp { Alisaie.Abs.EIf $2 $4 $6 } + | 'Λ' Ident ':' Kind '.' Exp { Alisaie.Abs.ETAbs $2 $4 $6 } + | 'λ' Ident ':' Type '.' Exp { Alisaie.Abs.EAbs $2 $4 $6 } + | Exp1 { $1 } + +Exp3 :: { Alisaie.Abs.Exp } +Exp3 : Exp4 { $1 } + +{ + +type Err = Either String + +happyError :: [Token] -> Err a +happyError ts = Left $ + "syntax error at " ++ tokenPos ts ++ + case ts of + [] -> [] + [Err _] -> " due to lexer error" + t:_ -> " before `" ++ (prToken t) ++ "'" + +myLexer :: Data.Text.Text -> [Token] +myLexer = tokens + +} + diff --git a/Alisaie/Parser.agda b/Alisaie/Parser.agda new file mode 100644 index 0000000..5aedaa3 --- /dev/null +++ b/Alisaie/Parser.agda @@ -0,0 +1,68 @@ +-- File generated by the BNF Converter (bnfc 2.9.6.1). + +-- Agda bindings for the Haskell parsers. + +module Alisaie.Parser where + +open import Agda.Builtin.Char using (Char) +open import Agda.Builtin.List using ([]; _∷_) renaming (List to #List) +open import Agda.Builtin.String using () renaming + ( String to #String + ; primStringFromList to #stringFromList + ) + +open import Alisaie.AST using + ( Program + ; Definition + ; Kind + ; Type + ; Ident + ; Exp + ) + +{-# FOREIGN GHC import Prelude (Bool, Char, Double, Integer, String, (.)) #-} +{-# FOREIGN GHC import qualified Data.Text #-} +{-# FOREIGN GHC import qualified Alisaie.ErrM #-} +{-# FOREIGN GHC import Alisaie.Par #-} + +-- Error monad of BNFC + +data Err A : Set where + ok : A → Err A + bad : #List Char → Err A + +{-# COMPILE GHC Err = data Alisaie.ErrM.Err + ( Alisaie.ErrM.Ok + | Alisaie.ErrM.Bad + ) #-} + +-- Happy parsers + +postulate + parseProgram : #String → Err Program + parseDefinition : #String → Err Definition + parseKind : #String → Err Kind + parseKind1 : #String → Err Kind + parseType1 : #String → Err Type + parseType : #String → Err Type + parseListDefinition : #String → Err (#List Definition) + parseListIdent : #String → Err (#List Ident) + parseExp4 : #String → Err Exp + parseExp2 : #String → Err Exp + parseExp1 : #String → Err Exp + parseExp : #String → Err Exp + parseExp3 : #String → Err Exp + +{-# COMPILE GHC parseProgram = pProgram . myLexer #-} +{-# COMPILE GHC parseDefinition = pDefinition . myLexer #-} +{-# COMPILE GHC parseKind = pKind . myLexer #-} +{-# COMPILE GHC parseKind1 = pKind1 . myLexer #-} +{-# COMPILE GHC parseType1 = pType1 . myLexer #-} +{-# COMPILE GHC parseType = pType . myLexer #-} +{-# COMPILE GHC parseListDefinition = pListDefinition . myLexer #-} +{-# COMPILE GHC parseListIdent = pListIdent . myLexer #-} +{-# COMPILE GHC parseExp4 = pExp4 . myLexer #-} +{-# COMPILE GHC parseExp2 = pExp2 . myLexer #-} +{-# COMPILE GHC parseExp1 = pExp1 . myLexer #-} +{-# COMPILE GHC parseExp = pExp . myLexer #-} +{-# COMPILE GHC parseExp3 = pExp3 . myLexer #-} diff --git a/Alisaie/Print.hs b/Alisaie/Print.hs new file mode 100644 index 0000000..4285e21 --- /dev/null +++ b/Alisaie/Print.hs @@ -0,0 +1,188 @@ +-- File generated by the BNF Converter (bnfc 2.9.6.1). + +{-# LANGUAGE CPP #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE LambdaCase #-} + +-- | Pretty-printer for Alisaie. + +module Alisaie.Print where + +import Prelude + ( ($), (.) + , Bool(..), (==), (<) + , Int, Integer, Double, (+), (-), (*) + , String, (++) + , ShowS, showChar, showString + , all, elem, foldr, id, map, null, replicate, shows, span + ) +import Data.Char ( Char, isSpace ) +import qualified Alisaie.Abs +import qualified Data.Text + +-- | The top-level printing method. + +printTree :: Print a => a -> String +printTree = render . prt 0 + +type Doc = [ShowS] -> [ShowS] + +doc :: ShowS -> Doc +doc = (:) + +render :: Doc -> String +render d = rend 0 False (map ($ "") $ d []) "" + where + rend + :: Int -- ^ Indentation level. + -> Bool -- ^ Pending indentation to be output before next character? + -> [String] + -> ShowS + rend i p = \case + "[" :ts -> char '[' . rend i False ts + "(" :ts -> char '(' . rend i False ts + "{" :ts -> onNewLine i p . showChar '{' . new (i+1) ts + "}" : ";":ts -> onNewLine (i-1) p . showString "};" . new (i-1) ts + "}" :ts -> onNewLine (i-1) p . showChar '}' . new (i-1) ts + [";"] -> char ';' + ";" :ts -> char ';' . new i ts + t : ts@(s:_) | closingOrPunctuation s + -> pending . showString t . rend i False ts + t :ts -> pending . space t . rend i False ts + [] -> id + where + -- Output character after pending indentation. + char :: Char -> ShowS + char c = pending . showChar c + + -- Output pending indentation. + pending :: ShowS + pending = if p then indent i else id + + -- Indentation (spaces) for given indentation level. + indent :: Int -> ShowS + indent i = replicateS (2*i) (showChar ' ') + + -- Continue rendering in new line with new indentation. + new :: Int -> [String] -> ShowS + new j ts = showChar '\n' . rend j True ts + + -- Make sure we are on a fresh line. + onNewLine :: Int -> Bool -> ShowS + onNewLine i p = (if p then id else showChar '\n') . indent i + + -- Separate given string from following text by a space (if needed). + space :: String -> ShowS + space t s = + case (all isSpace t, null spc, null rest) of + (True , _ , True ) -> [] -- remove trailing space + (False, _ , True ) -> t -- remove trailing space + (False, True, False) -> t ++ ' ' : s -- add space if none + _ -> t ++ s + where + (spc, rest) = span isSpace s + + closingOrPunctuation :: String -> Bool + closingOrPunctuation [c] = c `elem` closerOrPunct + closingOrPunctuation _ = False + + closerOrPunct :: String + closerOrPunct = ")],;" + +parenth :: Doc -> Doc +parenth ss = doc (showChar '(') . ss . doc (showChar ')') + +concatS :: [ShowS] -> ShowS +concatS = foldr (.) id + +concatD :: [Doc] -> Doc +concatD = foldr (.) id + +replicateS :: Int -> ShowS -> ShowS +replicateS n f = concatS (replicate n f) + +-- | The printer class does the job. + +class Print a where + prt :: Int -> a -> Doc + +instance {-# OVERLAPPABLE #-} Print a => Print [a] where + prt i = concatD . map (prt i) + +instance Print Char where + prt _ c = doc (showChar '\'' . mkEsc '\'' c . showChar '\'') + +instance Print String where + prt _ = printString + +printString :: String -> Doc +printString s = doc (showChar '"' . concatS (map (mkEsc '"') s) . showChar '"') + +mkEsc :: Char -> Char -> ShowS +mkEsc q = \case + s | s == q -> showChar '\\' . showChar s + '\\' -> showString "\\\\" + '\n' -> showString "\\n" + '\t' -> showString "\\t" + s -> showChar s + +prPrec :: Int -> Int -> Doc -> Doc +prPrec i j = if j < i then parenth else id + +instance Print Integer where + prt _ x = doc (shows x) + +instance Print Double where + prt _ x = doc (shows x) + +instance Print Alisaie.Abs.Ident where + prt _ (Alisaie.Abs.Ident i) = doc $ showString (Data.Text.unpack i) +instance Print Alisaie.Abs.UIdent where + prt _ (Alisaie.Abs.UIdent i) = doc $ showString (Data.Text.unpack i) +instance Print Alisaie.Abs.Program where + prt i = \case + Alisaie.Abs.Prog definitions -> prPrec i 0 (concatD [prt 0 definitions]) + +instance Print Alisaie.Abs.Definition where + prt i = \case + Alisaie.Abs.Def id_1 type_ id_2 ids exp -> prPrec i 0 (concatD [prt 0 id_1, doc (showString ":"), prt 0 type_, prt 0 id_2, prt 0 ids, doc (showString "="), prt 0 exp]) + +instance Print Alisaie.Abs.Kind where + prt i = \case + Alisaie.Abs.KStar -> prPrec i 0 (concatD [doc (showString "*")]) + Alisaie.Abs.KArr kind1 kind2 -> prPrec i 1 (concatD [prt 0 kind1, doc (showString "\8594"), prt 0 kind2]) + +instance Print Alisaie.Abs.Type where + prt i = \case + Alisaie.Abs.TString -> prPrec i 1 (concatD [doc (showString "String")]) + Alisaie.Abs.TInt -> prPrec i 1 (concatD [doc (showString "Int")]) + Alisaie.Abs.TDouble -> prPrec i 1 (concatD [doc (showString "Double")]) + Alisaie.Abs.TChar -> prPrec i 1 (concatD [doc (showString "Char")]) + Alisaie.Abs.TCustom uident -> prPrec i 1 (concatD [prt 0 uident]) + Alisaie.Abs.TArr type_1 type_2 -> prPrec i 0 (concatD [prt 1 type_1, doc (showString "\8594"), prt 0 type_2]) + Alisaie.Abs.TForall id_ kind type_ -> prPrec i 0 (concatD [doc (showString "\8704"), prt 0 id_, doc (showString ":"), prt 0 kind, doc (showString "."), prt 0 type_]) + Alisaie.Abs.TLambda id_ kind type_ -> prPrec i 0 (concatD [doc (showString "\955"), prt 0 id_, doc (showString ":"), prt 0 kind, doc (showString "."), prt 0 type_]) + +instance Print [Alisaie.Abs.Definition] where + prt _ [] = concatD [] + prt _ (x:xs) = concatD [prt 0 x, prt 0 xs] + +instance Print [Alisaie.Abs.Ident] where + prt _ [] = concatD [] + prt _ (x:xs) = concatD [prt 0 x, prt 0 xs] + +instance Print Alisaie.Abs.Exp where + prt i = \case + Alisaie.Abs.EVar id_ -> prPrec i 4 (concatD [prt 0 id_]) + Alisaie.Abs.EInt n -> prPrec i 4 (concatD [prt 0 n]) + Alisaie.Abs.EDouble d -> prPrec i 4 (concatD [prt 0 d]) + Alisaie.Abs.EChar c -> prPrec i 4 (concatD [prt 0 c]) + Alisaie.Abs.EText str -> prPrec i 4 (concatD [printString str]) + Alisaie.Abs.EApp exp1 exp2 -> prPrec i 2 (concatD [prt 2 exp1, prt 3 exp2]) + Alisaie.Abs.ETApp exp type_ -> prPrec i 2 (concatD [prt 2 exp, prt 0 type_]) + Alisaie.Abs.EAdd exp1 exp2 -> prPrec i 1 (concatD [prt 1 exp1, doc (showString "+"), prt 2 exp2]) + Alisaie.Abs.ESub exp1 exp2 -> prPrec i 1 (concatD [prt 1 exp1, doc (showString "-"), prt 2 exp2]) + Alisaie.Abs.ELt exp1 exp2 -> prPrec i 1 (concatD [prt 1 exp1, doc (showString "<"), prt 2 exp2]) + Alisaie.Abs.EIf exp1 exp2 exp3 -> prPrec i 0 (concatD [doc (showString "if"), prt 0 exp1, doc (showString "then"), prt 0 exp2, doc (showString "else"), prt 0 exp3]) + Alisaie.Abs.ETAbs id_ kind exp -> prPrec i 0 (concatD [doc (showString "\923"), prt 0 id_, doc (showString ":"), prt 0 kind, doc (showString "."), prt 0 exp]) + Alisaie.Abs.EAbs id_ type_ exp -> prPrec i 0 (concatD [doc (showString "\955"), prt 0 id_, doc (showString ":"), prt 0 type_, doc (showString "."), prt 0 exp]) diff --git a/Alisaie/Skel.hs b/Alisaie/Skel.hs new file mode 100644 index 0000000..ac69917 --- /dev/null +++ b/Alisaie/Skel.hs @@ -0,0 +1,64 @@ +-- File generated by the BNF Converter (bnfc 2.9.6.1). + +-- Templates for pattern matching on abstract syntax + +{-# OPTIONS_GHC -Wno-unused-matches #-} + +module Alisaie.Skel where + +import Prelude (($), Either(..), String, (++), Show, show) +import qualified Alisaie.Abs + +type Err = Either String +type Result = Err String + +failure :: Show a => a -> Result +failure x = Left $ "Undefined case: " ++ show x + +transIdent :: Alisaie.Abs.Ident -> Result +transIdent x = case x of + Alisaie.Abs.Ident string -> failure x + +transUIdent :: Alisaie.Abs.UIdent -> Result +transUIdent x = case x of + Alisaie.Abs.UIdent string -> failure x + +transProgram :: Alisaie.Abs.Program -> Result +transProgram x = case x of + Alisaie.Abs.Prog definitions -> failure x + +transDefinition :: Alisaie.Abs.Definition -> Result +transDefinition x = case x of + Alisaie.Abs.Def ident1 type_ ident2 idents exp -> failure x + +transKind :: Alisaie.Abs.Kind -> Result +transKind x = case x of + Alisaie.Abs.KStar -> failure x + Alisaie.Abs.KArr kind1 kind2 -> failure x + +transType :: Alisaie.Abs.Type -> Result +transType x = case x of + Alisaie.Abs.TString -> failure x + Alisaie.Abs.TInt -> failure x + Alisaie.Abs.TDouble -> failure x + Alisaie.Abs.TChar -> failure x + Alisaie.Abs.TCustom uident -> failure x + Alisaie.Abs.TArr type_1 type_2 -> failure x + Alisaie.Abs.TForall ident kind type_ -> failure x + Alisaie.Abs.TLambda ident kind type_ -> failure x + +transExp :: Alisaie.Abs.Exp -> Result +transExp x = case x of + Alisaie.Abs.EVar ident -> failure x + Alisaie.Abs.EInt integer -> failure x + Alisaie.Abs.EDouble double -> failure x + Alisaie.Abs.EChar char -> failure x + Alisaie.Abs.EText string -> failure x + Alisaie.Abs.EApp exp1 exp2 -> failure x + Alisaie.Abs.ETApp exp type_ -> failure x + Alisaie.Abs.EAdd exp1 exp2 -> failure x + Alisaie.Abs.ESub exp1 exp2 -> failure x + Alisaie.Abs.ELt exp1 exp2 -> failure x + Alisaie.Abs.EIf exp1 exp2 exp3 -> failure x + Alisaie.Abs.ETAbs ident kind exp -> failure x + Alisaie.Abs.EAbs ident type_ exp -> failure x diff --git a/Alisaie/Test.hs b/Alisaie/Test.hs new file mode 100644 index 0000000..3b59bca --- /dev/null +++ b/Alisaie/Test.hs @@ -0,0 +1,77 @@ +-- File generated by the BNF Converter (bnfc 2.9.6.1). + +-- | Program to test parser. + +module Main where + +import Prelude + ( ($), (.) + , Either(..) + , Int, (>) + , String, (++), concat, unlines + , Show, show + , IO, (>>), (>>=), mapM_, putStrLn + , FilePath + ) +import Data.Text.IO ( getContents, readFile ) +import qualified Data.Text +import System.Environment ( getArgs ) +import System.Exit ( exitFailure ) +import Control.Monad ( when ) + +import Alisaie.Abs () +import Alisaie.Lex ( Token, mkPosToken ) +import Alisaie.Par ( pProgram, myLexer ) +import Alisaie.Print ( Print, printTree ) +import Alisaie.Skel () + +type Err = Either String +type ParseFun a = [Token] -> Err a +type Verbosity = Int + +putStrV :: Verbosity -> String -> IO () +putStrV v s = when (v > 1) $ putStrLn s + +runFile :: (Print a, Show a) => Verbosity -> ParseFun a -> FilePath -> IO () +runFile v p f = putStrLn f >> readFile f >>= run v p + +run :: (Print a, Show a) => Verbosity -> ParseFun a -> Data.Text.Text -> IO () +run v p s = + case p ts of + Left err -> do + putStrLn "\nParse Failed...\n" + putStrV v "Tokens:" + mapM_ (putStrV v . showPosToken . mkPosToken) ts + putStrLn err + exitFailure + Right tree -> do + putStrLn "\nParse Successful!" + showTree v tree + where + ts = myLexer s + showPosToken ((l,c),t) = concat [ show l, ":", show c, "\t", show t ] + +showTree :: (Show a, Print a) => Int -> a -> IO () +showTree v tree = do + putStrV v $ "\n[Abstract Syntax]\n\n" ++ show tree + putStrV v $ "\n[Linearized tree]\n\n" ++ printTree tree + +usage :: IO () +usage = do + putStrLn $ unlines + [ "usage: Call with one of the following argument combinations:" + , " --help Display this help message." + , " (no arguments) Parse stdin verbosely." + , " (files) Parse content of files verbosely." + , " -s (files) Silent mode. Parse content of files silently." + ] + +main :: IO () +main = do + args <- getArgs + case args of + ["--help"] -> usage + [] -> getContents >>= run 2 pProgram + "-s":fs -> mapM_ (runFile 0 pProgram) fs + fs -> mapM_ (runFile 2 pProgram) fs + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bade7fb --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +## File generated by the BNF Converter (bnfc 2.9.6.1). + +# Makefile for building the parser and test program. + +AGDA = agda +GHC = ghc +HAPPY = happy +HAPPY_OPTS = --array --info --ghc --coerce +ALEX = alex +ALEX_OPTS = --ghc + +# List of goals not corresponding to file names. + +.PHONY : all clean distclean + +# Default goal. + +all : Alisaie/Test Main + +# Rules for building the parser. + +Alisaie/Abs.hs Alisaie/Lex.x Alisaie/Par.y Alisaie/Print.hs Alisaie/Test.hs Alisaie/AST.agda Alisaie/Parser.agda Alisaie/IOLib.agda Alisaie/Main.agda : Alisaie.cf + bnfc --haskell -d --agda Alisaie.cf + +%.hs : %.y + ${HAPPY} ${HAPPY_OPTS} $< + +%.hs : %.x + ${ALEX} ${ALEX_OPTS} $< + +Alisaie/Test : Alisaie/Abs.hs Alisaie/Lex.hs Alisaie/Par.hs Alisaie/Print.hs Alisaie/Test.hs + ${GHC} ${GHC_OPTS} $@ + +Main : Alisaie/Main.agda Alisaie/AST.agda Alisaie/Parser.agda Alisaie/IOLib.agda Alisaie/ErrM.hs Alisaie/Lex.hs Alisaie/Par.hs Alisaie/Print.hs + ${AGDA} --no-libraries --ghc --ghc-flag=-Wwarn $< + +# Rules for cleaning generated files. + +clean : + -rm -f Alisaie/*.hi Alisaie/*.o Alisaie/*.log Alisaie/*.aux Alisaie/*.dvi Alisaie/*.agdai + -rm -rf MAlonzo + +distclean : clean + -rm -f Alisaie/Abs.hs Alisaie/Abs.hs.bak Alisaie/ComposOp.hs Alisaie/ComposOp.hs.bak Alisaie/Doc.txt Alisaie/Doc.txt.bak Alisaie/ErrM.hs Alisaie/ErrM.hs.bak Alisaie/Layout.hs Alisaie/Layout.hs.bak Alisaie/Lex.x Alisaie/Lex.x.bak Alisaie/Par.y Alisaie/Par.y.bak Alisaie/Print.hs Alisaie/Print.hs.bak Alisaie/Skel.hs Alisaie/Skel.hs.bak Alisaie/Test.hs Alisaie/Test.hs.bak Alisaie/XML.hs Alisaie/XML.hs.bak Alisaie/AST.agda Alisaie/AST.agda.bak Alisaie/Parser.agda Alisaie/Parser.agda.bak Alisaie/IOLib.agda Alisaie/IOLib.agda.bak Alisaie/Main.agda Alisaie/Main.agda.bak Alisaie/Alisaie.dtd Alisaie/Alisaie.dtd.bak Alisaie/Test Alisaie/Lex.hs Alisaie/Par.hs Alisaie/Par.info Alisaie/ParData.hs Main Makefile + -rmdir -p Alisaie/ + +# EOF diff --git a/example.ali b/example.ali new file mode 100644 index 0000000..095ddc9 --- /dev/null +++ b/example.ali @@ -0,0 +1,2 @@ +main : IO () +main = putStrLn "Hejsan" diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..0e03ef5 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1763759067, + "narHash": "sha256-LlLt2Jo/gMNYAwOgdRQBrsRoOz7BPRkzvNaI/fzXi2Q=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "2cccadc7357c0ba201788ae99c4dfa90728ef5e0", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1764242076, + "narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1761765539, + "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..4e22066 --- /dev/null +++ b/flake.nix @@ -0,0 +1,40 @@ +{ + description = "Alisaie"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-parts.url = "github:hercules-ci/flake-parts"; + }; + + outputs = inputs@{ nixpkgs, flake-parts, ... }: + flake-parts.lib.mkFlake {inherit inputs;} { + systems = [ + "x86_64-linux" + ]; + + perSystem = {self', pkgs, system, ...}: { + + # packages.default = self'.packages.alisaie; + # packages.alisaie = pkgs.stdenv.mkDerivation { + # pname = "Alisaie"; + # version = "0.0.1"; + + # src = ./.; + + # nativeBuildInputs = with pkgs; [ ]; + # buildInputs = [ ]; + + # }; + + devShells.default = pkgs.mkShell { + packages = with pkgs; [ + (agda.withPackages (p: with p; [ standard-library ])) + (haskellPackages.BNFC) + (haskellPackages.alex) + (haskellPackages.happy) + ]; + }; + + }; + }; +}