From f35b1934a322d18621281610902f2d1e68e995c5 Mon Sep 17 00:00:00 2001 From: V0ldek Date: Tue, 1 Dec 2020 18:52:52 +0100 Subject: [PATCH] Semantic analysis. --- ChangeLog.md | 4 +- LICENSE | 31 +- Latte.cabal | 18 +- Makefile | 6 + README.md | 134 ++- app/Main.hs | 17 +- package.yaml | 12 +- src/ErrM.hs | 3 +- src/Error.hs | 35 +- src/Identifiers.hs | 31 + src/SemanticAnalysis/Analyser.hs | 793 +++++++++++++++++- src/SemanticAnalysis/Class.hs | 251 +++--- src/SemanticAnalysis/ControlFlow.hs | 81 ++ src/SemanticAnalysis/Toplevel.hs | 85 +- src/Syntax/Abs.hs | 25 +- src/Syntax/Code.hs | 20 + src/Syntax/Latte.cf | 7 +- src/Syntax/Lexer.hs | 23 +- src/Syntax/Parser.hs | 542 ++++-------- src/Syntax/Printer.hs | 7 +- src/Syntax/Rewriter.hs | 204 +++++ stack.yaml | 2 + test/SemanticAnalysis/AcceptanceSpec.hs | 20 +- test/lattests/bad/assignmentToFunction.err | 4 + test/lattests/bad/assignmentToFunction.lat | 13 + test/lattests/bad/assignmentToRvalue.err | 4 + test/lattests/bad/assignmentToRvalue.lat | 4 + test/lattests/bad/bad006.err | 4 +- test/lattests/bad/bad007.err | 5 +- test/lattests/bad/bad008.err | 6 +- test/lattests/bad/bad009.err | 4 +- test/lattests/bad/bad010.err | 4 +- test/lattests/bad/bad011.err | 4 +- test/lattests/bad/bad012.err | 6 +- test/lattests/bad/bad013.err | 4 +- test/lattests/bad/bad015.err | 5 +- test/lattests/bad/bad016.err | 5 +- test/lattests/bad/bad017.err | 4 +- test/lattests/bad/bad018.err | 4 +- test/lattests/bad/bad019.err | 4 +- test/lattests/bad/bad020.err | 4 +- test/lattests/bad/bad021.err | 5 +- test/lattests/bad/bad022.err | 4 +- test/lattests/bad/bad023.err | 4 +- test/lattests/bad/bad024.err | 6 +- test/lattests/bad/bad025.err | 6 +- test/lattests/bad/bad026.err | 4 +- test/lattests/bad/bad027.err | 4 +- test/lattests/bad/callToNonFunction.err | 4 + test/lattests/bad/callToNonFunction.lat | 4 + test/lattests/bad/declInFor.err | 4 + test/lattests/bad/declInFor.lat | 9 + test/lattests/bad/declInIf.err | 4 + test/lattests/bad/declInIf.lat | 9 + test/lattests/bad/declInIfElse.err | 4 + test/lattests/bad/declInIfElse.lat | 10 + test/lattests/bad/declInWhile.err | 4 + test/lattests/bad/declInWhile.lat | 9 + test/lattests/bad/parameterOfVoidType.err | 4 + test/lattests/bad/parameterOfVoidType.lat | 4 + .../lattests/bad/useForVariableOutsideVar.err | 4 + .../lattests/bad/useForVariableOutsideVar.lat | 9 + test/lattests/bad/variableOfVoidType.err | 4 + test/lattests/bad/variableOfVoidType.lat | 4 + .../objects1/bad/duplicateMethods.lat | 2 +- .../bad/fieldAndMethodOfTheSameName.err | 6 + .../bad/fieldAndMethodOfTheSameName.lat | 7 + .../objects1/bad/fieldNamedSelf.err | 6 + .../objects1/bad/fieldNamedSelf.lat | 5 + .../objects1/bad/fieldOfNonexistentType.err | 4 + .../objects1/bad/fieldOfNonexistentType.lat | 5 + .../extensions/objects1/bad/fieldVoidType.err | 4 + .../extensions/objects1/bad/fieldVoidType.lat | 5 + .../objects1/bad/methodNamedSelf.err | 6 + .../objects1/bad/methodNamedSelf.lat | 5 + .../bad/newArrayOfNonexistentType.err | 4 + .../bad/newArrayOfNonexistentType.lat | 4 + .../objects1/bad/newOffNonexistentType.err | 4 + .../objects1/bad/newOffNonexistentType.lat | 4 + .../extensions/objects1/bad/newVoid.err | 4 + .../extensions/objects1/bad/newVoid.lat | 4 + .../extensions/objects1/bad/newVoidArray.err | 4 + .../extensions/objects1/bad/newVoidArray.lat | 4 + .../bad/nullCastToNonexistentType.err | 4 + .../bad/nullCastToNonexistentType.lat | 4 + .../extensions/objects1/bad/nullVoid.err | 2 + .../extensions/objects1/bad/nullVoid.lat | 4 + .../bad/parameterOfNonexistentType.err | 4 + .../bad/parameterOfNonexistentType.lat | 4 + .../objects1/bad/redefinedMethodFromBase.err | 7 + .../objects1/bad/redefinedMethodFromBase.lat | 11 - .../objects1/bad/returnOfNonexistentType.err | 5 + .../objects1/bad/returnOfNonexistentType.lat | 3 + .../bad/variableOfNonexistentType.err | 4 + .../bad/variableOfNonexistentType.lat | 5 + .../objects1/good/redefinedMethodFromBase.lat | 20 - .../good/redefinedMethodFromBase.output | 2 - test/lattests/extensions/var/bad/varInArg.err | 4 + test/lattests/extensions/var/bad/varInArg.lat | 1 + .../lattests/extensions/var/bad/varInCast.err | 2 + .../lattests/extensions/var/bad/varInCast.lat | 4 + .../extensions/var/bad/varInField.err | 4 + .../extensions/var/bad/varInField.lat | 3 + .../var/bad/varInFunctionReturn.err | 6 + .../var/bad/varInFunctionReturn.lat | 7 + .../extensions/var/bad/varInMethodReturn.err | 6 + .../extensions/var/bad/varInMethodReturn.lat | 3 + .../var/bad/varInMultiItemWithoutInit.err | 4 + .../var/bad/varInMultiItemWithoutInit.lat | 5 + test/lattests/extensions/var/bad/varInNew.err | 4 + test/lattests/extensions/var/bad/varInNew.lat | 11 + .../extensions/var/bad/varInNewArr.err | 4 + .../extensions/var/bad/varInNewArr.lat | 11 + .../good/var001.err} | 0 test/lattests/extensions/var/good/var001.lat | 4 + test/lattests/extensions/var/good/var001.out | 0 test/lattests/extensions/var/good/var002.err | 1 + test/lattests/extensions/var/good/var002.lat | 16 + test/lattests/extensions/var/good/var002.out | 3 + test/lattests/extensions/var/good/var003.err | 1 + test/lattests/extensions/var/good/var003.lat | 14 + test/lattests/extensions/var/good/var003.out | 1 + test/lattests/extensions/var/good/var004.err | 1 + test/lattests/extensions/var/good/var004.lat | 4 + test/lattests/extensions/var/good/var004.out | 0 test/lattests/good/constexprInIf.err | 1 + test/lattests/good/constexprInIf.lat | 5 + test/lattests/good/constexprInIf.out | 0 test/lattests/good/constexprInWhile.err | 1 + test/lattests/good/constexprInWhile.lat | 5 + test/lattests/good/constexprInWhile.out | 0 131 files changed, 2233 insertions(+), 631 deletions(-) create mode 100644 Makefile create mode 100644 src/Identifiers.hs create mode 100644 src/SemanticAnalysis/ControlFlow.hs create mode 100644 src/Syntax/Code.hs create mode 100644 src/Syntax/Rewriter.hs create mode 100644 test/lattests/bad/assignmentToFunction.err create mode 100644 test/lattests/bad/assignmentToFunction.lat create mode 100644 test/lattests/bad/assignmentToRvalue.err create mode 100644 test/lattests/bad/assignmentToRvalue.lat create mode 100644 test/lattests/bad/callToNonFunction.err create mode 100644 test/lattests/bad/callToNonFunction.lat create mode 100644 test/lattests/bad/declInFor.err create mode 100644 test/lattests/bad/declInFor.lat create mode 100644 test/lattests/bad/declInIf.err create mode 100644 test/lattests/bad/declInIf.lat create mode 100644 test/lattests/bad/declInIfElse.err create mode 100644 test/lattests/bad/declInIfElse.lat create mode 100644 test/lattests/bad/declInWhile.err create mode 100644 test/lattests/bad/declInWhile.lat create mode 100644 test/lattests/bad/parameterOfVoidType.err create mode 100644 test/lattests/bad/parameterOfVoidType.lat create mode 100644 test/lattests/bad/useForVariableOutsideVar.err create mode 100644 test/lattests/bad/useForVariableOutsideVar.lat create mode 100644 test/lattests/bad/variableOfVoidType.err create mode 100644 test/lattests/bad/variableOfVoidType.lat create mode 100644 test/lattests/extensions/objects1/bad/fieldAndMethodOfTheSameName.err create mode 100644 test/lattests/extensions/objects1/bad/fieldAndMethodOfTheSameName.lat create mode 100644 test/lattests/extensions/objects1/bad/fieldNamedSelf.err create mode 100644 test/lattests/extensions/objects1/bad/fieldNamedSelf.lat create mode 100644 test/lattests/extensions/objects1/bad/fieldOfNonexistentType.err create mode 100644 test/lattests/extensions/objects1/bad/fieldOfNonexistentType.lat create mode 100644 test/lattests/extensions/objects1/bad/fieldVoidType.err create mode 100644 test/lattests/extensions/objects1/bad/fieldVoidType.lat create mode 100644 test/lattests/extensions/objects1/bad/methodNamedSelf.err create mode 100644 test/lattests/extensions/objects1/bad/methodNamedSelf.lat create mode 100644 test/lattests/extensions/objects1/bad/newArrayOfNonexistentType.err create mode 100644 test/lattests/extensions/objects1/bad/newArrayOfNonexistentType.lat create mode 100644 test/lattests/extensions/objects1/bad/newOffNonexistentType.err create mode 100644 test/lattests/extensions/objects1/bad/newOffNonexistentType.lat create mode 100644 test/lattests/extensions/objects1/bad/newVoid.err create mode 100644 test/lattests/extensions/objects1/bad/newVoid.lat create mode 100644 test/lattests/extensions/objects1/bad/newVoidArray.err create mode 100644 test/lattests/extensions/objects1/bad/newVoidArray.lat create mode 100644 test/lattests/extensions/objects1/bad/nullCastToNonexistentType.err create mode 100644 test/lattests/extensions/objects1/bad/nullCastToNonexistentType.lat create mode 100644 test/lattests/extensions/objects1/bad/nullVoid.err create mode 100644 test/lattests/extensions/objects1/bad/nullVoid.lat create mode 100644 test/lattests/extensions/objects1/bad/parameterOfNonexistentType.err create mode 100644 test/lattests/extensions/objects1/bad/parameterOfNonexistentType.lat create mode 100644 test/lattests/extensions/objects1/bad/returnOfNonexistentType.err create mode 100644 test/lattests/extensions/objects1/bad/returnOfNonexistentType.lat create mode 100644 test/lattests/extensions/objects1/bad/variableOfNonexistentType.err create mode 100644 test/lattests/extensions/objects1/bad/variableOfNonexistentType.lat delete mode 100644 test/lattests/extensions/objects1/good/redefinedMethodFromBase.lat delete mode 100644 test/lattests/extensions/objects1/good/redefinedMethodFromBase.output create mode 100644 test/lattests/extensions/var/bad/varInArg.err create mode 100644 test/lattests/extensions/var/bad/varInArg.lat create mode 100644 test/lattests/extensions/var/bad/varInCast.err create mode 100644 test/lattests/extensions/var/bad/varInCast.lat create mode 100644 test/lattests/extensions/var/bad/varInField.err create mode 100644 test/lattests/extensions/var/bad/varInField.lat create mode 100644 test/lattests/extensions/var/bad/varInFunctionReturn.err create mode 100644 test/lattests/extensions/var/bad/varInFunctionReturn.lat create mode 100644 test/lattests/extensions/var/bad/varInMethodReturn.err create mode 100644 test/lattests/extensions/var/bad/varInMethodReturn.lat create mode 100644 test/lattests/extensions/var/bad/varInMultiItemWithoutInit.err create mode 100644 test/lattests/extensions/var/bad/varInMultiItemWithoutInit.lat create mode 100644 test/lattests/extensions/var/bad/varInNew.err create mode 100644 test/lattests/extensions/var/bad/varInNew.lat create mode 100644 test/lattests/extensions/var/bad/varInNewArr.err create mode 100644 test/lattests/extensions/var/bad/varInNewArr.lat rename test/lattests/extensions/{objects1/good/redefinedMethodFromBase.err => var/good/var001.err} (100%) create mode 100644 test/lattests/extensions/var/good/var001.lat create mode 100644 test/lattests/extensions/var/good/var001.out create mode 100644 test/lattests/extensions/var/good/var002.err create mode 100644 test/lattests/extensions/var/good/var002.lat create mode 100644 test/lattests/extensions/var/good/var002.out create mode 100644 test/lattests/extensions/var/good/var003.err create mode 100644 test/lattests/extensions/var/good/var003.lat create mode 100644 test/lattests/extensions/var/good/var003.out create mode 100644 test/lattests/extensions/var/good/var004.err create mode 100644 test/lattests/extensions/var/good/var004.lat create mode 100644 test/lattests/extensions/var/good/var004.out create mode 100644 test/lattests/good/constexprInIf.err create mode 100644 test/lattests/good/constexprInIf.lat create mode 100644 test/lattests/good/constexprInIf.out create mode 100644 test/lattests/good/constexprInWhile.err create mode 100644 test/lattests/good/constexprInWhile.lat create mode 100644 test/lattests/good/constexprInWhile.out diff --git a/ChangeLog.md b/ChangeLog.md index d144602..e4acac5 100755 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,5 @@ # Changelog for Latte -## Unreleased changes +## 0.8 + +- Added the frontend including the Lexer, Parser, Rewriter and Analyser. \ No newline at end of file diff --git a/LICENSE b/LICENSE index e637cde..9df46f2 100755 --- a/LICENSE +++ b/LICENSE @@ -1,30 +1,7 @@ -Copyright Author name here (c) 2020 +Copyright 2020 Mateusz Gienieczko -All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * Neither the name of Author name here nor the names of other - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Latte.cabal b/Latte.cabal index b1c3d1d..dd1e139 100755 --- a/Latte.cabal +++ b/Latte.cabal @@ -4,17 +4,17 @@ cabal-version: 1.12 -- -- see: https://github.com/sol/hpack -- --- hash: 4430bb9e814179e64c9ec984db92aeb927e5057861af8e70424ca3e88bd2d911 +-- hash: 07a5b34f37f9b22ff69be83173953e37bf15964dd876bd3357dcc6e7e900a54a name: Latte -version: 0.1.0.0 -description: Please see the README on GitHub at +version: 0.8.0.0 +description: Please see the README on GitHub at homepage: https://github.com/githubuser/Latte#readme bug-reports: https://github.com/githubuser/Latte/issues -author: Author name here -maintainer: example@example.com -copyright: 2020 Author name here -license: BSD3 +author: Mateusz Gienieczko +maintainer: matgienieczko@gmail.com +copyright: 2020 Mateusz Gienieczko +license: MIT license-file: LICENSE build-type: Simple extra-source-files: @@ -29,13 +29,17 @@ library exposed-modules: ErrM Error + Identifiers SemanticAnalysis.Analyser SemanticAnalysis.Class + SemanticAnalysis.ControlFlow SemanticAnalysis.Toplevel Syntax.Abs + Syntax.Code Syntax.Lexer Syntax.Parser Syntax.Printer + Syntax.Rewriter other-modules: Paths_Latte hs-source-dirs: diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b573299 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +all: + stack build --copy-bins + +clean: + stack clean + rm -f latc \ No newline at end of file diff --git a/README.md b/README.md index 82688bd..0f873b3 100755 --- a/README.md +++ b/README.md @@ -1 +1,133 @@ -# Latte +# Latte v0.8 + +Compiler of the [Latte programming language](https://www.mimuw.edu.pl/~ben/Zajecia/Mrj2020/Latte/description.html) written in Haskell. + +## Compiling the project + +Use `stack build` to compile the project. Use the `latc` executable to compile `.lat` source files. + +Used version of GHC is 8.8.4 (LTS 16.22). For the breakdown of used packages consult `package.yaml`. + +## Testing the project + +Use `stack test` to run all included tests. The `lattest` directory contains all tests provided on +the [assignment page](https://www.mimuw.edu.pl/~ben/Zajecia/Mrj2020/latte-en.html) (these are unchanged) +and additional custom tests. + +## Features + +- Full lexer and parser for Latte with objects, virtual methods and arrays. +- Full semantic analysis with type checks and reachability analysis. + +## Custom extensions + +The grammar has been extended to include a `var` type declaration that can be used when declaring local variables to infer +their type to the compile-time type of the initialiser expression. It cannot be used in any other context and it cannot be +used in declarations without an initialiser. The motivation behind this is mainly so that `for` loop rewrite works correctly, +but it is also useful as a language feature so it is exposed to the user. + +## Compilation process + +After lexing and parsing that is automated using BNFC the compilation proceeds in phases. + +### Phase one - syntactical rewrite + +The `Syntax.Rewriter` module rewrites the parsed syntax tree into a desugarised, simplified version of the code. +The most important jobs performed by the Rewriter are rewriting `for` loops and computing constant expressions. + +#### `for` loops + +A `for` loop has the general form of: + +``` +for ( : ) + +``` + +This is desugarised to simpler language constructs into a sequence of statements with semantics equivalent to: + +``` +{ + var ~l_arr = ; + int ~l_idx = 0; + + while (~l_idx < ~l_arr.length) { + = ~l_arr[~l_idx]; + + } +} +``` + +Note: all identifiers starting with the tylda character are internal identifiers used by the compiler. +By design, these are inexpressible using lexical rules of Latte, so they can only be accessed by generated code +and not by user supplied source. + +#### Constant expressions + +Expressions that are computable at compile-time are rewritten during this phase into their result. +This includes simple arithmetic expressions and relational operations that contain only constants +as their atomic components. + +### Phase two - toplevel metadata + +The `SemanticAnalysis.Toplevel` module parses definitions of classes, methods and toplevel functions +and converts them to metadata containing field and method tables of all classes and their +inheritance hierarchies. The important jobs in this phase are: + +- resolving inheritance hierarchies and asserting they contain no cycles; +- creating class method tables, taking method overriding into account; +- analysing field, method and formal parameter names asserting there are no duplicates; +- wrapping all toplevel functions into the special `~cl_toplevel` class. + +### Phase three - sematic analysis + +The `SemanticAnalysis.Analyser` module computes type annotations, computes symbol tables +and performs control flow analysis. This is the biggest part of the frontend and contains all typing, +scoping and control flow rules. + +The scoping rules are straightforward. No two symbols can be declared with the same identifier in the same scope. +Each block introduces a new scope. Additionally, every `if`, `while` and `for` statement introduces an implicit +block, even if it is single statement. This is to prevent code like: + +``` +if (cond) int x = 0; +return x; +``` +from compiling. + +The type rules introduce internal types for functions and a `Ref t` type, which is a reference to a symbol of type `t`. +The type rules do not cause a type to be wrapped in more than one `Ref` layer. The `Ref` layer is used to distinguish +between l-values and r-values: an assignment is valid if and only if its left-hand-side is a `Ref` type. Fora actual +typing rules consult the code in `SemanticAnalysis.Analyser`. + +The control flow rules currently concern themselves with function return statements. Any non-void function is required +to have a `return` statement on each possible execution path. The Analyser tracks reachability of statements and combines +branch reachability of `if` and `while` statements. An important optimisation is that if a condition of a conditional +statement is trivially true (or false) the branch is considered to be always (or never) entered. Trivially true or false +means that it is either a true or false literal, but since this phase is performed after the Rewriter all constant boolean expressions +are already collapsed to a single literal. + +## Grammar conflicts + +The grammar contains 3 shift/reduce conflicts. + +The first conflict is the standard issue with single-statement `if` statements that makes statements of the following form ambiguous: +``` +if cond1 +if cond2 + stmt1 +else + stmt2 +``` + +The second conflict is the ambiguity between `(new t) [n]` and `new t[n]`. We cannot distinguish between a creation of an array +and an instantiation of a type with immediate indexing into it. The conflict is correctly solved in favour of array creation. + +The third conflict is between a parenthesised single expression and a casted `null` expression, which is correctly resolved in favour of the `null` expression. + +## Sources + +A few parts of the code were directly copied or heavily inspired by my earlier work on the Harper language (https://github.com/V0ldek/Harper), +most notably the control flow analysis monoid based approach. + +The grammar rules for `null` literals are a slightly modified version of rules proposed by Krzysztof MaƂysa. \ No newline at end of file diff --git a/app/Main.hs b/app/Main.hs index 370b405..f8f7327 100755 --- a/app/Main.hs +++ b/app/Main.hs @@ -6,11 +6,13 @@ import System.Exit (exitFailure, exitSuccess) import System.IO (hPutStr, hPutStrLn, stderr) import ErrM (toEither) +import SemanticAnalysis.Analyser (analyse) import SemanticAnalysis.Toplevel (Metadata, programMetadata) import Syntax.Abs (Pos, Program, unwrapPos) import Syntax.Lexer (Token) import Syntax.Parser (myLexer, pProgram) import Syntax.Printer (Print, printTree) +import Syntax.Rewriter (rewrite) type Err = Either String type ParseResult = (Program (Maybe Pos)) @@ -37,7 +39,7 @@ unlessM p a = do unless b a runFile :: Verbosity -> ParseFun ParseResult -> FilePath -> IO () -runFile v p f = putStrLn f >> readFile f >>= run v p +runFile v p f = readFile f >>= run v p run :: Verbosity -> ParseFun ParseResult -> String -> IO () run v p s = case p ts of @@ -51,18 +53,27 @@ run v p s = case p ts of let tree' = unwrapPos tree putStrErrLn "OK" showTree v tree' - case programMetadata tree' of + let rewritten = rewrite tree' + putStrErrV v "Rewritten:" + showTree v rewritten + () <- case programMetadata rewritten of Left err -> do putStrErrLn "ERROR" putStrErrLn err exitFailure Right meta -> do showMetadata v meta + case analyse meta of + Right _ -> exitSuccess + Left err -> do + putStrErrLn "ERROR" + putStrErrLn err + exitFailure exitSuccess where ts = myLexer s -showMetadata :: Verbosity -> Metadata -> IO () +showMetadata :: Verbosity -> Metadata a -> IO () showMetadata v meta = putStrV v $ show meta showTree :: (Show a, Print a) => Int -> a -> IO () diff --git a/package.yaml b/package.yaml index 924ca22..0daf56a 100755 --- a/package.yaml +++ b/package.yaml @@ -1,10 +1,10 @@ name: Latte -version: 0.1.0.0 +version: 0.8.0.0 github: "githubuser/Latte" -license: BSD3 -author: "Author name here" -maintainer: "example@example.com" -copyright: "2020 Author name here" +license: MIT +author: "Mateusz Gienieczko" +maintainer: "matgienieczko@gmail.com" +copyright: "2020 Mateusz Gienieczko" extra-source-files: - README.md @@ -17,7 +17,7 @@ extra-source-files: # To avoid duplicated efforts in documentation and dealing with the # complications of embedding Haddock markup inside cabal files, it is # common to point users to the README.md file. -description: Please see the README on GitHub at +description: Please see the README on GitHub at dependencies: - base >= 4.7 && < 5 diff --git a/src/ErrM.hs b/src/ErrM.hs index c186629..46c9017 100644 --- a/src/ErrM.hs +++ b/src/ErrM.hs @@ -23,8 +23,7 @@ instance MonadFail Err where instance Applicative Err where pure = Ok (Bad s) <*> _ = Bad s - (Ok f) <*> o = liftM f o - + (Ok f) <*> o = f <$> o instance Functor Err where fmap = liftM diff --git a/src/Error.hs b/src/Error.hs index 3f0c01c..6bc5a36 100644 --- a/src/Error.hs +++ b/src/Error.hs @@ -1,14 +1,33 @@ +{-# LANGUAGE FlexibleInstances #-} module Error where -import Syntax.Abs (Pos, Positioned (..)) -import Syntax.Printer (Print, printTree) +import Data.Maybe +import Syntax.Abs (Pos, Positioned (..), Unwrappable (..)) +import Syntax.Code -errorMsg :: String -> Pos -> String -> String +class WithContext a where + getCtx :: a -> String + +instance WithContext Code where + getCtx = codeString + +instance WithContext (Maybe Code) where + getCtx c = maybe "" getCtx c + +errorMsg :: Positioned a => String -> a -> String -> String errorMsg msg a ctx = msg ++ "\n" ++ ctxMsg - where ctxMsg = lineInfo a ++ ":\n" ++ ctx + where + ctxMsg = lineInfo (pos a) ++ ":\n" ++ ctx + +errorMsgMb :: Positioned a => String -> Maybe a -> Maybe String -> String +errorMsgMb msg a ctx = msg ++ "\n" ++ ctxMsg + where + ctxMsg = lineInfo (a >>= pos) ++ ":\n" ++ fromMaybe "" ctx -errorCtxMsg :: (Positioned a, Print a) => String -> a -> String -errorCtxMsg msg ctx = errorMsg msg (pos ctx) (printTree ctx) +errorCtxMsg :: (Positioned a, WithContext a, Unwrappable f) => String -> f a -> String +errorCtxMsg msg ctx = errorMsg msg (unwrap ctx) (getCtx $ unwrap ctx) -lineInfo :: Pos -> String -lineInfo (ln, ch) = "Line " ++ show ln ++ ", character " ++ show ch +lineInfo :: Maybe Pos -> String +lineInfo pos = case pos of + Nothing -> "" + Just (ln, ch) -> "Line " ++ show ln ++ ", character " ++ show ch diff --git a/src/Identifiers.hs b/src/Identifiers.hs new file mode 100644 index 0000000..56793fb --- /dev/null +++ b/src/Identifiers.hs @@ -0,0 +1,31 @@ +-- Reserved identifiers used internally by the compiler. +-- Any identifier starting with '~' is meant to be invisible +-- by user code and unspeakable using lexical rules of the language. +module Identifiers where + +import Syntax.Abs + +-- Identifier of the class that wraps toplevel functions. +topLevelClassIdent :: Ident +topLevelClassIdent = Ident "~cl_TopLevel" + +-- Internal identifier of the method being currently compiled. +currentMthdSymIdent :: Ident +currentMthdSymIdent = Ident "~mthd_current" + +-- Identifiers used in for loop translation. +forArrayIdent :: Ident +forArrayIdent = Ident "~l_arr" + +forIndexIdent :: Ident +forIndexIdent = Ident "~l_idx" + + +selfSymIdent :: Ident +selfSymIdent = Ident "self" + +arrayLengthIdent :: Ident +arrayLengthIdent = Ident "length" + +reservedNames :: [Ident] +reservedNames = [selfSymIdent] diff --git a/src/SemanticAnalysis/Analyser.hs b/src/SemanticAnalysis/Analyser.hs index 7fc3d29..448f534 100644 --- a/src/SemanticAnalysis/Analyser.hs +++ b/src/SemanticAnalysis/Analyser.hs @@ -1,8 +1,793 @@ -module SemanticAnalysis.Analyser where +{-# LANGUAGE FlexibleInstances #-} +-- Semantic static analysis rejecting incorrect programs and adding type annotations to the program tree. +module SemanticAnalysis.Analyser (analyse, SemData (..), Symbol (..), SymbolTable (..)) where +import Control.Monad.Reader +import Control.Monad.State +import Data.List (find, intercalate) +import qualified Data.Map as Map +import Data.Maybe (fromJust, isJust) +import qualified Error +import Identifiers +import SemanticAnalysis.Class +import SemanticAnalysis.ControlFlow +import SemanticAnalysis.Toplevel (Metadata (..)) import Syntax.Abs +import Syntax.Code +import Syntax.Printer (Print, printTree) -data SemData = SemData Integer +-- Tree of symbol tables representing the scoped declarations. +data SymbolTable = SymTab {symTab :: Map.Map Ident Symbol, symParent :: Maybe SymbolTable} -analyse :: Program Pos -> Program SemData -analyse = undefined +-- Result of the analysis phase included in each node. +data SemData = SemData { + semSymbols :: SymbolTable, -- Symbol table calculated at given place in the program. + semType :: Type (), -- Type of the expression, Void for statements. + semCode :: Maybe Code, -- Original source code of the given node, might be Nothing for generated code. + semReachable :: Reachability -- Reachability status at given place in the program. +} + +-- A declared symbol with a name and a type. +data Symbol = Sym {symName :: Ident, symType :: Type (), symCode :: Maybe Code} + +-- Store of already analysed classes. +type ClassStore = Map.Map Ident (Class SemData) + +-- State of the analyser. +data Store = Store { + stClasses :: ClassStore, -- Store of already analysed classes. + stSymTab :: SymbolTable, -- Current symbol table. + stReachability :: Reachability -- Current reachability status. +} + +-- Analyser monad combining the state and a read-only storage of metadata from the TopLevel analyser. +type AnalyserM = StateT Store (ReaderT (Metadata Code) (Either String)) + +instance Positioned SemData where + pos x = semCode x >>= codePos + +instance Positioned Symbol where + pos x = symCode x >>= codePos + +instance ControlFlow AnalyserM where + getReach = gets stReachability + setReach r = modify (\st -> st { stReachability = r }) + +instance Error.WithContext SemData where + getCtx = Error.getCtx . semCode + +-- Analyse parsed TopLevel metadata. +analyse :: Metadata Code -> Either String (Metadata SemData) +analyse meta = runReaderT (evalStateT go (Store Map.empty (topLevelSymTab meta) (Reach True))) meta + where + Meta m = meta + clIdents = Map.keys m + cls = Map.elems m + go :: AnalyserM (Metadata SemData) + go = do + cls' <- mapM analyseCl cls + return $ Meta (Map.fromList $ zip clIdents cls') + +-- Analyse a given class metadata. +analyseCl :: Class Code -> AnalyserM (Class SemData) +analyseCl cl = do + mbCl <- getsCls $ Map.lookup (clName cl) + case mbCl of + Just cl' -> return cl' -- Memoized result. + Nothing -> do + base <- mbAnalyseCl (clBase cl) -- Make sure base is analysed first so we can access + -- its field and method symbols. + enterCl cl + mthds' <- mapM analyseMthd (clMethods cl) + exitCl + let cl' = cl {clBase = base, clMethods = mthds'} + storeClass cl' + return cl' + +-- analyseCl lifted with Nothing coalescing. +mbAnalyseCl :: Maybe (Class Code) -> AnalyserM (Maybe (Class SemData)) +mbAnalyseCl cl = case cl of + Nothing -> return Nothing + Just cl -> Just <$> analyseCl cl + +-- Analyse a given method metadata. Assumes that its enclosing class was entered with enterCl. +analyseMthd :: Method Code -> AnalyserM (Method SemData) +analyseMthd m = do + enterMthd m + blk' <- analyseBlk (mthdBlk m) + exitMthd + return $ m {mthdBlk = blk'} + +-- Annalyse a given block. Assumes that a method was already entered and is accessible +-- with getCurrentMethod. +analyseBlk :: Block Code -> AnalyserM (Block SemData) +analyseBlk blk@(Block _ stmts) = do + enterBlk + stmts' <- forM stmts analyseStmt + exitBlk + semData <- analyseVoid blk + return $ Block semData stmts' + +-- Start analysing a given class, pushing a new symbol table +-- with its fields, methods and the 'self' symbol. +enterCl :: Class a -> AnalyserM () +enterCl cl = + let fldSyms = map fldToSym (clFields cl) + mthdSyms = map mthdToSym (clMethods cl) + selfSym = Sym selfSymIdent (Cl () (clName cl)) undefined + in do + -- Note that methods are checked for type correctness when they are analysed, + -- so here we only handle the fields. + mapM_ checkFldType fldSyms + pushSymTab + addSyms (fldSyms ++ mthdSyms) + addSym selfSym + where + -- Check if field declarations do not violate typing rules. + checkFldType sym = do + let t = symType sym + when (isVar t) (varFldError (symCode sym)) + when (isVoid t) (voidFldError (symCode sym)) + unlessM (typeExists t) (nonexistentTypeErrorMb t (symCode sym)) + +-- Cleanup after analysing a class. Since enterCl only creates a symbol table +-- we only need to pop that table. +exitCl :: AnalyserM () +exitCl = popSymTab + +-- Begin analysing a scope block. Amounts to beginning a new empty symbol table. +enterBlk :: AnalyserM () +enterBlk = pushSymTab + +-- Cleanup after analysing a scope block. Amounts to dropping its symbol table. +exitBlk :: AnalyserM () +exitBlk = popSymTab + +-- Start analysing a given method, pushing a new symbol table +-- with its formal parameters and the current method symbol. +-- Also resets reachability status, since the beginning of a function +-- is always reachable. +enterMthd :: Method Code -> AnalyserM () +enterMthd m = do + argsSyms <- mapM argToSym (mthdArgs m) + pushSymTab + -- The self symbol is added as part of enterCl, so we treat the method as if + -- the induced first parameter did not exist. + addSym $ Sym currentMthdSymIdent (mthdTypeIgnSelf m) (Just $ mthdCode m) + addSyms argsSyms + setReach (Reach True) + where + argToSym a@(Arg _ t i) = do + unlessM (typeExists t) (nonexistentTypeError t a) + when (isVoid t) (voidTypeExprError a) + when (isVar t) (varArgError a) + return $ Sym i (Ref () $ () <$ t) (Just $ toCode a) + +-- Cleanup after analysing a method. Needs to analyse the return semantics +-- and then pop the methods symbol table. +exitMthd :: AnalyserM () +exitMthd = do + m <- getCurrentMthd + let Fun _ r _ = symType m + reach <- getReach + when (isVar r) (varRetError (symCode m)) + unlessM (typeExists r) (nonexistentTypeErrorMb r (symCode m)) + -- The end of the method may be reachable only in a void method, which + -- has an inferred empty return at its end. + when (r /= Void () && isReachable reach) (noRetError (symCode m) r) + popSymTab + +analyseStmt :: Stmt Code -> AnalyserM (Stmt SemData) +analyseStmt stmt = do + case stmt of + Empty _ -> do + semData <- analyseVoid stmt + return $ Empty semData + BStmt _ blk -> do + blk' <- analyseBlk blk + semData <- analyseVoid stmt + return $ BStmt semData blk' + Decl _ t items -> do + items' <- mapM (analyseItemDecl (() <$ t)) items + semData <- analyseVoid stmt + return $ Decl semData (semData <$ t) items' + Ass _ expr1 expr2 -> do + expr1' <- analyseExpr expr1 + expr2' <- analyseExpr expr2 + let t1 = semType $ unwrap expr1' + t2 = semType $ unwrap expr2' + unless (isRef t1) (invAssError expr1' t1) + unlessM (t2 `typeMatch` t1) (invTypeError expr2' t1 t2) + semData <- analyseVoid stmt + return $ Ass semData expr1' expr2' + Incr _ i -> do + mbSym <- getsSym (symTabLookup i) + case mbSym of + Nothing -> undeclError i stmt + Just sym -> do + let t = symType sym + unlessM (t `typeMatch` Int ()) (invTypeError stmt (Int ()) t) + semData <- analyseVoid stmt + return $ Incr semData i + Decr _ i -> do + mbSym <- getsSym (symTabLookup i) + case mbSym of + Nothing -> undeclError i stmt + Just sym -> do + let t = symType sym + unlessM (t `typeMatch` Int ()) (invTypeError stmt (Int ()) t) + semData <- analyseVoid stmt + return $ Decr semData i + Ret _ expr -> do + mthd <- getCurrentMthd + expr' <- analyseExpr expr + let Fun _ r1 _ = symType mthd + r2 = semType $ unwrap expr' + unlessM (r2 `typeMatch` r1) (invTypeError expr' r1 r2) + semData <- analyseVoid stmt + unreachable -- Code after a return statement is always unreachable. + return $ Ret semData expr' + VRet _ -> do + mthd <- getCurrentMthd + let Fun _ r1 _ = symType mthd + unlessM (Void () `typeMatch` r1) (invTypeError stmt r1 (Void ())) + semData <- analyseVoid stmt + unreachable -- Code after a return statement is always unreachable. + return $ VRet semData + Cond _ expr stmt -> do + expr' <- analyseExpr expr + let condType = semType $ unwrap expr' + unlessM (condType `typeMatch` Bool ()) (invTypeError stmt (Bool ()) condType) + triviallyTrue <- isTriviallyTrue expr' + stmt' <- (if triviallyTrue then mustEnter else mayEnter) (analyseStmt stmt) + semData <- analyseVoid stmt + return $ Cond semData expr' stmt' + CondElse _ expr stmt1 stmt2 -> do + expr' <- analyseExpr expr + let condType = semType $ unwrap expr' + unlessM (condType `typeMatch` Bool ()) (invTypeError stmt (Bool ()) condType) + triviallyTrue <- isTriviallyTrue expr' + triviallyFalse <- isTriviallyFalse expr' + let analyser + | triviallyTrue = mustEnterFirst + | triviallyFalse = mustEnterSecond + | otherwise = mustEnterOneOf2 + (stmt1', stmt2') <- analyser (analyseStmt stmt1) (analyseStmt stmt2) + semData <- analyseVoid stmt + return $ CondElse semData expr' stmt1' stmt2' + While _ expr stmt -> do + expr' <- analyseExpr expr + let condType = semType $ unwrap expr' + unlessM (condType `typeMatch` Bool ()) (invTypeError stmt (Bool ()) condType) + triviallyTrue <- isTriviallyTrue expr' + stmt' <- (if triviallyTrue then mustEnter else mayEnter) (analyseStmt stmt) + semData <- analyseVoid stmt + return $ While semData expr' stmt' + For {} -> error "For should be rewritten before analysis." + SExp _ expr -> do + expr' <- analyseExpr expr + semData <- analyseVoid stmt + return $ SExp semData expr' + +analyseItemDecl :: Type () -> Item Code -> AnalyserM (Item SemData) +analyseItemDecl t item = do + unlessM (typeExists t) (nonexistentTypeError t item) + when (isVoid t) (voidTypeExprError item) + mbSym <- getsSym (symTabLocalScopeLookup i) + case mbSym of + Nothing -> case item of + NoInit _ i -> do + when (isVar t) (varNoInitError item) + addSym (Sym i (Ref () t) (Just $ unwrap item)) + semData <- analyseVoid item + return $ NoInit semData i + Init _ i expr -> do + expr' <- analyseExpr expr + let exprType = semType $ unwrap expr' + t' = if isVar t then exprType else t -- Infer type to the compile-time type of the expression. + unlessM (exprType `typeMatch` t) (invTypeError expr' t exprType) + addSym (Sym i (Ref () t') (Just $ unwrap item)) + semData <- analyseVoid item + return $ Init semData i expr' + Just sym -> conflDeclError item sym + where + i = case item of + NoInit _ i -> i + Init _ i _ -> i + +analyseExpr :: Expr Code -> AnalyserM (Expr SemData) +analyseExpr srcExpr = case srcExpr of + EVar _ i -> do + mbSym <- getsSym (symTabLookup i) + case mbSym of + Nothing -> undeclError i srcExpr + Just sym -> do + semData <- analyseTyped srcExpr (symType sym) + return $ EVar semData i + ELitInt _ n -> do + semData <- analyseTyped srcExpr (Int ()) + return $ ELitInt semData n + EString _ s -> do + semData <- analyseTyped srcExpr (Str ()) + return $ EString semData s + ELitTrue _ -> do + semData <- analyseTyped srcExpr (Bool ()) + return $ ELitTrue semData + ELitFalse _ -> do + semData <- analyseTyped srcExpr (Bool ()) + return $ ELitFalse semData + ENullI {} -> error "ENullI should be rewritten to ENull before analysis." + ENullArr {} -> error "ENullArr should be rewritten to ENull before analysis." + ENull _ t -> do + unlessM (typeExists t) (nonexistentTypeError t srcExpr) + when (isVoid t) (voidTypeExprError srcExpr) + tSemData <- analyseVoid t + exprSemData <- analyseTyped srcExpr (() <$ t) + return $ ENull exprSemData (tSemData <$ t) + ENew _ t -> do + when (isVar t) (varNewError srcExpr) + unlessM (typeExists t) (nonexistentTypeError t srcExpr) + when (isVoid t) (voidTypeExprError srcExpr) + tSemData <- analyseVoid t + exprSemData <- analyseTyped srcExpr (() <$ t) + return $ ENew exprSemData (tSemData <$ t) + ENewArr _ t expr -> do + when (isVar t) (varNewError srcExpr) + unlessM (typeExists t) (nonexistentTypeError t srcExpr) + when (isVoid t) (voidTypeExprError srcExpr) + tSemData <- analyseVoid t + expr' <- analyseExpr expr + exprSemData <- analyseTyped srcExpr (Arr () (() <$ t)) + return $ ENewArr exprSemData (tSemData <$ t) expr' + EApp _ expr args -> do + expr' <- analyseExpr expr + args' <- mapM analyseExpr args + let t = semType $ unwrap expr' + case t of + Fun _ r ps -> do + let nargs = length args' + nps = length ps + argsPs = zip args' ps + unless (nps == nargs) (mismatchedNumArgsError srcExpr nps nargs) + mismatched <- filterM (\(a, p) -> not <$> semType (unwrap a) `typeMatch` p) argsPs + unless (null mismatched) (mismatchedArgsError srcExpr mismatched) + exprSemData <- analyseTyped srcExpr r + return $ EApp exprSemData expr' args' + _ -> nonfnAppError srcExpr t + EIdx _ expr idxExpr -> do + expr' <- analyseExpr expr + idxExpr' <- analyseExpr idxExpr + let et = semType $ unwrap expr' + idxt = semType $ unwrap idxExpr' + unlessM (idxt `typeMatch` Int ()) (invTypeError idxExpr (Int ()) idxt) + case deref et of + Arr _ t -> do + semData <- analyseTyped srcExpr (Ref () t) + return $ EIdx semData expr' idxExpr' + _ -> notArrIdxError expr et + EAcc _ expr i -> do + expr' <- analyseExpr expr + sym <- accessMember (semType $ unwrap expr') i srcExpr + semData <- analyseTyped srcExpr (symType sym) + return $ EAcc semData expr' i + ENeg _ expr -> do + expr' <- analyseExpr expr + let t = semType $ unwrap expr' + unlessM (t `typeMatch` Int ()) (invTypeError expr (Int ()) t) + semData <- analyseTyped srcExpr (Int ()) + return $ ENeg semData expr' + ENot _ expr -> do + expr' <- analyseExpr expr + let t = semType $ unwrap expr' + unlessM (t `typeMatch` Bool ()) (invTypeError expr (Bool ()) t) + semData <- analyseTyped srcExpr (Bool ()) + return $ ENot semData expr' + EMul _ expr1 op expr2 -> do + expr1' <- analyseExpr expr1 + expr2' <- analyseExpr expr2 + let t1 = semType $ unwrap expr1' + t2 = semType $ unwrap expr2' + unlessM (t1 `typeMatch` Int ()) (invTypeError expr1 (Int ()) t1) + unlessM (t2 `typeMatch` Int ()) (invTypeError expr2 (Int ()) t2) + semData <- analyseTyped srcExpr (Int ()) + opSemData <- analyseVoid op + return $ EMul semData expr1' (opSemData <$ op) expr2' + EAdd _ expr1 op expr2 -> do + expr1' <- analyseExpr expr1 + expr2' <- analyseExpr expr2 + let t1 = semType $ unwrap expr1' + t2 = semType $ unwrap expr2' + case op of + Plus _ -> unless (areAddTypes t1 t2) (nonaddTypeError srcExpr t1 t2) + Minus _ -> unless (areMinTypes t1 t2) (nonminTypeError srcExpr t1 t2) + semData <- analyseTyped srcExpr t1 + opSemData <- analyseVoid op + return $ EAdd semData expr1' (opSemData <$ op) expr2' + ERel _ expr1 op expr2 -> do + expr1' <- analyseExpr expr1 + expr2' <- analyseExpr expr2 + let t1 = semType $ unwrap expr1' + t2 = semType $ unwrap expr2' + eqOp = unlessM (areEqTypes t1 t2) (noneqTypeError srcExpr t1 t2) + cmpOp = unless (areCmpTypes t1 t2) (noncmpTypeError srcExpr t1 t2) + case op of + EQU _ -> eqOp + NE _ -> eqOp + _ -> cmpOp + semData <- analyseTyped srcExpr (Bool ()) + opSemData <- analyseVoid op + return $ ERel semData expr1' (opSemData <$ op) expr2' + EAnd _ expr1 expr2 -> do + expr1' <- analyseExpr expr1 + expr2' <- analyseExpr expr2 + let t1 = semType $ unwrap expr1' + t2 = semType $ unwrap expr2' + unlessM (t1 `typeMatch` Bool ()) (invTypeError expr1 (Bool ()) t1) + unlessM (t2 `typeMatch` Bool ()) (invTypeError expr2 (Bool ()) t2) + semData <- analyseTyped srcExpr (Bool ()) + return $ EAnd semData expr1' expr2' + EOr _ expr1 expr2 -> do + expr1' <- analyseExpr expr1 + expr2' <- analyseExpr expr2 + let t1 = semType $ unwrap expr1' + t2 = semType $ unwrap expr2' + unlessM (t1 `typeMatch` Bool ()) (invTypeError expr1 (Bool ()) t1) + unlessM (t2 `typeMatch` Bool ()) (invTypeError expr2 (Bool ()) t2) + semData <- analyseTyped srcExpr (Bool ()) + return $ EOr semData expr1' expr2' + +isTriviallyTrue :: Expr SemData -> AnalyserM Bool +isTriviallyTrue expr = case expr of + ELitTrue _ -> return True + _ -> return False + +isTriviallyFalse :: Expr SemData -> AnalyserM Bool +isTriviallyFalse expr = case expr of + ELitFalse _ -> return True + _ -> return False + +topLevelSymTab :: Metadata a -> SymbolTable +topLevelSymTab (Meta cls) = + let topLevelCl = cls Map.! topLevelClassIdent + topLevelSyms = map mthdToSym (clMethods topLevelCl) ++ nativeTopLevelSymbols + in SymTab (Map.fromList $ map (\s -> (symName s, s)) topLevelSyms) Nothing + +-- Annotate the piece of syntax with semantic data according to current state and a Void type. +analyseVoid :: Unwrappable f => f Code -> AnalyserM SemData +analyseVoid x = analyseTyped x (Void ()) + +-- Annotate the piece of syntax with semantic data according to current state and the given type. +analyseTyped :: Unwrappable f => f Code -> Type () -> AnalyserM SemData +analyseTyped x t = do + symTab <- getSym + reach <- getReach + let semData = SemData symTab t (Just $ unwrap x) reach + return semData + +getsCls :: (ClassStore -> a) -> AnalyserM a +getsCls f = gets (f . stClasses) + +getsSym :: (SymbolTable -> a) -> AnalyserM a +getsSym f = gets (f . stSymTab) + +getSym :: AnalyserM SymbolTable +getSym = getsSym id + +-- Set reachability state to unreachable. +unreachable :: AnalyserM () +unreachable = setReach (Reach False) + +asksCl :: Ident -> AnalyserM (Maybe (Class Code)) +asksCl i = asks (\(Meta m) -> Map.lookup i m) + +modifyCl :: (ClassStore -> ClassStore) -> AnalyserM () +modifyCl f = modify (\s -> s {stClasses = f $ stClasses s}) + +modifySym :: (SymbolTable -> SymbolTable) -> AnalyserM () +modifySym f = modify (\s -> s {stSymTab = f $ stSymTab s}) + +-- Store an analysed class in the state. +storeClass :: Class SemData -> AnalyserM () +storeClass cl = modifyCl (Map.insert (clName cl) cl) + +-- Push a new, empty symbol table on the symbol table stack as a child of the current symbol table. +pushSymTab :: AnalyserM () +pushSymTab = modifySym $ SymTab Map.empty . Just + +-- Remove the current symbol table and set its parent as the current one. +popSymTab :: AnalyserM () +popSymTab = modifySym $ fromJust . symParent + +-- Add given symbols to the current symbol table. +addSyms :: [Symbol] -> AnalyserM () +addSyms syms = modifySym (symTabUnion $ Map.fromList $ map (\s -> (symName s, s)) syms) + +-- Add the given symbol to the current symbol table. +addSym :: Symbol -> AnalyserM () +addSym sym = modifySym (symTabInsert sym) + +-- Remove a symbol with the given identifier from the current symbol table. +removeSym :: Ident -> AnalyserM () +removeSym i = modifySym (symTabRemove i) + +symTabUnion :: Map.Map Ident Symbol -> SymbolTable -> SymbolTable +symTabUnion x s = + let y = symTab s + in s {symTab = Map.union x y} + +-- Add the given symbol to the given symbol table. +symTabInsert :: Symbol -> SymbolTable -> SymbolTable +symTabInsert sym s = s {symTab = Map.insert (symName sym) sym (symTab s)} + +-- Remove a symbol with the given identifier from the given symbol table. +symTabRemove :: Ident -> SymbolTable -> SymbolTable +symTabRemove i s = s {symTab = Map.delete i (symTab s)} + +-- Get a given symbol from the symbol table stack, recursivelly. +symTabGet :: Ident -> SymbolTable -> Symbol +symTabGet i s = fromJust $ symTabLookup i s + +-- Lookup a given symbol in the symbol table stack, recursivelly. +symTabLookup :: Ident -> SymbolTable -> Maybe Symbol +symTabLookup i s = + let mbSym = Map.lookup i (symTab s) + in case (mbSym, symParent s) of + (Nothing, Nothing) -> Nothing + (Nothing, Just s') -> symTabLookup i s' + (Just sym, _) -> Just sym + +-- Lookup a given symbol in the current symbol table; does not look recursivelly through the stack. +symTabLocalScopeLookup :: Ident -> SymbolTable -> Maybe Symbol +symTabLocalScopeLookup i s = Map.lookup i (symTab s) + +-- Get the symbol representing the current method. +getCurrentMthd :: AnalyserM Symbol +getCurrentMthd = getsSym (symTabGet currentMthdSymIdent) + +-- Convert field metadata into a symbol. +fldToSym :: Field -> Symbol +fldToSym fld = Sym (fldName fld) (Ref () $ fldType fld) (Just $ toCode $ fldCode fld) + +-- Convert method metadata into a symbol. +mthdToSym :: Method a -> Symbol +mthdToSym m = Sym (mthdName m) (mthdTypeIgnSelf m) (Just $ mthdCode m) + +-- Check if a given type is declared in the metadata. +typeExists :: Type a -> AnalyserM Bool +typeExists t = case deref t of + Cl _ i -> do + mbcl <- asksCl i + return $ isJust mbcl + _ -> return True + +isVoid :: Type a -> Bool +isVoid t = case deref t of + Void _ -> True + _ -> False + +isVar :: Type a -> Bool +isVar t = case deref t of + Var _ -> True + Arr _ t -> isVar t + _ -> False + +-- Can an expression of type t1 be used in a place where the type t2 is required. +-- Both types are dereferenced, so Ref has no impact on the result. +typeMatch :: Type a -> Type b -> AnalyserM Bool +typeMatch t1 t2 = case (deref t1, deref t2) of + (Int _, Int _) -> return True + (Str _, Str _) -> return True + (Bool _, Bool _) -> return True + (Void _, Void _) -> return True + (_, Var _) -> return True + (Arr _ t1', Arr _ t2') -> typeMatch t1' t2' + (Cl _ i1, Cl _ i2) -> do + cl1 <- asksCl i1 + cl2 <- asksCl i2 + return $ fromJust cl1 `classMatch` fromJust cl2 + (Fun _ r1 ps1, Fun _ r2 ps2) -> do + rMatch <- typeMatch r1 r2 + if not rMatch || length ps1 /= length ps2 + then return False + else do + pMatches <- zipWithM typeMatch ps1 ps2 + return $ and pMatches + _ -> return False + +-- Does the language support addition of expressions of given types. +areAddTypes :: Type a -> Type b -> Bool +areAddTypes t1 t2 = case (deref t1, deref t2) of + (Int _, Int _) -> True + (Str _, Str _) -> True + _ -> False + +-- Does the language support subtraction of expressions of given types. +areMinTypes :: Type a -> Type b -> Bool +areMinTypes t1 t2 = case (deref t1, deref t2) of + (Int _, Int _) -> True + _ -> False + +-- Does the language support equation of expressions of given types. +areEqTypes :: Type a -> Type b -> AnalyserM Bool +areEqTypes t1 t2 = liftM2 (||) (t1 `typeMatch` t2 ) (t2 `typeMatch` t1) + +-- Does the language support relational comparison of expressions of given types. +areCmpTypes :: Type a -> Type b -> Bool +areCmpTypes t1 t2 = case (deref t1, deref t2) of + (Int _, Int _) -> True + (Str _, Str _) -> True + (Bool _, Bool _) -> True + _ -> False + +-- Can an instance of cl1 be used where an instance of cl2 is required. +-- In other words, is cl1 a subclass of cl2 or cl2. +classMatch :: Class a -> Class a -> Bool +classMatch cl1 cl2 = + (clName cl1 == clName cl2) || case clBase cl1 of + Nothing -> False + Just cl1' -> classMatch cl1' cl2 + +-- Resolve the access to a member with a given identifier on an expression of given type. +-- If access is impossible due to whatever reason, the monad will fail with a suitable error. +accessMember :: (Positioned a, Error.WithContext a, Unwrappable f) => Type () -> Ident -> f a -> AnalyserM Symbol +accessMember t i ctx = case t of + Arr _ _ -> if i == arrayLengthIdent then return $ Sym arrayLengthIdent (Int ()) undefined + else invAccessError t i ctx + Cl _ cli -> do + mcl <- asksCl cli + case mcl of + Nothing -> undeclTypeError t ctx + Just cl -> let fld = find (\f -> fldName f == i) (clFields cl) + mthd = find (\m -> mthdName m == i) (clMethods cl) + in case (fld, mthd) of + (Just fld, _) -> return $ fldToSym fld + (_, Just mthd) -> return $ mthdToSym mthd + (Nothing, Nothing) -> invAccessError t i ctx + Ref _ t -> accessMember t i ctx + _ -> invAccessError t i ctx + +isRef :: Type a -> Bool +isRef t = case t of + Ref _ _ -> True + _ -> False + +-- Remove all layers of Ref from a given type. +-- The language typing should never cause a type like: +-- Ref (Ref ... (NotRef (Ref (Ref ...)))) +-- i.e. with two different layers of indirection separated by some other type. +-- So, for example, a type `int&[]&` should be impossible. +deref :: Type a -> Type a +deref t = case t of + Ref _ t -> deref t + _ -> t + +unlessM :: Monad m => m Bool -> m () -> m () +unlessM p a = do + b <- p + unless b a + +-- Symbols that are linked from the native library. +nativeTopLevelSymbols :: [Symbol] +nativeTopLevelSymbols = [printInt, printString, error, readInt, readString] + where printInt = Sym (Ident "printInt") (Fun () (Void ()) [Int ()]) Nothing + printString = Sym (Ident "printString") (Fun () (Void ()) [Str ()]) Nothing + error = Sym (Ident "error") (Fun () (Void ()) []) Nothing + readInt = Sym (Ident "readInt") (Fun () (Int ()) []) Nothing + readString = Sym (Ident "readString") (Fun () (Str ()) []) Nothing + +-- Errors + +raise :: String -> AnalyserM a +raise = lift . lift . Left + +conflDeclError :: Item Code -> Symbol -> AnalyserM a +conflDeclError item sym = raise $ Error.errorMsg msg (unwrap item) ctx + where + msg = "Conflicting declarations in the same scope." + ctx = + "In declaration of `" ++ showI (symName sym) ++ "`.\n" + ++ Error.lineInfo (symCode sym >>= pos) + ++ ": previously declared here." + +invTypeError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> Type () -> Type () -> AnalyserM b +invTypeError ctx expected actual = raise $ Error.errorCtxMsg msg ctx + where + msg = "Invalid expression type. Expected `" ++ showType expected ++ "`, found `" ++ showType actual ++ "`." + +undeclError :: (Positioned a, Error.WithContext a, Unwrappable f) => Ident -> f a -> AnalyserM b +undeclError i ctx = raise $ Error.errorCtxMsg msg ctx + where + msg = "Undeclared identifier `" ++ showI i ++ "`." + +nonfnAppError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> Type () -> AnalyserM b +nonfnAppError ctx t = raise $ Error.errorCtxMsg msg ctx + where msg = "Invalid call to a non-function type `" ++ showType t ++ "`." + +noneqTypeError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> Type () -> Type () -> AnalyserM b +noneqTypeError ctx t1 t2 = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot equate expressions of types `" ++ showType t1 ++ "` and `" ++ showType t2 ++ "`. " + ++ "Only expressions of types within the same inheritance chain can be equated." + +noncmpTypeError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> Type () -> Type () -> AnalyserM b +noncmpTypeError ctx t1 t2 = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot compare expressions of types `" ++ showType t1 ++ "` and `" ++ showType t2 ++ "`. " + ++ "Only two expressions of the same type out of `int`, `string` and `bool` can be compared." + +nonaddTypeError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> Type () -> Type () -> AnalyserM b +nonaddTypeError ctx t1 t2 = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot add expressions of types `" ++ showType t1 ++ "` and `" ++ showType t2 ++ "`. " + ++ "Only two expressions of type `int` or two expressions of type `string` can be added." + +nonminTypeError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> Type () -> Type () -> AnalyserM b +nonminTypeError ctx t1 t2 = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot subtract expressions of types `" ++ showType t1 ++ "` and `" ++ showType t2 ++ "`. " + ++ "Only `int` expressions can be subtracted." + +mismatchedArgsError :: (Positioned a, Error.WithContext a, Unwrappable f, + Unwrappable g, Print (g SemData)) => f a -> [(g SemData, Type ())] -> AnalyserM b +mismatchedArgsError ctx mismatched = raise $ Error.errorCtxMsg msg ctx + where + msg = "Mismatched types of arguments in function call.\n" ++ intercalate "\n" ctxs + ctxs = map (uncurry mismatchCtx) mismatched + mismatchCtx e t = "Argument `" ++ printTree e ++ "` has invalid type `" ++ showType (semType $ unwrap e) + ++ "`. Expected type `" ++ showType t ++ "`." + +mismatchedNumArgsError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> Int -> Int -> AnalyserM b +mismatchedNumArgsError ctx nparams nargs = raise $ Error.errorCtxMsg msg ctx + where msg = "Mismatched number of arguments in function call. Expected " ++ show nparams ++ ", found " ++ show nargs ++ "." + +notArrIdxError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> Type () -> AnalyserM b +notArrIdxError ctx t = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot index to a non-array type `" ++ showType t ++ "`." + +noRetError :: Maybe Code -> Type () -> AnalyserM a +noRetError c t = raise $ Error.errorMsgMb msg (c >>= codePos) (codeString <$> c) + where msg = "Control may reach the end of a non-void function without a return statement. Expected return type: `" ++ showType t ++ "`." + +invAccessError :: (Positioned a, Error.WithContext a, Unwrappable f) => Type () -> Ident -> f a -> AnalyserM b +invAccessError t i ctx = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot access member `" ++ showI i ++ "` of type `" ++ showType t ++ "`." + +undeclTypeError :: (Positioned a, Error.WithContext a, Unwrappable f) => Type () -> f a -> AnalyserM b +undeclTypeError t ctx = raise $ Error.errorCtxMsg msg ctx + where msg = "Undeclared type `" ++ showType t ++ "`." + +invAssError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> Type () -> AnalyserM b +invAssError ctx t = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot assign to a value of type `" ++ showType t ++ "`." + +nonexistentTypeError :: (Positioned b, Error.WithContext b, Unwrappable f) => Type a -> f b -> AnalyserM c +nonexistentTypeError t ctx = raise $ Error.errorCtxMsg msg ctx + where msg = "Use of undeclared type `" ++ showType t ++ "`." + +nonexistentTypeErrorMb :: Type a -> Maybe Code -> AnalyserM c +nonexistentTypeErrorMb t c = raise $ Error.errorMsgMb msg (c >>= codePos) (codeString <$> c) + where msg = "Use of undeclared type `" ++ showType t ++ "`." + +voidTypeExprError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> AnalyserM b +voidTypeExprError ctx = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot use `void` as a type of a value." + +voidFldError :: Maybe Code -> AnalyserM a +voidFldError c = raise $ Error.errorMsgMb msg (c >>= codePos) (codeString <$> c) + where msg = "Cannot use `void` as a type of a field." + +varNoInitError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> AnalyserM b +varNoInitError ctx = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot declare a `var` type variable without initialization." + +varRetError :: Maybe Code -> AnalyserM a +varRetError c = raise $ Error.errorMsgMb msg (c >>= codePos) (codeString <$> c) + where msg = "Cannot use `var` as the return type of a function." + +varArgError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> AnalyserM b +varArgError ctx = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot use `var` as the type of a function parameter." + +varNewError :: (Positioned a, Error.WithContext a, Unwrappable f) => f a -> AnalyserM b +varNewError ctx = raise $ Error.errorCtxMsg msg ctx + where msg = "Cannot use `var` in a `new` expression." + +varFldError :: Maybe Code -> AnalyserM a +varFldError c = raise $ Error.errorMsgMb msg (c >>= codePos) (codeString <$> c) + where msg = "Cannot use `var` as the type of a field." diff --git a/src/SemanticAnalysis/Class.hs b/src/SemanticAnalysis/Class.hs index f4b0016..157ae2c 100644 --- a/src/SemanticAnalysis/Class.hs +++ b/src/SemanticAnalysis/Class.hs @@ -1,132 +1,129 @@ +-- Definitions of internal metadata types for language entities. module SemanticAnalysis.Class ( Class (..), Field (..), Method (..), - MethodCode (..), - mthdBody, mthdType, - topLevelClassIdent, + mthdTypeIgnSelf, clCons, + rootCl, + rootType, fldCons, funCons, mthdCons, - clExtend + clExtend, + showType ) where -import Control.Monad +import Control.Monad (unless) import Data.List (intercalate, sort) import qualified Data.Map as Map -import Error +import Data.Maybe +import Error (lineInfo) +import Identifiers import Syntax.Abs +import Syntax.Code -data Class = Class { clName :: Ident, clBase :: Maybe Class, clFields :: [Field], clMethods :: [Method] } +data Class a = Class { clName :: Ident, clBase :: Maybe (Class a), clFields :: [Field], clMethods :: [Method a] } -data Field = Fld { fldName :: Ident, fldType :: Type (), fldCode :: ClDef Pos} +data Field = Fld { fldName :: Ident, fldType :: Type (), fldCode :: ClDef Code} -data Method = Mthd { +data Method a = Mthd { mthdName :: Ident, mthdRet :: Type (), - mthdThis :: Maybe (Type ()), - mthdArgs :: [Arg ()], - mthdCode :: MethodCode } - -data MethodCode = FnCode (TopDef Pos) | MthdCode (ClDef Pos) - -instance Positioned MethodCode where - pos x = case x of - FnCode td -> unwrap td - MthdCode cl -> unwrap cl - -mthdBody :: Method -> Block Pos -mthdBody x = case mthdCode x of - FnCode (FnDef _ _ _ _ blk) -> blk - MthdCode (MthDef _ _ _ _ blk) -> blk - -mthdType :: Method -> Type () -mthdType mthd = case mthdThis mthd of - Nothing -> mthdTypeIgnThis mthd - Just typ -> let Fun _ ret args = mthdTypeIgnThis mthd + mthdSelf :: Maybe (Type ()), + mthdArgs :: [Arg Code], + mthdBlk :: Block a, + mthdCode :: Code } + +-- Get the type of the method, including the hidden `self` parameter. +mthdType :: Method a -> Type () +mthdType mthd = case mthdSelf mthd of + Nothing -> mthdTypeIgnSelf mthd + Just typ -> let Fun _ ret args = mthdTypeIgnSelf mthd in Fun () ret (typ : args) -mthdTypeIgnThis :: Method -> Type () -mthdTypeIgnThis (Mthd _ ret _ args _) = Fun () ret (map (\(Arg _ t _) -> t) args) +-- Get the type of the method, but without the hidden `self` parameter. +mthdTypeIgnSelf :: Method a -> Type () +mthdTypeIgnSelf (Mthd _ ret _ args _ _) = Fun () ret (map (\(Arg _ t _) -> () <$ t) args) -topLevelClassIdent :: Ident -topLevelClassIdent = Ident "~cl_TopLevel" +-- Phony class serving as a root of the inheritance hierarchy. +rootCl :: Class a +rootCl = Class (Ident "~object") Nothing [] [] -clCons :: Ident -> Maybe Class -> [Field] -> [Method] -> Either String Class +rootType :: Type () +rootType = Cl () (clName rootCl) + +-- Construct a class from its constituents, checking name rule violations. +clCons :: Ident -> Maybe (Class a) -> [Field] -> [Method a] -> Either String (Class a) clCons name base flds mthds = do let dupFlds = snd $ findDupsBy (showI . fldName) flds dupMthds = snd $ findDupsBy (showI . mthdName) mthds + conflicts = snd $ findConflictsBy (showI . fldName) (showI . mthdName) flds mthds + reservedFlds = filter (\f -> fldName f `elem` reservedNames) flds + reservedMthds = filter (\m -> mthdName m `elem` reservedNames) mthds unless (null dupFlds) (dupFldsError dupFlds) unless (null dupMthds) (dupMthdsError dupMthds) - return $ Class name base flds mthds - -dupFldsError :: [Field] -> Either String a -dupFldsError flds = Left $ intercalate "\n" (header : ctxs) - where header = "Duplicate field identifiers: `" ++ intercalate "`, `" (dedup $ map (showI . fldName) flds) ++ "`." - ctxs = sort $ map ctx flds - ctx fld = lineInfo (unwrap $ fldCode fld) - -dupMthdsError :: [Method] -> Either String a -dupMthdsError mthds = Left $ intercalate "\n" (header : ctxs) - where header = "Duplicate method identifiers: `" ++ intercalate "`, `" (dedup $ map (showI . mthdName) mthds) ++ "`." - ctxs = sort $ map ctx mthds - ctx mthd = lineInfo (pos $ mthdCode mthd) - -fldCons :: Type a -> Ident -> ClDef Pos -> Field + unless (null conflicts) (conflFldsAndMthdsError conflicts) + unless (null reservedFlds) (reservedFldError reservedFlds) + unless (null reservedMthds) (reservedMthdsError reservedMthds) + let base' = if isNothing base then Just rootCl else Nothing + return $ Class name base' flds mthds + +-- Construct a field from ist constituents. +fldCons :: Type a -> Ident -> ClDef Code -> Field fldCons typ i = Fld i (() <$ typ) -funCons :: Type a -> Ident -> [Arg c] -> TopDef Pos -> Either String Method -funCons typ i args code = do +-- Construct a method representing a toplevel function from its constituents. +-- Checks parameter naming rules. +funCons :: Type a -> Ident -> [Arg Code] -> TopDef Code -> Either String (Method Code) +funCons typ i args def = do + let FnDef _ _ _ _ blk = def cons <- baseMethodCons typ i Nothing args - return $ cons $ FnCode code - -mthdCons :: Type a -> Ident -> Type b -> [Arg c] -> ClDef Pos -> Either String Method -mthdCons typ i thisTyp args code = do - cons <- baseMethodCons typ i (Just thisTyp) args - return $ cons $ MthdCode code - -baseMethodCons :: Type a -> Ident -> Maybe (Type b) -> [Arg c] -> Either String (MethodCode -> Method) -baseMethodCons typ i thisTyp args = do + return $ cons blk (unwrap def) + +-- Construct a method representing a class method from its constituents. +-- Checks parameter naming rules. +mthdCons :: Type a -> Ident -> Type b -> [Arg Code] -> ClDef Code -> Either String (Method Code) +mthdCons typ i selfTyp args def = do + let MthDef _ _ _ _ blk = def + cons <- baseMethodCons typ i (Just selfTyp) args + return $ cons blk (unwrap def) + +-- Common constructor for both toplevel functions and class methods. +baseMethodCons :: Type a -> Ident -> Maybe (Type b) -> [Arg Code] -> Either String (Block Code -> Code -> Method Code) +baseMethodCons typ i selfTyp args = do let dupArgs = fst $ findDupsBy (\(Arg _ _ i) -> showI i) args unless (null dupArgs) (dupArgsError dupArgs) - return $ Mthd i (() <$ typ) (fmap (() <$) thisTyp) (map (() <$) args) - -dupArgsError :: [String] -> Either String a -dupArgsError args = Left $ "Duplicate formal parameter identifiers: `" ++ intercalate "`, `" args ++ "`." + return $ Mthd i (() <$ typ) (fmap (() <$) selfTyp) args -clExtend :: Class -> Class -> Either String Class +-- Extend a given base class with the given class. +-- In other words, set the base of the given class and fill its +-- field and method tables according to inheritance rules. +clExtend :: Class Code -> Class Code -> Either String (Class Code) clExtend cl base = do flds <- combinedFlds - return $ Class (clName cl) (Just base) flds combinedMthds + mthds <- combinedMthds + return $ Class (clName cl) (Just base) flds mthds where combinedFlds = let flds = clFields base ++ clFields cl (_, dups) = findDupsBy fldName flds in if null dups then Right flds else redefFldsError dups - combinedMthds = let subMthds = Map.fromList $ map (\m -> ((mthdName m, mthdTypeIgnThis m), m)) (clMethods cl) + combinedMthds = let subMthds = Map.fromList $ map (\m -> (mthdName m, m)) (clMethods cl) in run (clMethods base) subMthds where - run [] subMthds = Map.elems subMthds - run (b:bs) subMthds = let key = (mthdName b, mthdTypeIgnThis b) + run :: [Method Code] -> Map.Map Ident (Method Code) -> Either String [Method Code] + run [] subMthds = return $ Map.elems subMthds + run (b:bs) subMthds = let key = mthdName b in case Map.lookup key subMthds of - Nothing -> b : run bs subMthds - Just m -> m : run bs (Map.delete key subMthds) - -redefFldsError :: [Field] -> Either String a -redefFldsError flds = Left $ intercalate "\n" (header : ctxs) - where header = "Conflicting field definitions in subclass: `" ++ intercalate "`, `" (dedup $ map (showI . fldName) flds) ++ "`." - ctxs = sort $ map ctx flds - ctx fld = lineInfo (unwrap $ fldCode fld) - --- TODO: better error message -redefMthdsError :: [Method] -> Either String a -redefMthdsError mthds = Left $ intercalate "\n" (header : ctxs) - where header = "Invalid type of virtual method overload in subclass: `" ++ intercalate "`, `" (dedup $ map (showI . mthdName) mthds) ++ "`." - ctxs = sort $ map ctx mthds - ctx mthd = lineInfo (pos $ mthdCode mthd) + Nothing -> run bs subMthds >>= (\bs -> return $ b : bs) + Just m -> do + let bt = mthdTypeIgnSelf b + mt = mthdTypeIgnSelf m + if bt == mt then run bs (Map.delete key subMthds) >>= (\bs -> return $ m : bs) + else redefMthdError b m -- Mostly used for debugging purposes. -instance Show Class where +instance Show (Class a) where show (Class (Ident name) base clFields clMethods) = intercalate "\n" (header : map indent (fields ++ methods)) where header = ".class " ++ name ++ extends ++ ":" @@ -137,7 +134,7 @@ instance Show Class where methods = ".methods:" : map (indent . show) clMethods indent x = " " ++ x -instance Show Method where +instance Show (Method a) where show mthd = showType (mthdType mthd) ++ " " ++ showI (mthdName mthd) ++ ";" instance Show Field where @@ -149,21 +146,87 @@ showType typ = case typ of Str _ -> "string" Bool _ -> "boolean" Void _ -> "void" + Var _ -> "var" Arr _ t -> showType t ++ "[]" Cl _ (Ident name) -> name Fun _ typ typs -> showType typ ++ "(" ++ intercalate ", " (map showType typs) ++ ")" - Ref _ t -> showType t ++ "&" + Ref _ t -> showType t +-- Find duplicates in a given list based on a key selector. +-- Returns a deduplicated list of duplicated keys and a list of values such that +-- there exists a value with the same key. findDupsBy :: Ord k => (a -> k) -> [a] -> ([k], [a]) findDupsBy f ds = collect $ foldr checkForDup (Map.empty, []) ds - where - checkForDup a (m, dups) = - let k = f a - in if Map.member k m then (m, (k, a) : dups) else (Map.insert k a m, dups) - collect (m, dups) = - let (ks, as) = unzip dups in (ks, foldr (\k as' -> m Map.! k : as') as ks) - + where + checkForDup a (m, dups) = + let k = f a + in if Map.member k m then (m, (k, a) : dups) else (Map.insert k a m, dups) + collect (m, dups) = + let (ks, as) = unzip dups in (ks, foldr (\k as' -> m Map.! k : as') as ks) + +-- Inner join based on a key selector of two lists. +-- Returns a deduplicated list of keys that participated in a join +-- and the list of resulting products. +findConflictsBy :: Ord k => (a -> k) -> (b -> k) -> [a] -> [b] -> ([k], [(a, b)]) +findConflictsBy fa fb as bs = unzip $ foldr checkForConfl [] bs + where + m = Map.fromList $ zip (map fa as) as + checkForConfl b confls = + let k = fb b + in case Map.lookup k m of + Nothing -> confls + Just a -> (k, (a, b)) : confls + +-- O(nlogn) deduplication. dedup :: Ord a => [a] -> [a] dedup xs = run (sort xs) where run [] = [] run (x:xs) = x : run (dropWhile (== x) xs ) + +-- Errors + +redefFldsError :: [Field] -> Either String a +redefFldsError flds = Left $ intercalate "\n" (header : ctxs) + where header = "Conflicting field definitions in subclass: `" ++ intercalate "`, `" (dedup $ map (showI . fldName) flds) ++ "`." + ctxs = sort $ map ctx flds + ctx fld = lineInfo (codePos $ unwrap $ fldCode fld) + +redefMthdError :: Method Code -> Method Code -> Either String a +redefMthdError base override = Left $ header ++ ctx + where header = "Overriding method `" ++ showI (mthdName base) + ++ "` has a different type than the base method.\nBase method type is `" ++ showType (mthdTypeIgnSelf base) + ++ "`, overriding method type is `" ++ showType (mthdTypeIgnSelf override) ++ "`.\n" + ctx = lineInfo (codePos $ mthdCode override) + +dupFldsError :: [Field] -> Either String a +dupFldsError flds = Left $ intercalate "\n" (header : ctxs) + where header = "Duplicate field identifiers: `" ++ intercalate "`, `" (dedup $ map (showI . fldName) flds) ++ "`." + ctxs = sort $ map ctx flds + ctx fld = lineInfo (codePos $ unwrap $ fldCode fld) + +dupMthdsError :: [Method a] -> Either String b +dupMthdsError mthds = Left $ intercalate "\n" (header : ctxs) + where header = "Duplicate method identifiers: `" ++ intercalate "`, `" (dedup $ map (showI . mthdName) mthds) ++ "`." + ctxs = sort $ map ctx mthds + ctx mthd = lineInfo (pos $ mthdCode mthd) + +conflFldsAndMthdsError :: [(Field, Method a)] -> Either String b +conflFldsAndMthdsError confls = Left $ intercalate "\n" (header : ctxs) + where header = "Conflicting field/method identifiers: `" ++ intercalate "`, `" (map (showI . fldName . fst) confls) ++ "`." + ctxs = sort $ map ctx confls + ctx (fld, mthd) = lineInfo (codePos $ unwrap $ fldCode fld) ++ " conflicting with " ++ lineInfo (pos $ mthdCode mthd) + +reservedFldError :: [Field] -> Either String a +reservedFldError flds = Left $ intercalate "\n" (header : ctxs) + where header = "Reserved names used as field identifiers: `" ++ intercalate "`, `" (dedup $ map (showI . fldName) flds) ++ "`." + ctxs = sort $ map ctx flds + ctx fld = lineInfo (codePos $ unwrap $ fldCode fld) + +reservedMthdsError :: [Method a] -> Either String b +reservedMthdsError mthds = Left $ intercalate "\n" (header : ctxs) + where header = "Reserved names used as method identifiers: `" ++ intercalate "`, `" (dedup $ map (showI . mthdName) mthds) ++ "`." + ctxs = sort $ map ctx mthds + ctx mthd = lineInfo (pos $ mthdCode mthd) + +dupArgsError :: [String] -> Either String a +dupArgsError args = Left $ "Duplicate formal parameter identifiers: `" ++ intercalate "`, `" args ++ "`." diff --git a/src/SemanticAnalysis/ControlFlow.hs b/src/SemanticAnalysis/ControlFlow.hs new file mode 100644 index 0000000..589aa2a --- /dev/null +++ b/src/SemanticAnalysis/ControlFlow.hs @@ -0,0 +1,81 @@ +-- Monoid based control flow status definition and combinators. +module SemanticAnalysis.ControlFlow where + +import Control.Monad + +newtype Reachability = Reach Bool + +-- A given code branch is reachable if either of the paths leading to it is reachable. +instance Semigroup Reachability where + (Reach b1) <> (Reach b2) = Reach (b1 || b2) + +-- False is the neutral element of ||. +instance Monoid Reachability where + mempty = Reach False + +class ControlFlow m where + getReach :: m Reachability + setReach :: Reachability -> m () + +isReachable :: Reachability -> Bool +isReachable (Reach b) = b + +-- Analyse a given scoped statement preserving the reachability status +-- and returning the reachability status of the end of the analysed scoped statement. +controlScope :: (Monad m, ControlFlow m) => m a -> m (a, Reachability) +controlScope m = do + before <- getReach + a <- m + after <- getReach + setReach before + return (a, after) + +-- Analyse a given block that may be entered or may be not entered. +mayEnter :: (Monad m, ControlFlow m) => m a -> m a +mayEnter m = do + x <- mayEnterOneOf [m] + return $ head x + +-- Analyse a sequence of statements assuming that either one or none of them +-- will be entered. +mayEnterOneOf :: (Monad m, ControlFlow m) => [m a] -> m [a] +mayEnterOneOf ms = do + (as, _) <- mapAndUnzipM controlScope ms + return as + +-- Analyse a statement assuming it will always be entered. +mustEnter :: (Monad m, ControlFlow m) => m a -> m a +mustEnter m = do + x <- mustEnterOneOf [m] + return $ head x + +-- Analyse a pair of statements assuming the first one will always be entered +-- and the second one will never be entered. +mustEnterFirst :: (Monad m, ControlFlow m) => m a -> m a -> m (a, a) +mustEnterFirst m1 m2 = do + (a2, _) <- controlScope m2 + a1 <- mustEnter m1 + return (a1, a2) + +-- Analyse a pair of statements assuming the first one will never be entered +-- and the second one will always be entered. +mustEnterSecond :: (Monad m, ControlFlow m) => m a -> m a -> m (a, a) +mustEnterSecond m1 m2 = do + (a1, _) <- controlScope m1 + a2 <- mustEnter m2 + return (a1, a2) + +-- Analyse a pair of statements assuming that exactly one of them will be entered +-- and the other will not. +mustEnterOneOf2 :: (Monad m, ControlFlow m) => m a -> m a -> m (a, a) +mustEnterOneOf2 m1 m2 = do + x <- mustEnterOneOf [m1, m2] + return (head x, x !! 1) + +-- Analyse a sequuence of statements assuming that exactly one of them will be entered +-- and none of the others will. +mustEnterOneOf :: (Monad m, ControlFlow m) => [m a] -> m [a] +mustEnterOneOf ms = do + (as, reaches) <- mapAndUnzipM controlScope ms + setReach (mconcat reaches) + return as diff --git a/src/SemanticAnalysis/Toplevel.hs b/src/SemanticAnalysis/Toplevel.hs index 2339808..623683a 100644 --- a/src/SemanticAnalysis/Toplevel.hs +++ b/src/SemanticAnalysis/Toplevel.hs @@ -1,4 +1,5 @@ -module SemanticAnalysis.Toplevel (programMetadata, Metadata) where +-- Analyser of toplevel definitions generating class and function metadata. +module SemanticAnalysis.Toplevel (programMetadata, Metadata(..)) where import Control.Monad.State @@ -6,24 +7,30 @@ import Data.Either (isRight) import Data.List (intercalate) import qualified Data.Map as Map import Data.Maybe (fromJust) -import Error (errorMsg) +import Error (errorMsg, errorMsgMb) +import Identifiers import SemanticAnalysis.Class import Syntax.Abs +import Syntax.Code -newtype Metadata = Meta [Class] +newtype Metadata a = Meta (Map.Map Ident (Class a)) -programMetadata :: Program Pos -> Either String Metadata +-- Analyse the toplevel definitions in a program and produce its metadata. +programMetadata :: Program Code -> Either String (Metadata Code) programMetadata x = case x of Program _ ts -> topDefsMetadata ts -topDefsMetadata :: [TopDef Pos] -> Either String Metadata +topDefsMetadata :: [TopDef Code] -> Either String (Metadata Code) topDefsMetadata ts = do let fnDefs = filter isFnDef ts clDefs = filter isClDef ts functions <- fnDefsMetadata fnDefs topLevelClass <- clCons topLevelClassIdent Nothing [] functions classes <- clDefsMetadata clDefs - return $ Meta (topLevelClass : classes) + let allClasses = topLevelClass : rootCl : classes + clIdents = map clName allClasses + classMap = Map.fromList (zip clIdents allClasses) + return $ Meta classMap where isClDef x = case x of ClDef {} -> True ClExtDef {} -> True @@ -32,61 +39,62 @@ topDefsMetadata ts = do FnDef {} -> True _ -> False -fnDefsMetadata :: [TopDef Pos] -> Either String [Method] +fnDefsMetadata :: [TopDef Code] -> Either String [Method Code] fnDefsMetadata = mapM fnDefMetadata where fnDefMetadata def@(FnDef a typ i args _) = let res = funCons typ i args def in if isRight res then res else fnErr res where fnErr (Left s) = Left $ errorMsg (s ++ "\n") a ("In definition of function `" ++ showI i ++ "`.") -type ClTraversalM = StateT (Map.Map Ident (Maybe Class)) (Either String) +-- Monad for traversal of the class inheritance hierarchy. +-- The state keeps all already visited classes and marks which are already +-- resolved and which are currently being resolved. If we ever have a base class +-- that is currently being resolved, we have found a cycle in the hierarchy. +type ClTraversalM = StateT (Map.Map Ident ClassSlot) (Either String) -clDefsMetadata :: [TopDef Pos] -> Either String [Class] +data ClassSlot = Resolved (Class Code) | Resolving + +clDefsMetadata :: [TopDef Code] -> Either String [Class Code] clDefsMetadata cls = do res <- execStateT run Map.empty - return $ map fromJust (Map.elems res) + -- After we run we can assume that each class is Resolved (or we failed). + return $ map (\(Resolved cl) -> cl) (Map.elems res) where - run :: ClTraversalM [Class] + run :: ClTraversalM [Class Code] run = mapM clMetadata clIdents - clMetadata :: Ident -> ClTraversalM Class + clMetadata :: Ident -> ClTraversalM (Class Code) clMetadata i = do mbEntry <- gets $ Map.lookup i case mbEntry of + -- We never visited this class before, start resolution. Nothing -> case tsByIdent Map.! i of def@(ClDef _ i _) -> do cl <- defToMetadata def - modify $ Map.insert i (Just cl) + modify $ Map.insert i (Resolved cl) return cl def@(ClExtDef a i ext _) -> do - unless (ext `Map.member` tsByIdent) (undefBaseError a i ext) - modify $ Map.insert i Nothing + unless (ext `Map.member` tsByIdent) (undefBaseError (codePos a) i ext) + modify $ Map.insert i Resolving baseCl <- clMetadata ext nonExtCl <- defToMetadata def cl <- case nonExtCl `clExtend` baseCl of Left s -> lift $ Left $ Error.errorMsg (s ++ "\n") a ("In definition of class `" ++ showI i ++ "`.") Right cl -> return cl - modify $ Map.insert i (Just cl) + modify $ Map.insert i (Resolved cl) return cl - Just Nothing -> inhCycleError (unwrap $ tsByIdent Map.! i) i (i : cycle ++ [i]) + -- We already visited this class and were resolving its inheritance chain. + -- We must have come from a subclass, which implies a cycle in the hierarchy. + Just Resolving -> inhCycleError (codePos $ unwrap $ tsByIdent Map.! i) i (i : cycle ++ [i]) where cycle = takeWhile (/= i) (chain i) chain i = let ClExtDef _ _ ext _ = tsByIdent Map.! i in ext : chain ext - Just (Just cl) -> return cl + -- We already resolved this class before, either because it was earlier on the definition list + -- or one of its subclasses was resolved earlier. + Just (Resolved cl) -> return cl clIdents = map tdIdent cls tsByIdent = Map.fromList $ zip clIdents cls -inhCycleError :: Pos -> Ident -> [Ident] -> ClTraversalM a -inhCycleError a i cycle = lift $ Left $ Error.errorMsg msg a ctx - where msg = "Cycle detected in inheritance hierarchy: " ++ cycleString ++ "." - ctx = "In definition of class `" ++ showI i ++ "`." - cycleString = intercalate " -> " (map (\i -> "`" ++ showI i ++ "`") cycle) - -undefBaseError :: Pos -> Ident -> Ident -> ClTraversalM a -undefBaseError a i ext = lift $ Left $ Error.errorMsg msg a ctx - where msg = "Undefined base class `" ++ showI ext ++ "`." - ctx = "In definition of class `" ++ showI i ++ "`." - -defToMetadata :: TopDef Pos -> ClTraversalM Class +defToMetadata :: TopDef Code -> ClTraversalM (Class Code) defToMetadata def = do let fldDefs = filter isFldDef clDefs mthdDefs = filter isMthdDef clDefs @@ -118,5 +126,18 @@ tdIdent x = case x of ClDef _ i _ -> i ClExtDef _ i _ _ -> i -instance Show Metadata where - show (Meta cls) = ".metadata\n\n" ++ intercalate "\n\n" (map show cls) +instance Show (Metadata a) where + show (Meta cls) = ".metadata\n\n" ++ intercalate "\n\n" (map show $ Map.elems cls) + +-- Errors + +inhCycleError :: Maybe Pos -> Ident -> [Ident] -> ClTraversalM a +inhCycleError a i cycle = lift $ Left $ Error.errorMsgMb msg a (Just ctx) + where msg = "Cycle detected in inheritance hierarchy: " ++ cycleString ++ "." + ctx = "In definition of class `" ++ showI i ++ "`." + cycleString = intercalate " -> " (map (\i -> "`" ++ showI i ++ "`") cycle) + +undefBaseError :: Maybe Pos -> Ident -> Ident -> ClTraversalM a +undefBaseError a i ext = lift $ Left $ Error.errorMsgMb msg a (Just ctx) + where msg = "Undefined base class `" ++ showI ext ++ "`." + ctx = "In definition of class `" ++ showI i ++ "`." diff --git a/src/Syntax/Abs.hs b/src/Syntax/Abs.hs index 13a228e..15cde88 100644 --- a/src/Syntax/Abs.hs +++ b/src/Syntax/Abs.hs @@ -14,7 +14,7 @@ showI :: Ident -> String showI (Ident i) = i class Positioned a where - pos :: a -> Pos + pos :: a -> Maybe Pos class Unwrappable f where unwrap :: f a -> a @@ -23,7 +23,7 @@ unwrapPos :: Program (Maybe Pos) -> Program Pos unwrapPos p = fromJust <$> p instance Positioned Pos where - pos = id + pos = Just instance Functor Program where fmap f x = case x of @@ -111,7 +111,7 @@ data Stmt a | Cond a (Expr a) (Stmt a) | CondElse a (Expr a) (Stmt a) (Stmt a) | While a (Expr a) (Stmt a) - | For a (Type a) Ident (Expr a) + | For a (Type a) Ident (Expr a) (Stmt a) | SExp a (Expr a) deriving (Eq, Ord, Show, Read) @@ -128,7 +128,7 @@ instance Functor Stmt where Cond a expr stmt -> Cond (f a) (fmap f expr) (fmap f stmt) CondElse a expr stmt1 stmt2 -> CondElse (f a) (fmap f expr) (fmap f stmt1) (fmap f stmt2) While a expr stmt -> While (f a) (fmap f expr) (fmap f stmt) - For a type_ ident expr -> For (f a) (fmap f type_) ident (fmap f expr) + For a type_ ident expr stmt -> For (f a) (fmap f type_) ident (fmap f expr) (fmap f stmt) SExp a expr -> SExp (f a) (fmap f expr) instance Unwrappable Stmt where @@ -144,7 +144,7 @@ instance Unwrappable Stmt where Cond a _ _ -> a CondElse a _ _ _ -> a While a _ _ -> a - For a _ _ _ -> a + For a _ _ _ _ -> a SExp a _ -> a data Item a = NoInit a Ident | Init a Ident (Expr a) @@ -165,6 +165,7 @@ data Type a | Str a | Bool a | Void a + | Var a | Arr a (Type a) | Cl a Ident | Fun a (Type a) [Type a] @@ -177,6 +178,7 @@ instance Functor Type where Str a -> Str (f a) Bool a -> Bool (f a) Void a -> Void (f a) + Var a -> Var (f a) Arr a type_ -> Arr (f a) (fmap f type_) Cl a ident -> Cl (f a) ident Fun a type_ types -> Fun (f a) (fmap f type_) (map (fmap f) types) @@ -188,6 +190,7 @@ instance Unwrappable Type where Str a -> a Bool a -> a Void a -> a + Var a -> a Arr a _ -> a Cl a _ -> a Fun a _ _ -> a @@ -199,7 +202,9 @@ data Expr a | EString a String | ELitTrue a | ELitFalse a - | ELitNull a (Type a) + | ENullI a Ident + | ENullArr a Ident + | ENull a (Type a) | ENew a (Type a) | ENewArr a (Type a) (Expr a) | EApp a (Expr a) [Expr a] @@ -221,7 +226,9 @@ instance Functor Expr where EString a string -> EString (f a) string ELitTrue a -> ELitTrue (f a) ELitFalse a -> ELitFalse (f a) - ELitNull a type_ -> ELitNull (f a) (fmap f type_) + ENullI a ident -> ENullI (f a) ident + ENullArr a ident -> ENullArr (f a) ident + ENull a type_ -> ENull (f a) (fmap f type_) ENew a type_ -> ENew (f a) (fmap f type_) ENewArr a type_ expr -> ENewArr (f a) (fmap f type_) (fmap f expr) EApp a expr exprs -> EApp (f a) (fmap f expr) (map (fmap f) exprs) @@ -242,7 +249,9 @@ instance Unwrappable Expr where EString a _ -> a ELitTrue a -> a ELitFalse a -> a - ELitNull a _ -> a + ENullI a _ -> a + ENullArr a _ -> a + ENull a _ -> a ENew a _ -> a ENewArr a _ _ -> a EApp a _ _ -> a diff --git a/src/Syntax/Code.hs b/src/Syntax/Code.hs new file mode 100644 index 0000000..a0edc7f --- /dev/null +++ b/src/Syntax/Code.hs @@ -0,0 +1,20 @@ +{-# LANGUAGE FlexibleInstances #-} +-- Representation of a piece of source code with its position info. +module Syntax.Code where + +import Syntax.Abs +import Syntax.Printer + +data Code = Code { codeString :: String, codePos :: Maybe Pos } + +toCode :: (Unwrappable f, Positioned a, Print (f a)) => f a -> Code +toCode x = Code (render $ prt 0 x) (pos $ unwrap x) + +instance Positioned Code where + pos = codePos + +instance Positioned (Maybe Code) where + pos x = x >>= codePos + +instance Show Code where + show = codeString diff --git a/src/Syntax/Latte.cf b/src/Syntax/Latte.cf index 8df6477..507b0cf 100644 --- a/src/Syntax/Latte.cf +++ b/src/Syntax/Latte.cf @@ -47,7 +47,7 @@ VRet. Stmt ::= "return" ";" ; Cond. Stmt ::= "if" "(" Expr ")" Stmt ; CondElse. Stmt ::= "if" "(" Expr ")" Stmt "else" Stmt ; While. Stmt ::= "while" "(" Expr ")" Stmt ; -For. Stmt ::= "for" "(" Type Ident ":" Expr ")"; +For. Stmt ::= "for" "(" Type Ident ":" Expr ")" Stmt; SExp. Stmt ::= Expr ";" ; -- Types --------------------------------------------------- @@ -56,6 +56,7 @@ Int. Type ::= "int" ; Str. Type ::= "string" ; Bool. Type ::= "boolean" ; Void. Type ::= "void" ; +Var. Type ::= "var" ; Arr. Type ::= Type "[]" ; Cl. Type ::= Ident ; internal Fun. Type ::= Type "(" [Type] ")" ; @@ -70,7 +71,9 @@ ELitInt. Expr6 ::= Integer ; EString. Expr6 ::= String ; ELitTrue. Expr6 ::= "true" ; ELitFalse. Expr6 ::= "false" ; -ELitNull. Expr6 ::= "(" Type ")null" ; +ENullI. Expr6 ::= "(" Ident ")" "null" ; +ENullArr. Expr6 ::= "(" Ident "[]" ")" "null" ; +internal ENull. Expr6 ::= "(" Type ")" "null" ; ENew. Expr6 ::= "new" Type ; ENewArr. Expr6 ::= "new" Type "[" Expr "]" ; EApp. Expr6 ::= Expr6 "(" [Expr] ")" ; diff --git a/src/Syntax/Lexer.hs b/src/Syntax/Lexer.hs index 0d992e7..c87e5c2 100644 --- a/src/Syntax/Lexer.hs +++ b/src/Syntax/Lexer.hs @@ -17,11 +17,11 @@ import Data.Char (ord) #endif #if __GLASGOW_HASKELL__ >= 503 import Data.Array -import Data.Array.Base (unsafeAt) #else import Array #endif #if __GLASGOW_HASKELL__ >= 503 +import Data.Array.Base (unsafeAt) import GHC.Exts #else import GlaExts @@ -30,21 +30,21 @@ alex_tab_size :: Int alex_tab_size = 8 alex_base :: AlexAddr alex_base = AlexA# - "\xf8\xff\xff\xff\x4c\x00\x00\x00\xcc\x00\x00\x00\x4c\x01\x00\x00\xcc\x01\x00\x00\x4c\x02\x00\x00\x91\xff\xff\xff\x4c\x03\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x7d\x03\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00\xee\x04\x00\x00\x55\x00\x00\x00\xae\x04\x00\x00\x9b\xff\xff\xff\x84\x05\x00\x00\x00\x00\x00\x00\xf0\x04\x00\x00\x00\x00\x00\x00\xc5\x05\x00\x00\xc5\x06\x00\x00\xc6\x06\x00\x00\x8c\xff\xff\xff\x9d\xff\xff\xff\x89\x07\x00\x00\x49\x07\x00\x00\x00\x00\x00\x00\x49\x08\x00\x00\x09\x08\x00\x00\x00\x00\x00\x00\xff\x08\x00\x00\xf5\x09\x00\x00\x00\x00\x00\x00\x74\x00\x00\x00\xe0\xff\xff\xff\xe1\xff\xff\xff\xde\xff\xff\xff\xd0\xff\xff\xff\xb1\xff\xff\xff\x00\x00\x00\x00\xa2\xff\xff\xff\xeb\xff\xff\xff\xce\x0a\x00\x00\x00\x00\x00\x00\x52\x00\x00\x00"# + "\xf8\xff\xff\xff\x4c\x00\x00\x00\xcc\x00\x00\x00\x4c\x01\x00\x00\xcc\x01\x00\x00\x4c\x02\x00\x00\x4c\x03\x00\x00\x0c\x03\x00\x00\x00\x00\x00\x00\x7d\x03\x00\x00\x00\x00\x00\x00\xee\x03\x00\x00\xee\x04\x00\x00\x55\x00\x00\x00\xae\x04\x00\x00\x84\x05\x00\x00\x00\x00\x00\x00\xf0\x04\x00\x00\x00\x00\x00\x00\xc5\x05\x00\x00\xc5\x06\x00\x00\xc6\x06\x00\x00\x8a\xff\xff\xff\x89\x07\x00\x00\x49\x07\x00\x00\x00\x00\x00\x00\x49\x08\x00\x00\x09\x08\x00\x00\x00\x00\x00\x00\xff\x08\x00\x00\xf5\x09\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xe3\xff\xff\xff\xdc\xff\xff\xff\xe1\xff\xff\xff\xd2\xff\xff\xff\xb3\xff\xff\xff\x00\x00\x00\x00\xeb\xff\xff\xff\xce\x0a\x00\x00\x00\x00\x00\x00\x4d\x00\x00\x00"# alex_table :: AlexAddr alex_table = AlexA# - "\x00\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x10\x00\x19\x00\x29\x00\x29\x00\x11\x00\x29\x00\x29\x00\x29\x00\x29\x00\x21\x00\x06\x00\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x27\x00\x16\x00\x20\x00\x00\x00\x29\x00\x2b\x00\x00\x00\x29\x00\x2a\x00\x29\x00\x25\x00\x29\x00\x26\x00\x29\x00\x24\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x29\x00\x29\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x28\x00\x00\x00\x29\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x29\x00\x18\x00\x29\x00\x01\x00\x16\x00\x00\x00\x00\x00\x00\x00\x22\x00\x16\x00\x23\x00\x23\x00\x23\x00\x23\x00\x23\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x2e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\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\x07\x00\x08\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\x1d\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\x1a\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x02\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x03\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x1b\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\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\x07\x00\x08\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\x1e\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\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x00\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x2d\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x0e\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x0d\x00\x0f\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1d\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\x1e\x00\x02\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x15\x00\x04\x00\x0b\x00\x0b\x00\x0b\x00\x0c\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1a\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1b\x00\x03\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x13\x00\x05\x00\x09\x00\x09\x00\x09\x00\x0a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2c\x00\x00\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# + "\x00\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x26\x00\x26\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x0f\x00\x26\x00\x26\x00\x26\x00\x26\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x24\x00\x14\x00\x1d\x00\x00\x00\x26\x00\x27\x00\x20\x00\x26\x00\x26\x00\x26\x00\x22\x00\x26\x00\x23\x00\x26\x00\x21\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x26\x00\x26\x00\x24\x00\x24\x00\x24\x00\x00\x00\x00\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x25\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x26\x00\x16\x00\x26\x00\x01\x00\x14\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x14\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x15\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\x14\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\x06\x00\x07\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\x1a\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x17\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x02\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x03\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\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\x11\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x18\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x06\x00\x07\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\x1b\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\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x00\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x29\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x0d\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x14\x00\x00\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x0c\x00\x0e\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1a\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1c\x00\x1b\x00\x02\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x12\x00\x13\x00\x04\x00\x0a\x00\x0a\x00\x0a\x00\x0b\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x17\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x19\x00\x18\x00\x03\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x11\x00\x05\x00\x08\x00\x08\x00\x08\x00\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# alex_check :: AlexAddr alex_check = AlexA# - "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x75\x00\x6c\x00\x7c\x00\x6c\x00\x2a\x00\x2d\x00\x2b\x00\x3d\x00\x5d\x00\x2f\x00\x6e\x00\x26\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\x25\x00\x26\x00\xff\xff\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\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\x5b\x00\xff\xff\x5d\x00\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\x7c\x00\x7d\x00\x2a\x00\x22\x00\xff\xff\xff\xff\xff\xff\x2f\x00\x27\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x5c\x00\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\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\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\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\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\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\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\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\xff\xff\xc2\x00\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\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\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\x0a\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# + "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x7c\x00\x2b\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2a\x00\x2d\x00\x3d\x00\x5d\x00\x26\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\xff\xff\x25\x00\x26\x00\x20\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\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\x5b\x00\xff\xff\x5d\x00\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\x7c\x00\x7d\x00\x2a\x00\x22\x00\xff\xff\xff\xff\xff\xff\x2f\x00\x27\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xc3\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x74\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\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\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\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\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x2a\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\xff\xff\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\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\xff\xff\xc2\x00\xc3\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00\x48\x00\x49\x00\x4a\x00\x4b\x00\x4c\x00\x4d\x00\x4e\x00\x4f\x00\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00\x58\x00\x59\x00\x5a\x00\x5b\x00\x5c\x00\x5d\x00\x5e\x00\x5f\x00\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00\x68\x00\x69\x00\x6a\x00\x6b\x00\x6c\x00\x6d\x00\x6e\x00\x6f\x00\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00\x78\x00\x79\x00\x7a\x00\x7b\x00\x7c\x00\x7d\x00\x7e\x00\x7f\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\x0a\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\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\x0a\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\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# alex_deflt :: AlexAddr alex_deflt = AlexA# - "\xff\xff\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x11\x00\x11\x00\x12\x00\x12\x00\x14\x00\x14\x00\x16\x00\xff\xff\x16\x00\xff\xff\x11\x00\x1c\x00\x1c\x00\x1f\x00\x1f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\x21\x00\x21\x00\x20\x00\x20\x00\x20\x00\x20\x00\x21\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\x0f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0f\x00\x0f\x00\x10\x00\x10\x00\x12\x00\x12\x00\x14\x00\xff\xff\x14\x00\x0f\x00\x19\x00\x19\x00\x1c\x00\x1c\x00\xff\xff\xff\xff\xff\xff\x1e\x00\x1e\x00\x1e\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1e\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"# -alex_accept = listArray (0 :: Int, 46) +alex_accept = listArray (0 :: Int, 42) [ AlexAccNone , AlexAccNone , AlexAccNone @@ -74,14 +74,10 @@ alex_accept = listArray (0 :: Int, 46) , AlexAccNone , AlexAccNone , AlexAccNone - , AlexAccNone - , AlexAccNone - , AlexAccNone , AlexAccSkip , AlexAccSkip , AlexAccSkip , AlexAccSkip - , AlexAcc 10 , AlexAcc 9 , AlexAcc 8 , AlexAcc 7 @@ -94,9 +90,8 @@ alex_accept = listArray (0 :: Int, 46) , AlexAcc 0 ] -alex_actions = array (0 :: Int, 11) - [ (10,alex_action_4) - , (9,alex_action_4) +alex_actions = array (0 :: Int, 10) + [ (9,alex_action_4) , (8,alex_action_4) , (7,alex_action_4) , (6,alex_action_4) @@ -174,7 +169,7 @@ eitherResIdent tv s = treeFind resWords | s == a = t resWords :: BTree -resWords = b ">" 23 (b "," 12 (b "(" 6 (b "%" 3 (b "!=" 2 (b "!" 1 N N) N) (b "&&" 5 (b "&" 4 N N) N)) (b "*" 9 (b ")null" 8 (b ")" 7 N N) N) (b "++" 11 (b "+" 10 N N) N))) (b ";" 18 (b "." 15 (b "--" 14 (b "-" 13 N N) N) (b ":" 17 (b "/" 16 N N) N)) (b "=" 21 (b "<=" 20 (b "<" 19 N N) N) (b "==" 22 N N)))) (b "if" 34 (b "class" 29 (b "[]" 26 (b "[" 25 (b ">=" 24 N N) N) (b "boolean" 28 (b "]" 27 N N) N)) (b "false" 32 (b "extends" 31 (b "else" 30 N N) N) (b "for" 33 N N))) (b "void" 40 (b "return" 37 (b "new" 36 (b "int" 35 N N) N) (b "true" 39 (b "string" 38 N N) N)) (b "||" 43 (b "{" 42 (b "while" 41 N N) N) (b "}" 44 N N)))) +resWords = b ">=" 23 (b "-" 12 (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 "," 11 (b "++" 10 N N) N))) (b "<" 18 (b "/" 15 (b "." 14 (b "--" 13 N N) N) (b ";" 17 (b ":" 16 N N) N)) (b "==" 21 (b "=" 20 (b "<=" 19 N N) N) (b ">" 22 N N)))) (b "new" 35 (b "else" 29 (b "]" 26 (b "[]" 25 (b "[" 24 N N) N) (b "class" 28 (b "boolean" 27 N N) N)) (b "for" 32 (b "false" 31 (b "extends" 30 N N) N) (b "int" 34 (b "if" 33 N N) N))) (b "void" 41 (b "string" 38 (b "return" 37 (b "null" 36 N N) N) (b "var" 40 (b "true" 39 N N) N)) (b "||" 44 (b "{" 43 (b "while" 42 N N) N) (b "}" 45 N N)))) where b s n = let bs = id s in B bs (TS bs n) diff --git a/src/Syntax/Parser.hs b/src/Syntax/Parser.hs index 0533830..6a447e3 100644 --- a/src/Syntax/Parser.hs +++ b/src/Syntax/Parser.hs @@ -14,7 +14,7 @@ import qualified GHC.Exts as Happy_GHC_Exts import Control.Applicative(Applicative(..)) import Control.Monad (ap) --- parser produced by Happy Version 1.19.11 +-- parser produced by Happy Version 1.19.12 newtype HappyAbsSyn = HappyAbsSyn HappyAny #if __GLASGOW_HASKELL__ >= 607 @@ -234,40 +234,40 @@ happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x happyExpList :: HappyAddr -happyExpList = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x18\xa4\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\xa4\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x02\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xa4\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xa4\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x08\xa4\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x02\x88\xff\x7b\x00\x00\x00\x00\x00\x00\x00\x08\xa4\x10\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\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x10\x00\x00\x00\x00\x20\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\xec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x80\x48\x70\x00\x00\x00\x00\x21\x10\x00\x88\xec\x70\x00\x00\x00\x00\x20\x00\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xa4\x10\x00\x00\x00\x00\x21\x10\x02\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x08\xa4\x10\x00\x00\x00\x00\x20\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x02\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\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\x04\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x10\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x02\x88\xff\x73\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x21\x10\x02\x88\xff\x73\x00\x00\x00\x00\x00\x00\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\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x00\x80\x48\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x02\x88\xff\x73\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"# +happyExpList = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x0c\xa2\x21\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x41\x34\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x10\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x01\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x88\x86\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x68\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x80\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\x80\x40\x34\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x08\x42\x00\xf1\xfd\x3d\x00\x00\x00\x00\x00\x00\x00\x02\xd1\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x10\x00\x00\x00\x00\x20\x20\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\x00\x20\x01\x60\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x40\x02\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x20\x22\x70\x00\x00\x00\x00\x21\x08\x00\x40\x44\xe0\x00\x00\x00\x00\x40\x00\x00\x80\x88\xc0\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\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x81\x68\x08\x00\x00\x00\x80\x10\x84\x00\x20\x22\x70\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x04\x01\x00\x88\x08\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x84\x20\x00\x00\x11\x81\x03\x00\x00\x00\x00\x00\x00\x20\x10\x0d\x01\x00\x00\x00\x00\x02\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x10\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x10\x00\x80\x88\xc0\x01\x00\x00\x00\x84\x20\x00\x00\x11\x81\x03\x00\x00\x00\x08\x41\x00\x00\x22\x02\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x04\x01\x00\x88\x08\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x41\x00\x00\x22\x02\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x08\x02\x00\x10\x11\x38\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x20\x00\x00\x11\x81\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x10\x82\x00\x00\x44\x04\x0e\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x21\x08\x00\x40\x44\xe0\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x08\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x21\x08\x00\x40\x44\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x08\x41\x08\x20\xbe\x3f\x07\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x20\x04\x21\x80\xf8\xfe\x1c\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x41\x00\x00\x22\x02\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x42\x10\x00\x80\x88\xc0\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\x20\x04\x21\x80\xf8\xfe\x1c\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x80\x10\x84\x00\xe2\xfb\x73\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# {-# NOINLINE happyExpListPerState #-} happyExpListPerState st = token_strs_expected - where token_strs = ["error","%dummy","%start_pProgram_internal","Ident","Integer","String","Program","TopDef","ListTopDef","Arg","ListArg","ClBlock","ClDef","ListClDef","Block","ListStmt","Stmt","Item","ListItem","Type","ListType","Expr6","Expr5","Expr4","Expr3","Expr2","Expr1","Expr","ListExpr","AddOp","MulOp","RelOp","'!'","'!='","'%'","'&'","'&&'","'('","')'","')null'","'*'","'+'","'++'","','","'-'","'--'","'.'","'/'","':'","';'","'<'","'<='","'='","'=='","'>'","'>='","'['","'[]'","']'","'boolean'","'class'","'else'","'extends'","'false'","'for'","'if'","'int'","'new'","'return'","'string'","'true'","'void'","'while'","'{'","'||'","'}'","L_ident","L_integ","L_quoted","%eof"] - bit_start = st * 80 - bit_end = (st + 1) * 80 + where token_strs = ["error","%dummy","%start_pProgram_internal","Ident","Integer","String","Program","TopDef","ListTopDef","Arg","ListArg","ClBlock","ClDef","ListClDef","Block","ListStmt","Stmt","Item","ListItem","Type","ListType","Expr6","Expr5","Expr4","Expr3","Expr2","Expr1","Expr","ListExpr","AddOp","MulOp","RelOp","'!'","'!='","'%'","'&'","'&&'","'('","')'","'*'","'+'","'++'","','","'-'","'--'","'.'","'/'","':'","';'","'<'","'<='","'='","'=='","'>'","'>='","'['","'[]'","']'","'boolean'","'class'","'else'","'extends'","'false'","'for'","'if'","'int'","'new'","'null'","'return'","'string'","'true'","'var'","'void'","'while'","'{'","'||'","'}'","L_ident","L_integ","L_quoted","%eof"] + bit_start = st * 81 + bit_end = (st + 1) * 81 read_bit = readArrayBit happyExpList bits = map read_bit [bit_start..bit_end - 1] - bits_indexed = zip bits [0..79] + bits_indexed = zip bits [0..80] token_strs_expected = concatMap f bits_indexed f (False, _) = [] f (True, nr) = [token_strs !! nr] happyActOffsets :: HappyAddr -happyActOffsets = HappyA# "\x51\x00\xdb\xff\x00\x00\x00\x00\xda\xff\x51\x00\x00\x00\xf1\xff\x00\x00\xe3\xff\x00\x00\x00\x00\x00\x00\xe2\xff\x33\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x15\x00\x00\x00\xa8\x01\x1a\x00\x58\x00\x60\x00\xf1\xff\x00\x00\x45\x00\xa9\x01\x00\x00\x00\x00\xf1\xff\x00\x00\xc9\x00\x00\x00\x00\x00\x00\x00\x01\x00\xa9\x01\x00\x00\x76\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xff\x2c\x00\x00\x00\xcd\x00\xfc\xff\x71\x00\x47\x00\xfd\xff\x74\x00\x3b\x00\x74\x00\x00\x00\x00\x00\x72\x00\x85\x00\xa9\x01\x5f\x00\x00\x00\x8f\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x96\x00\x00\x00\x91\x00\x6f\x00\xa9\x01\x2c\x00\x05\x00\x2f\x00\xa5\x00\x2c\x00\x00\x00\x6f\x00\x6f\x00\x6f\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x81\x00\x6f\x00\x98\x00\xa6\x00\xad\x00\xbf\x00\xc2\x00\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\x00\x6f\x00\xd0\x00\x00\x00\xe0\x00\xd1\x00\x00\x00\xcd\x00\x00\x00\x36\x00\x00\x00\xdb\x00\x00\x00\x00\x00\xf1\xff\xe7\x00\x6f\x00\x00\x00\xe8\x00\x2b\x00\xd6\x00\x2b\x00\xe2\x00\x00\x00\x00\x00\x6f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\xd8\x00\x00\x00\x00\x00\x2b\x00\xed\x00\x00\x00\x00\x00\x00\x00"# +happyActOffsets = HappyA# "\xed\xff\xd8\xff\x00\x00\x00\x00\xe0\xff\xed\xff\x00\x00\xea\xff\x00\x00\xef\xff\x00\x00\x00\x00\x00\x00\x00\x00\x3b\x00\x19\x00\x00\x00\x00\x00\x99\x01\x00\x00\x0e\x00\x00\x00\x90\x01\x16\x00\x5a\x00\x65\x00\xea\xff\x00\x00\x43\x00\x99\x01\x00\x00\x00\x00\xea\xff\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00\x99\x01\x00\x00\x70\x00\xf7\xff\x00\x00\x00\x00\x00\x00\x00\x00\xea\xff\x06\x00\x00\x00\xa5\x00\x3c\x00\xad\x00\x4d\x00\x50\x00\x14\x00\x61\x00\x14\x00\x00\x00\x00\x00\x86\x00\x87\x00\x99\x01\x57\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x96\x00\x00\x00\xf2\xff\x61\x00\x99\x01\x06\x00\xfe\xff\x8b\x00\x06\x00\x00\x00\x61\x00\x61\x00\x61\x00\x00\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x00\x00\x61\x00\x00\x00\x00\x00\x00\x00\x61\x00\x7c\x00\x61\x00\x97\x00\xa1\x00\xa0\x00\xb0\x00\xb4\x00\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9a\x00\x61\x00\xb1\x00\x00\x00\xcf\x00\xd6\x00\x00\x00\xa5\x00\x00\x00\x9d\x00\x00\x00\xce\x00\x00\x00\xba\x00\xda\x00\xea\xff\xdc\x00\x61\x00\x00\x00\xdd\x00\x2c\x00\xcc\x00\x2c\x00\xe1\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x61\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x61\x00\xd8\x00\x00\x00\x00\x00\x2c\x00\xeb\x00\x2c\x00\x00\x00\x00\x00\x00\x00"# happyGotoOffsets :: HappyAddr -happyGotoOffsets = HappyA# "\xb6\x01\x00\x00\x00\x00\x00\x00\x00\x00\x3a\x00\x00\x00\x01\x01\x00\x00\x02\x01\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\x00\x00\x00\x00\x56\x00\x00\x00\x04\x01\xfc\x00\xc9\x01\xfd\x00\x00\x00\x00\x00\x07\x01\x00\x00\xff\x00\x8a\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xb3\x00\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\xf2\x00\xf5\x00\x05\x01\x00\x00\x00\x00\x34\x00\x17\x01\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6b\x00\x1e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x37\x01\x00\x00\x00\x00\x00\x00\x00\x00\x3e\x01\x97\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x01\x5e\x01\xab\x01\x00\x00\x93\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaf\x01\x00\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\x03\x00\x1a\x01\x65\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\xda\x00\x6c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x01\x00\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x85\x01\x00\x00\x00\x00\xcc\x00\x00\x00\xe5\x00\x00\x00\x00\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x01\x00\x00\x00\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00"# +happyGotoOffsets = HappyA# "\xa3\x01\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x01\x00\x00\xf3\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\x00\x00\x00\x00\x00\x00\x00\xc8\x01\x00\x00\xf8\x00\xf0\x00\x6f\x00\xf4\x00\x00\x00\x00\x00\xfd\x00\x00\x00\xff\x00\xca\x01\x00\x00\x00\x00\x0b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xa3\x00\xcc\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x00\x00\x00\x00\x00\xe4\x00\xf7\x00\xf1\x00\x00\x00\x00\x00\x34\x00\x0e\x01\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x00\x27\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x35\x01\x3a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4e\x01\x55\x01\x9c\x01\x00\x00\x5e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x69\x00\x00\x00\x00\x00\xc3\x01\x00\x00\x00\x00\x00\x00\x81\x00\x13\x01\x5c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x01\x00\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x75\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x01\x00\x00\x7c\x01\x00\x00\x00\x00\xbc\x00\x00\x00\xd5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x83\x01\x00\x00\x00\x00\x00\x00\xee\x00\x00\x00\x07\x01\x00\x00\x00\x00\x00\x00"# happyAdjustOffset :: Happy_GHC_Exts.Int# -> Happy_GHC_Exts.Int# happyAdjustOffset off = off happyDefActions :: HappyAddr -happyDefActions = HappyA# "\x00\x00\x00\x00\xfe\xff\xd3\xff\x00\x00\xf7\xff\xfb\xff\x00\x00\xd6\xff\x00\x00\xd8\xff\xd7\xff\xd5\xff\x00\x00\x00\x00\xd4\xff\xf6\xff\xf4\xff\xf9\xff\x00\x00\xee\xff\x00\x00\x00\x00\xf3\xff\x00\x00\x00\x00\xf5\xff\x00\x00\xf4\xff\xf8\xff\xed\xff\x00\x00\xf1\xff\x00\x00\xf2\xff\xfa\xff\xeb\xff\x00\x00\xf4\xff\xef\xff\x00\x00\xcf\xff\xce\xff\xcd\xff\xe8\xff\xea\xff\x00\x00\xc1\xff\xbf\xff\xbd\xff\xbb\xff\xb9\xff\xb7\xff\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xff\xcb\xff\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xff\x00\x00\xec\xff\xfd\xff\xfc\xff\x00\x00\xcf\xff\x00\x00\xe2\xff\xc9\xff\x00\x00\x00\x00\xc3\xff\xcf\xff\x00\x00\x00\x00\xc2\xff\xdd\xff\x00\x00\x00\x00\x00\x00\xa9\xff\x00\x00\xae\xff\xad\xff\xaa\xff\xac\xff\xab\xff\x00\x00\xb3\xff\xb2\xff\x00\x00\xaf\xff\xb1\xff\xb0\xff\xb6\xff\x00\x00\x00\x00\xdc\xff\xda\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xff\xe4\xff\xe5\xff\xe7\xff\x00\x00\x00\x00\x00\x00\xc5\xff\xb5\xff\x00\x00\xc0\xff\xbe\xff\xba\xff\xbc\xff\xb8\xff\x00\x00\xc4\xff\xca\xff\x00\x00\x00\x00\x00\x00\xe3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe6\xff\xc7\xff\xb6\xff\xc6\xff\xdb\xff\xd9\xff\xb4\xff\x00\x00\xe1\xff\xc8\xff\xdf\xff\x00\x00\x00\x00\xde\xff\xe0\xff"# +happyDefActions = HappyA# "\x00\x00\x00\x00\xfe\xff\xd2\xff\x00\x00\xf7\xff\xfb\xff\x00\x00\xd6\xff\x00\x00\xd8\xff\xd7\xff\xd4\xff\xd5\xff\x00\x00\x00\x00\xd3\xff\xf6\xff\xf4\xff\xf9\xff\x00\x00\xee\xff\x00\x00\x00\x00\xf3\xff\x00\x00\x00\x00\xf5\xff\x00\x00\xf4\xff\xf8\xff\xed\xff\x00\x00\xf1\xff\x00\x00\xf2\xff\xfa\xff\xeb\xff\x00\x00\xf4\xff\xef\xff\x00\x00\xce\xff\xcd\xff\xcc\xff\xe8\xff\xea\xff\x00\x00\xbf\xff\xbd\xff\xbb\xff\xb9\xff\xb7\xff\xb5\xff\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xff\xca\xff\x00\x00\x00\x00\x00\x00\x00\x00\xcb\xff\x00\x00\xec\xff\xfd\xff\xfc\xff\x00\x00\xce\xff\x00\x00\xe2\xff\xc7\xff\x00\x00\x00\x00\xc1\xff\xce\xff\x00\x00\xc0\xff\xdd\xff\x00\x00\x00\x00\x00\x00\xa7\xff\x00\x00\xac\xff\xab\xff\xa8\xff\xaa\xff\xa9\xff\x00\x00\xb1\xff\xb0\xff\x00\x00\xad\xff\xaf\xff\xae\xff\xb4\xff\x00\x00\x00\x00\xdc\xff\xda\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xff\xe4\xff\xe5\xff\xe7\xff\x00\x00\x00\x00\x00\x00\xc3\xff\xb3\xff\x00\x00\xbe\xff\xbc\xff\xb8\xff\xba\xff\xb6\xff\x00\x00\xc2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\xff\xe6\xff\xc5\xff\xb4\xff\xc4\xff\xdb\xff\xd9\xff\xb2\xff\xc8\xff\x00\x00\xe1\xff\xc6\xff\xdf\xff\x00\x00\x00\x00\x00\x00\xe0\xff\xde\xff"# happyCheck :: HappyAddr -happyCheck = HappyA# "\xff\xff\x1f\x00\x01\x00\x00\x00\x01\x00\x02\x00\x0a\x00\x06\x00\x2d\x00\x0d\x00\x30\x00\x1a\x00\x2a\x00\x08\x00\x0d\x00\x12\x00\x2d\x00\x0b\x00\x15\x00\x12\x00\x0e\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1c\x00\x2d\x00\x1a\x00\x1a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x01\x00\x2c\x00\x2d\x00\x2e\x00\x2f\x00\x06\x00\x06\x00\x2d\x00\x00\x00\x01\x00\x02\x00\x08\x00\x0d\x00\x06\x00\x00\x00\x0f\x00\x01\x00\x12\x00\x04\x00\x05\x00\x0a\x00\x06\x00\x2d\x00\x0d\x00\x2a\x00\x19\x00\x12\x00\x1c\x00\x0d\x00\x1a\x00\x10\x00\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x00\x00\x1c\x00\x2d\x00\x2e\x00\x2f\x00\x20\x00\x06\x00\x07\x00\x23\x00\x24\x00\x01\x00\x26\x00\x27\x00\x28\x00\x0c\x00\x06\x00\x10\x00\x07\x00\x2d\x00\x2e\x00\x2f\x00\x00\x00\x0d\x00\x1c\x00\x1d\x00\x2a\x00\x01\x00\x12\x00\x2b\x00\x02\x00\x23\x00\x06\x00\x05\x00\x26\x00\x06\x00\x28\x00\x06\x00\x10\x00\x0d\x00\x07\x00\x2d\x00\x20\x00\x00\x00\x01\x00\x02\x00\x24\x00\x13\x00\x14\x00\x27\x00\x16\x00\x17\x00\x18\x00\x00\x00\x06\x00\x2d\x00\x2e\x00\x2f\x00\x20\x00\x06\x00\x07\x00\x12\x00\x24\x00\x20\x00\x06\x00\x27\x00\x00\x00\x24\x00\x00\x00\x10\x00\x27\x00\x2d\x00\x2e\x00\x2f\x00\x06\x00\x07\x00\x2d\x00\x2e\x00\x2f\x00\x00\x00\x01\x00\x02\x00\x10\x00\x12\x00\x10\x00\x19\x00\x1a\x00\x07\x00\x15\x00\x2d\x00\x00\x00\x01\x00\x02\x00\x0c\x00\x00\x00\x01\x00\x02\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x0b\x00\x12\x00\x0d\x00\x12\x00\x13\x00\x10\x00\x00\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\x06\x00\x03\x00\x12\x00\x0e\x00\x0f\x00\x12\x00\x2a\x00\x09\x00\x0b\x00\x07\x00\x0d\x00\x00\x00\x12\x00\x10\x00\x10\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\x0e\x00\x0f\x00\x2d\x00\x1b\x00\x0c\x00\x12\x00\x07\x00\x07\x00\x0b\x00\x1b\x00\x0d\x00\x11\x00\x07\x00\x10\x00\x1e\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\x00\x00\x00\x00\x08\x00\x00\x00\x08\x00\x0a\x00\x00\x00\x00\x00\x0b\x00\x0b\x00\x0d\x00\x0c\x00\x1b\x00\x10\x00\x1a\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\x00\x00\x0b\x00\x00\x00\x1a\x00\x00\x00\x01\x00\x02\x00\x1c\x00\xff\xff\xff\xff\x1b\x00\xff\xff\xff\xff\x10\x00\xff\xff\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x00\x00\x01\x00\x02\x00\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\x03\x00\x04\x00\x05\x00\xff\xff\x12\x00\x13\x00\x14\x00\x15\x00\x12\x00\x13\x00\x14\x00\x1c\x00\x1c\x00\x10\x00\xff\xff\xff\xff\x00\x00\xff\xff\x23\x00\x23\x00\xff\xff\x26\x00\x26\x00\x28\x00\x28\x00\x09\x00\xff\xff\x2c\x00\x2d\x00\x2d\x00\xff\xff\xff\xff\x10\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"# +happyCheck = HappyA# "\xff\xff\x0a\x00\x01\x00\x19\x00\x0d\x00\x07\x00\x2e\x00\x06\x00\x1b\x00\x1c\x00\x18\x00\x19\x00\x06\x00\x0c\x00\x06\x00\x22\x00\x19\x00\x31\x00\x11\x00\x26\x00\x0e\x00\x28\x00\x29\x00\x19\x00\x2e\x00\x11\x00\x06\x00\x2e\x00\x1b\x00\x2e\x00\x18\x00\x06\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x2e\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x01\x00\x2d\x00\x2e\x00\x2f\x00\x30\x00\x06\x00\x1f\x00\x00\x00\x01\x00\x02\x00\x23\x00\x0c\x00\x00\x00\x00\x00\x27\x00\x2e\x00\x11\x00\x00\x00\x01\x00\x02\x00\x2b\x00\x2e\x00\x2f\x00\x30\x00\x09\x00\x12\x00\x1b\x00\x0c\x00\x10\x00\x10\x00\x1f\x00\x20\x00\x21\x00\x22\x00\x23\x00\x12\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x01\x00\x1e\x00\x2e\x00\x2f\x00\x30\x00\x06\x00\x00\x00\x01\x00\x02\x00\x11\x00\x01\x00\x0c\x00\x14\x00\x0b\x00\x2b\x00\x06\x00\x11\x00\x00\x00\x01\x00\x02\x00\x07\x00\x0c\x00\x2b\x00\x00\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x1f\x00\x07\x00\x09\x00\x2c\x00\x23\x00\x12\x00\x13\x00\x14\x00\x27\x00\x10\x00\x1f\x00\x00\x00\x01\x00\x02\x00\x23\x00\x2e\x00\x2f\x00\x30\x00\x27\x00\x00\x00\x01\x00\x02\x00\x06\x00\x06\x00\x06\x00\x2e\x00\x2f\x00\x30\x00\x07\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x00\x00\x01\x00\x02\x00\x09\x00\x11\x00\x03\x00\x0c\x00\x2e\x00\x14\x00\x0b\x00\x08\x00\x0b\x00\x02\x00\x0d\x00\x11\x00\x05\x00\x10\x00\x0f\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\x12\x00\x13\x00\x11\x00\x15\x00\x16\x00\x17\x00\x11\x00\x2b\x00\x0b\x00\x2e\x00\x0d\x00\x00\x00\x1a\x00\x10\x00\x00\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\x0e\x00\x0f\x00\x0b\x00\x0e\x00\x0f\x00\x07\x00\x24\x00\x11\x00\x0b\x00\x07\x00\x0d\x00\x07\x00\x07\x00\x10\x00\x1a\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\x10\x00\x07\x00\x00\x00\x24\x00\x1d\x00\x00\x00\x08\x00\x00\x00\x0b\x00\x0a\x00\x0d\x00\x08\x00\x00\x00\x10\x00\x1b\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\x0b\x00\x00\x00\x0c\x00\x1c\x00\x00\x00\x01\x00\x02\x00\x1a\x00\x0b\x00\x00\x00\x0d\x00\x0b\x00\x1b\x00\x10\x00\x1a\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\xff\xff\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00\x18\x00\x00\x00\x01\x00\x02\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\x00\x00\x03\x00\x04\x00\x05\x00\x04\x00\x05\x00\x1b\x00\xff\xff\xff\xff\x12\x00\x13\x00\x14\x00\x15\x00\x22\x00\x10\x00\x1b\x00\x10\x00\x26\x00\xff\xff\x28\x00\x29\x00\xff\xff\x22\x00\xff\xff\x2d\x00\x2e\x00\x26\x00\xff\xff\x28\x00\x29\x00\x00\x00\x01\x00\x02\x00\xff\xff\x2e\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x06\x00\x07\x00\x06\x00\x07\x00\x06\x00\x07\x00\xff\xff\x12\x00\x13\x00\xff\xff\x10\x00\xff\xff\x10\x00\xff\xff\x10\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"# happyTable :: HappyAddr -happyTable = HappyA# "\x00\x00\x14\x00\x37\x00\x45\x00\x2a\x00\x2b\x00\x5d\x00\x38\x00\x03\x00\x5e\x00\xff\xff\x10\x00\x15\x00\xd3\xff\x39\x00\x51\x00\x03\x00\x69\x00\x52\x00\x3a\x00\x6a\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x73\x00\x74\x00\x09\x00\x03\x00\xd3\xff\xd3\xff\x3b\x00\x3c\x00\x3d\x00\x0b\x00\x3e\x00\x3f\x00\x0c\x00\x40\x00\x0d\x00\x41\x00\x25\x00\x37\x00\x42\x00\x03\x00\x43\x00\x44\x00\x38\x00\x63\x00\xd3\xff\x45\x00\x2a\x00\x2b\x00\x7d\x00\x39\x00\x12\x00\x03\x00\x64\x00\x37\x00\x3a\x00\x05\x00\x10\x00\x5d\x00\x38\x00\x03\x00\x5e\x00\x15\x00\x65\x00\x4f\x00\x09\x00\x39\x00\x10\x00\x07\x00\x3b\x00\x3c\x00\x3d\x00\x0b\x00\x3e\x00\x3f\x00\x0c\x00\x40\x00\x0d\x00\x41\x00\x25\x00\x03\x00\x09\x00\x03\x00\x43\x00\x44\x00\x3b\x00\x17\x00\x18\x00\x0b\x00\x3e\x00\x37\x00\x0c\x00\x40\x00\x0d\x00\x1d\x00\x38\x00\x19\x00\x1c\x00\x03\x00\x43\x00\x44\x00\x03\x00\x39\x00\x09\x00\x0a\x00\x25\x00\x37\x00\x48\x00\x53\x00\x55\x00\x0b\x00\x38\x00\x56\x00\x0c\x00\x4b\x00\x0d\x00\x38\x00\x48\x00\x39\x00\x6b\x00\x03\x00\x3b\x00\x45\x00\x2a\x00\x2b\x00\x3e\x00\x57\x00\x58\x00\x40\x00\x59\x00\x5a\x00\x5b\x00\x03\x00\x4a\x00\x03\x00\x43\x00\x44\x00\x3b\x00\x17\x00\x22\x00\x4b\x00\x3e\x00\x3b\x00\x45\x00\x40\x00\x03\x00\x3e\x00\x03\x00\x19\x00\x40\x00\x03\x00\x43\x00\x44\x00\x17\x00\x28\x00\x03\x00\x43\x00\x44\x00\x45\x00\x2a\x00\x2b\x00\x7d\x00\x81\x00\x19\x00\x80\x00\x10\x00\x7c\x00\x71\x00\x03\x00\x45\x00\x2a\x00\x2b\x00\x70\x00\x29\x00\x2a\x00\x2b\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x73\x00\x8c\x00\x2c\x00\x6f\x00\x2d\x00\x2f\x00\x75\x00\x2e\x00\x65\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x29\x00\x2a\x00\x2b\x00\x27\x00\x60\x00\x6e\x00\x66\x00\x67\x00\x6d\x00\x25\x00\x61\x00\x2c\x00\x88\x00\x90\x00\x65\x00\x28\x00\x2e\x00\x62\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x29\x00\x2a\x00\x2b\x00\x66\x00\x8b\x00\x03\x00\x8a\x00\x89\x00\x87\x00\x85\x00\x83\x00\x2c\x00\x90\x00\x8e\x00\x8e\x00\x94\x00\x2e\x00\x92\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x29\x00\x2a\x00\x2b\x00\x0e\x00\x0d\x00\x12\x00\x16\x00\x1d\x00\x15\x00\x1a\x00\x21\x00\x2c\x00\x23\x00\x94\x00\x25\x00\x5e\x00\x2e\x00\x5b\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x4c\x00\x2a\x00\x2b\x00\x72\x00\x6b\x00\x85\x00\x5b\x00\x45\x00\x2a\x00\x2b\x00\x53\x00\x00\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x4d\x00\x00\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x4e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x46\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x81\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x7e\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x7a\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x79\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x71\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x8a\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x83\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x92\x00\x2f\x00\x30\x00\x31\x00\x32\x00\x33\x00\x77\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x45\x00\x2a\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x04\x00\x05\x00\x06\x00\x00\x00\x2f\x00\x30\x00\x31\x00\x78\x00\x2f\x00\x30\x00\x76\x00\x09\x00\x09\x00\x07\x00\x00\x00\x00\x00\x03\x00\x00\x00\x0b\x00\x0b\x00\x00\x00\x0c\x00\x0c\x00\x0d\x00\x0d\x00\x1e\x00\x00\x00\x21\x00\x03\x00\x03\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# +happyTable = HappyA# "\x00\x00\x69\x00\x38\x00\x11\x00\x6a\x00\x7d\x00\x03\x00\x39\x00\x09\x00\x0a\x00\x81\x00\x11\x00\x63\x00\x3a\x00\x28\x00\x0b\x00\xd2\xff\xff\xff\x3b\x00\x0c\x00\x64\x00\x0d\x00\x0e\x00\x7e\x00\x03\x00\x29\x00\x39\x00\x03\x00\x09\x00\x03\x00\x65\x00\x13\x00\x3c\x00\x3d\x00\x3e\x00\x0b\x00\x3f\x00\xd2\xff\x40\x00\x0c\x00\x41\x00\x0d\x00\x0e\x00\x42\x00\x26\x00\x38\x00\x43\x00\x03\x00\x44\x00\x45\x00\x39\x00\x3c\x00\x46\x00\x2b\x00\x2c\x00\x3f\x00\x3a\x00\x03\x00\x03\x00\x41\x00\x03\x00\x3b\x00\x46\x00\x2b\x00\x2c\x00\x16\x00\x03\x00\x44\x00\x45\x00\x5d\x00\x4f\x00\x09\x00\x5e\x00\x49\x00\x7e\x00\x3c\x00\x3d\x00\x3e\x00\x0b\x00\x3f\x00\x4c\x00\x40\x00\x0c\x00\x41\x00\x0d\x00\x0e\x00\x42\x00\x26\x00\x38\x00\x15\x00\x03\x00\x44\x00\x45\x00\x39\x00\x46\x00\x2b\x00\x2c\x00\x51\x00\x38\x00\x3a\x00\x52\x00\x1e\x00\x16\x00\x39\x00\x49\x00\x46\x00\x2b\x00\x2c\x00\x1d\x00\x3a\x00\x26\x00\x03\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x77\x00\x3c\x00\x6b\x00\x1f\x00\x53\x00\x3f\x00\x30\x00\x31\x00\x76\x00\x41\x00\x20\x00\x3c\x00\x46\x00\x2b\x00\x2c\x00\x3f\x00\x03\x00\x44\x00\x45\x00\x41\x00\x46\x00\x2b\x00\x2c\x00\x4c\x00\x4b\x00\x46\x00\x03\x00\x44\x00\x45\x00\x7c\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x73\x00\x74\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x73\x00\x8f\x00\x2a\x00\x2b\x00\x2c\x00\x5d\x00\x82\x00\x60\x00\x5e\x00\x03\x00\x71\x00\x70\x00\x61\x00\x2d\x00\x55\x00\x2e\x00\x6f\x00\x56\x00\x2f\x00\x62\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x2a\x00\x2b\x00\x2c\x00\x57\x00\x58\x00\x6e\x00\x59\x00\x5a\x00\x5b\x00\x6d\x00\x26\x00\x2d\x00\x03\x00\x94\x00\x65\x00\x8d\x00\x2f\x00\x65\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x2a\x00\x2b\x00\x2c\x00\x66\x00\x67\x00\x8c\x00\x66\x00\x8e\x00\x8b\x00\x89\x00\x8a\x00\x2d\x00\x88\x00\x92\x00\x86\x00\x84\x00\x2f\x00\x94\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x2a\x00\x2b\x00\x2c\x00\x92\x00\x98\x00\x0f\x00\x91\x00\x96\x00\x0e\x00\x13\x00\x17\x00\x2d\x00\x16\x00\x98\x00\x1e\x00\x1b\x00\x2f\x00\x5e\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x2a\x00\x2b\x00\x2c\x00\x24\x00\x22\x00\x26\x00\x53\x00\x4d\x00\x2b\x00\x2c\x00\x5b\x00\x2d\x00\x72\x00\x99\x00\x6b\x00\x5e\x00\x2f\x00\x5b\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x4e\x00\x46\x00\x2b\x00\x2c\x00\x86\x00\x00\x00\x00\x00\x00\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x47\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x82\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x7f\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x7a\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x79\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x71\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x8d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x84\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x96\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x03\x00\x04\x00\x05\x00\x06\x00\x05\x00\x11\x00\x09\x00\x00\x00\x00\x00\x30\x00\x31\x00\x32\x00\x78\x00\x0b\x00\x07\x00\x09\x00\x07\x00\x0c\x00\x00\x00\x0d\x00\x0e\x00\x00\x00\x0b\x00\x00\x00\x22\x00\x03\x00\x0c\x00\x00\x00\x0d\x00\x0e\x00\x46\x00\x2b\x00\x2c\x00\x00\x00\x03\x00\x03\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x18\x00\x19\x00\x18\x00\x23\x00\x18\x00\x29\x00\x00\x00\x30\x00\x75\x00\x00\x00\x1a\x00\x00\x00\x1a\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# -happyReduceArr = Happy_Data_Array.array (1, 86) [ +happyReduceArr = Happy_Data_Array.array (1, 88) [ (1 , happyReduce_1), (2 , happyReduce_2), (3 , happyReduce_3), @@ -353,10 +353,12 @@ happyReduceArr = Happy_Data_Array.array (1, 86) [ (83 , happyReduce_83), (84 , happyReduce_84), (85 , happyReduce_85), - (86 , happyReduce_86) + (86 , happyReduce_86), + (87 , happyReduce_87), + (88 , happyReduce_88) ] -happy_n_terms = 49 :: Int +happy_n_terms = 50 :: Int happy_n_nonterms = 29 :: Int happyReduce_1 = happySpecReduce_1 0# happyReduction_1 @@ -667,8 +669,9 @@ happyReduction_32 (happy_x_5 `HappyStk` ((Just (tokenLineCol happy_var_1), Abs.While (Just (tokenLineCol happy_var_1)) (snd happy_var_3)(snd happy_var_5)) ) `HappyStk` happyRest}}} -happyReduce_33 = happyReduce 7# 13# happyReduction_33 -happyReduction_33 (happy_x_7 `HappyStk` +happyReduce_33 = happyReduce 8# 13# happyReduction_33 +happyReduction_33 (happy_x_8 `HappyStk` + happy_x_7 `HappyStk` happy_x_6 `HappyStk` happy_x_5 `HappyStk` happy_x_4 `HappyStk` @@ -680,9 +683,10 @@ happyReduction_33 (happy_x_7 `HappyStk` case happyOut20 happy_x_3 of { (HappyWrap20 happy_var_3) -> case happyOut4 happy_x_4 of { (HappyWrap4 happy_var_4) -> case happyOut28 happy_x_6 of { (HappyWrap28 happy_var_6) -> + case happyOut17 happy_x_8 of { (HappyWrap17 happy_var_8) -> happyIn17 - ((Just (tokenLineCol happy_var_1), Abs.For (Just (tokenLineCol happy_var_1)) (snd happy_var_3)(snd happy_var_4)(snd happy_var_6)) - ) `HappyStk` happyRest}}}} + ((Just (tokenLineCol happy_var_1), Abs.For (Just (tokenLineCol happy_var_1)) (snd happy_var_3)(snd happy_var_4)(snd happy_var_6)(snd happy_var_8)) + ) `HappyStk` happyRest}}}}} happyReduce_34 = happySpecReduce_2 13# happyReduction_34 happyReduction_34 happy_x_2 @@ -754,35 +758,42 @@ happyReduction_42 happy_x_1 ((Just (tokenLineCol happy_var_1), Abs.Void (Just (tokenLineCol happy_var_1))) )} -happyReduce_43 = happySpecReduce_2 16# happyReduction_43 -happyReduction_43 happy_x_2 +happyReduce_43 = happySpecReduce_1 16# happyReduction_43 +happyReduction_43 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn20 + ((Just (tokenLineCol happy_var_1), Abs.Var (Just (tokenLineCol happy_var_1))) + )} + +happyReduce_44 = happySpecReduce_2 16# happyReduction_44 +happyReduction_44 happy_x_2 happy_x_1 = case happyOut20 happy_x_1 of { (HappyWrap20 happy_var_1) -> happyIn20 ((fst happy_var_1, Abs.Arr (fst happy_var_1)(snd happy_var_1)) )} -happyReduce_44 = happySpecReduce_1 16# happyReduction_44 -happyReduction_44 happy_x_1 +happyReduce_45 = happySpecReduce_1 16# happyReduction_45 +happyReduction_45 happy_x_1 = case happyOut4 happy_x_1 of { (HappyWrap4 happy_var_1) -> happyIn20 ((fst happy_var_1, Abs.Cl (fst happy_var_1)(snd happy_var_1)) )} -happyReduce_45 = happySpecReduce_0 17# happyReduction_45 -happyReduction_45 = happyIn21 +happyReduce_46 = happySpecReduce_0 17# happyReduction_46 +happyReduction_46 = happyIn21 ((Nothing, []) ) -happyReduce_46 = happySpecReduce_1 17# happyReduction_46 -happyReduction_46 happy_x_1 +happyReduce_47 = happySpecReduce_1 17# happyReduction_47 +happyReduction_47 happy_x_1 = case happyOut20 happy_x_1 of { (HappyWrap20 happy_var_1) -> happyIn21 ((fst happy_var_1, (:[]) (snd happy_var_1)) )} -happyReduce_47 = happySpecReduce_3 17# happyReduction_47 -happyReduction_47 happy_x_3 +happyReduce_48 = happySpecReduce_3 17# happyReduction_48 +happyReduction_48 happy_x_3 happy_x_2 happy_x_1 = case happyOut20 happy_x_1 of { (HappyWrap20 happy_var_1) -> @@ -791,53 +802,71 @@ happyReduction_47 happy_x_3 ((fst happy_var_1, (:) (snd happy_var_1)(snd happy_var_3)) )}} -happyReduce_48 = happySpecReduce_1 18# happyReduction_48 -happyReduction_48 happy_x_1 +happyReduce_49 = happySpecReduce_1 18# happyReduction_49 +happyReduction_49 happy_x_1 = case happyOut4 happy_x_1 of { (HappyWrap4 happy_var_1) -> happyIn22 ((fst happy_var_1, Abs.EVar (fst happy_var_1)(snd happy_var_1)) )} -happyReduce_49 = happySpecReduce_1 18# happyReduction_49 -happyReduction_49 happy_x_1 +happyReduce_50 = happySpecReduce_1 18# happyReduction_50 +happyReduction_50 happy_x_1 = case happyOut5 happy_x_1 of { (HappyWrap5 happy_var_1) -> happyIn22 ((fst happy_var_1, Abs.ELitInt (fst happy_var_1)(snd happy_var_1)) )} -happyReduce_50 = happySpecReduce_1 18# happyReduction_50 -happyReduction_50 happy_x_1 +-- This reduction is manually edited. +-- Without the `init $ tail $` calls a string literal "abc" is parsed with the enclosing quotes included. +-- That causes nasty problems with pretty printing later on. +happyReduce_51 = happySpecReduce_1 18# happyReduction_51 +happyReduction_51 happy_x_1 = case happyOut6 happy_x_1 of { (HappyWrap6 happy_var_1) -> happyIn22 - ((fst happy_var_1, Abs.EString (fst happy_var_1)(snd happy_var_1)) + ((fst happy_var_1, Abs.EString (fst happy_var_1)(init $ tail $ snd happy_var_1)) )} -happyReduce_51 = happySpecReduce_1 18# happyReduction_51 -happyReduction_51 happy_x_1 +happyReduce_52 = happySpecReduce_1 18# happyReduction_52 +happyReduction_52 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn22 ((Just (tokenLineCol happy_var_1), Abs.ELitTrue (Just (tokenLineCol happy_var_1))) )} -happyReduce_52 = happySpecReduce_1 18# happyReduction_52 -happyReduction_52 happy_x_1 +happyReduce_53 = happySpecReduce_1 18# happyReduction_53 +happyReduction_53 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn22 ((Just (tokenLineCol happy_var_1), Abs.ELitFalse (Just (tokenLineCol happy_var_1))) )} -happyReduce_53 = happySpecReduce_3 18# happyReduction_53 -happyReduction_53 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut20 happy_x_2 of { (HappyWrap20 happy_var_2) -> +happyReduce_54 = happyReduce 4# 18# happyReduction_54 +happyReduction_54 (happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut4 happy_x_2 of { (HappyWrap4 happy_var_2) -> happyIn22 - ((Just (tokenLineCol happy_var_1), Abs.ELitNull (Just (tokenLineCol happy_var_1)) (snd happy_var_2)) - )}} + ((Just (tokenLineCol happy_var_1), Abs.ENullI (Just (tokenLineCol happy_var_1)) (snd happy_var_2)) + ) `HappyStk` happyRest}} -happyReduce_54 = happySpecReduce_2 18# happyReduction_54 -happyReduction_54 happy_x_2 +happyReduce_55 = happyReduce 5# 18# happyReduction_55 +happyReduction_55 (happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut4 happy_x_2 of { (HappyWrap4 happy_var_2) -> + happyIn22 + ((Just (tokenLineCol happy_var_1), Abs.ENullArr (Just (tokenLineCol happy_var_1)) (snd happy_var_2)) + ) `HappyStk` happyRest}} + +happyReduce_56 = happySpecReduce_2 18# happyReduction_56 +happyReduction_56 happy_x_2 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> case happyOut20 happy_x_2 of { (HappyWrap20 happy_var_2) -> @@ -845,8 +874,8 @@ happyReduction_54 happy_x_2 ((Just (tokenLineCol happy_var_1), Abs.ENew (Just (tokenLineCol happy_var_1)) (snd happy_var_2)) )}} -happyReduce_55 = happyReduce 5# 18# happyReduction_55 -happyReduction_55 (happy_x_5 `HappyStk` +happyReduce_57 = happyReduce 5# 18# happyReduction_57 +happyReduction_57 (happy_x_5 `HappyStk` happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` @@ -859,8 +888,8 @@ happyReduction_55 (happy_x_5 `HappyStk` ((Just (tokenLineCol happy_var_1), Abs.ENewArr (Just (tokenLineCol happy_var_1)) (snd happy_var_2)(snd happy_var_4)) ) `HappyStk` happyRest}}} -happyReduce_56 = happyReduce 4# 18# happyReduction_56 -happyReduction_56 (happy_x_4 `HappyStk` +happyReduce_58 = happyReduce 4# 18# happyReduction_58 +happyReduction_58 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk` @@ -871,8 +900,8 @@ happyReduction_56 (happy_x_4 `HappyStk` ((fst happy_var_1, Abs.EApp (fst happy_var_1)(snd happy_var_1)(snd happy_var_3)) ) `HappyStk` happyRest}} -happyReduce_57 = happyReduce 4# 18# happyReduction_57 -happyReduction_57 (happy_x_4 `HappyStk` +happyReduce_59 = happyReduce 4# 18# happyReduction_59 +happyReduction_59 (happy_x_4 `HappyStk` happy_x_3 `HappyStk` happy_x_2 `HappyStk` happy_x_1 `HappyStk` @@ -883,8 +912,8 @@ happyReduction_57 (happy_x_4 `HappyStk` ((fst happy_var_1, Abs.EIdx (fst happy_var_1)(snd happy_var_1)(snd happy_var_3)) ) `HappyStk` happyRest}} -happyReduce_58 = happySpecReduce_3 18# happyReduction_58 -happyReduction_58 happy_x_3 +happyReduce_60 = happySpecReduce_3 18# happyReduction_60 +happyReduction_60 happy_x_3 happy_x_2 happy_x_1 = case happyOut22 happy_x_1 of { (HappyWrap22 happy_var_1) -> @@ -893,8 +922,8 @@ happyReduction_58 happy_x_3 ((fst happy_var_1, Abs.EAcc (fst happy_var_1)(snd happy_var_1)(snd happy_var_3)) )}} -happyReduce_59 = happySpecReduce_3 18# happyReduction_59 -happyReduction_59 happy_x_3 +happyReduce_61 = happySpecReduce_3 18# happyReduction_61 +happyReduction_61 happy_x_3 happy_x_2 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> @@ -903,8 +932,8 @@ happyReduction_59 happy_x_3 ((Just (tokenLineCol happy_var_1), snd happy_var_2) )}} -happyReduce_60 = happySpecReduce_2 19# happyReduction_60 -happyReduction_60 happy_x_2 +happyReduce_62 = happySpecReduce_2 19# happyReduction_62 +happyReduction_62 happy_x_2 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> case happyOut22 happy_x_2 of { (HappyWrap22 happy_var_2) -> @@ -912,8 +941,8 @@ happyReduction_60 happy_x_2 ((Just (tokenLineCol happy_var_1), Abs.ENeg (Just (tokenLineCol happy_var_1)) (snd happy_var_2)) )}} -happyReduce_61 = happySpecReduce_2 19# happyReduction_61 -happyReduction_61 happy_x_2 +happyReduce_63 = happySpecReduce_2 19# happyReduction_63 +happyReduction_63 happy_x_2 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> case happyOut22 happy_x_2 of { (HappyWrap22 happy_var_2) -> @@ -921,15 +950,15 @@ happyReduction_61 happy_x_2 ((Just (tokenLineCol happy_var_1), Abs.ENot (Just (tokenLineCol happy_var_1)) (snd happy_var_2)) )}} -happyReduce_62 = happySpecReduce_1 19# happyReduction_62 -happyReduction_62 happy_x_1 +happyReduce_64 = happySpecReduce_1 19# happyReduction_64 +happyReduction_64 happy_x_1 = case happyOut22 happy_x_1 of { (HappyWrap22 happy_var_1) -> happyIn23 ((fst happy_var_1, snd happy_var_1) )} -happyReduce_63 = happySpecReduce_3 20# happyReduction_63 -happyReduction_63 happy_x_3 +happyReduce_65 = happySpecReduce_3 20# happyReduction_65 +happyReduction_65 happy_x_3 happy_x_2 happy_x_1 = case happyOut24 happy_x_1 of { (HappyWrap24 happy_var_1) -> @@ -939,15 +968,15 @@ happyReduction_63 happy_x_3 ((fst happy_var_1, Abs.EMul (fst happy_var_1)(snd happy_var_1)(snd happy_var_2)(snd happy_var_3)) )}}} -happyReduce_64 = happySpecReduce_1 20# happyReduction_64 -happyReduction_64 happy_x_1 +happyReduce_66 = happySpecReduce_1 20# happyReduction_66 +happyReduction_66 happy_x_1 = case happyOut23 happy_x_1 of { (HappyWrap23 happy_var_1) -> happyIn24 ((fst happy_var_1, snd happy_var_1) )} -happyReduce_65 = happySpecReduce_3 21# happyReduction_65 -happyReduction_65 happy_x_3 +happyReduce_67 = happySpecReduce_3 21# happyReduction_67 +happyReduction_67 happy_x_3 happy_x_2 happy_x_1 = case happyOut25 happy_x_1 of { (HappyWrap25 happy_var_1) -> @@ -957,15 +986,15 @@ happyReduction_65 happy_x_3 ((fst happy_var_1, Abs.EAdd (fst happy_var_1)(snd happy_var_1)(snd happy_var_2)(snd happy_var_3)) )}}} -happyReduce_66 = happySpecReduce_1 21# happyReduction_66 -happyReduction_66 happy_x_1 +happyReduce_68 = happySpecReduce_1 21# happyReduction_68 +happyReduction_68 happy_x_1 = case happyOut24 happy_x_1 of { (HappyWrap24 happy_var_1) -> happyIn25 ((fst happy_var_1, snd happy_var_1) )} -happyReduce_67 = happySpecReduce_3 22# happyReduction_67 -happyReduction_67 happy_x_3 +happyReduce_69 = happySpecReduce_3 22# happyReduction_69 +happyReduction_69 happy_x_3 happy_x_2 happy_x_1 = case happyOut26 happy_x_1 of { (HappyWrap26 happy_var_1) -> @@ -975,15 +1004,15 @@ happyReduction_67 happy_x_3 ((fst happy_var_1, Abs.ERel (fst happy_var_1)(snd happy_var_1)(snd happy_var_2)(snd happy_var_3)) )}}} -happyReduce_68 = happySpecReduce_1 22# happyReduction_68 -happyReduction_68 happy_x_1 +happyReduce_70 = happySpecReduce_1 22# happyReduction_70 +happyReduction_70 happy_x_1 = case happyOut25 happy_x_1 of { (HappyWrap25 happy_var_1) -> happyIn26 ((fst happy_var_1, snd happy_var_1) )} -happyReduce_69 = happySpecReduce_3 23# happyReduction_69 -happyReduction_69 happy_x_3 +happyReduce_71 = happySpecReduce_3 23# happyReduction_71 +happyReduction_71 happy_x_3 happy_x_2 happy_x_1 = case happyOut26 happy_x_1 of { (HappyWrap26 happy_var_1) -> @@ -992,15 +1021,15 @@ happyReduction_69 happy_x_3 ((fst happy_var_1, Abs.EAnd (fst happy_var_1)(snd happy_var_1)(snd happy_var_3)) )}} -happyReduce_70 = happySpecReduce_1 23# happyReduction_70 -happyReduction_70 happy_x_1 +happyReduce_72 = happySpecReduce_1 23# happyReduction_72 +happyReduction_72 happy_x_1 = case happyOut26 happy_x_1 of { (HappyWrap26 happy_var_1) -> happyIn27 ((fst happy_var_1, snd happy_var_1) )} -happyReduce_71 = happySpecReduce_3 24# happyReduction_71 -happyReduction_71 happy_x_3 +happyReduce_73 = happySpecReduce_3 24# happyReduction_73 +happyReduction_73 happy_x_3 happy_x_2 happy_x_1 = case happyOut27 happy_x_1 of { (HappyWrap27 happy_var_1) -> @@ -1009,27 +1038,27 @@ happyReduction_71 happy_x_3 ((fst happy_var_1, Abs.EOr (fst happy_var_1)(snd happy_var_1)(snd happy_var_3)) )}} -happyReduce_72 = happySpecReduce_1 24# happyReduction_72 -happyReduction_72 happy_x_1 +happyReduce_74 = happySpecReduce_1 24# happyReduction_74 +happyReduction_74 happy_x_1 = case happyOut27 happy_x_1 of { (HappyWrap27 happy_var_1) -> happyIn28 ((fst happy_var_1, snd happy_var_1) )} -happyReduce_73 = happySpecReduce_0 25# happyReduction_73 -happyReduction_73 = happyIn29 +happyReduce_75 = happySpecReduce_0 25# happyReduction_75 +happyReduction_75 = happyIn29 ((Nothing, []) ) -happyReduce_74 = happySpecReduce_1 25# happyReduction_74 -happyReduction_74 happy_x_1 +happyReduce_76 = happySpecReduce_1 25# happyReduction_76 +happyReduction_76 happy_x_1 = case happyOut28 happy_x_1 of { (HappyWrap28 happy_var_1) -> happyIn29 ((fst happy_var_1, (:[]) (snd happy_var_1)) )} -happyReduce_75 = happySpecReduce_3 25# happyReduction_75 -happyReduction_75 happy_x_3 +happyReduce_77 = happySpecReduce_3 25# happyReduction_77 +happyReduction_77 happy_x_3 happy_x_2 happy_x_1 = case happyOut28 happy_x_1 of { (HappyWrap28 happy_var_1) -> @@ -1038,85 +1067,85 @@ happyReduction_75 happy_x_3 ((fst happy_var_1, (:) (snd happy_var_1)(snd happy_var_3)) )}} -happyReduce_76 = happySpecReduce_1 26# happyReduction_76 -happyReduction_76 happy_x_1 +happyReduce_78 = happySpecReduce_1 26# happyReduction_78 +happyReduction_78 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn30 ((Just (tokenLineCol happy_var_1), Abs.Plus (Just (tokenLineCol happy_var_1))) )} -happyReduce_77 = happySpecReduce_1 26# happyReduction_77 -happyReduction_77 happy_x_1 +happyReduce_79 = happySpecReduce_1 26# happyReduction_79 +happyReduction_79 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn30 ((Just (tokenLineCol happy_var_1), Abs.Minus (Just (tokenLineCol happy_var_1))) )} -happyReduce_78 = happySpecReduce_1 27# happyReduction_78 -happyReduction_78 happy_x_1 +happyReduce_80 = happySpecReduce_1 27# happyReduction_80 +happyReduction_80 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn31 ((Just (tokenLineCol happy_var_1), Abs.Times (Just (tokenLineCol happy_var_1))) )} -happyReduce_79 = happySpecReduce_1 27# happyReduction_79 -happyReduction_79 happy_x_1 +happyReduce_81 = happySpecReduce_1 27# happyReduction_81 +happyReduction_81 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn31 ((Just (tokenLineCol happy_var_1), Abs.Div (Just (tokenLineCol happy_var_1))) )} -happyReduce_80 = happySpecReduce_1 27# happyReduction_80 -happyReduction_80 happy_x_1 +happyReduce_82 = happySpecReduce_1 27# happyReduction_82 +happyReduction_82 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn31 ((Just (tokenLineCol happy_var_1), Abs.Mod (Just (tokenLineCol happy_var_1))) )} -happyReduce_81 = happySpecReduce_1 28# happyReduction_81 -happyReduction_81 happy_x_1 +happyReduce_83 = happySpecReduce_1 28# happyReduction_83 +happyReduction_83 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn32 ((Just (tokenLineCol happy_var_1), Abs.LTH (Just (tokenLineCol happy_var_1))) )} -happyReduce_82 = happySpecReduce_1 28# happyReduction_82 -happyReduction_82 happy_x_1 +happyReduce_84 = happySpecReduce_1 28# happyReduction_84 +happyReduction_84 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn32 ((Just (tokenLineCol happy_var_1), Abs.LE (Just (tokenLineCol happy_var_1))) )} -happyReduce_83 = happySpecReduce_1 28# happyReduction_83 -happyReduction_83 happy_x_1 +happyReduce_85 = happySpecReduce_1 28# happyReduction_85 +happyReduction_85 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn32 ((Just (tokenLineCol happy_var_1), Abs.GTH (Just (tokenLineCol happy_var_1))) )} -happyReduce_84 = happySpecReduce_1 28# happyReduction_84 -happyReduction_84 happy_x_1 +happyReduce_86 = happySpecReduce_1 28# happyReduction_86 +happyReduction_86 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn32 ((Just (tokenLineCol happy_var_1), Abs.GE (Just (tokenLineCol happy_var_1))) )} -happyReduce_85 = happySpecReduce_1 28# happyReduction_85 -happyReduction_85 happy_x_1 +happyReduce_87 = happySpecReduce_1 28# happyReduction_87 +happyReduction_87 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn32 ((Just (tokenLineCol happy_var_1), Abs.EQU (Just (tokenLineCol happy_var_1))) )} -happyReduce_86 = happySpecReduce_1 28# happyReduction_86 -happyReduction_86 happy_x_1 +happyReduce_88 = happySpecReduce_1 28# happyReduction_88 +happyReduction_88 happy_x_1 = case happyOutTok happy_x_1 of { happy_var_1 -> happyIn32 ((Just (tokenLineCol happy_var_1), Abs.NE (Just (tokenLineCol happy_var_1))) )} happyNewToken action sts stk [] = - happyDoAction 48# notHappyAtAll action sts stk [] + happyDoAction 49# notHappyAtAll action sts stk [] happyNewToken action sts stk (tk:tks) = let cont i = happyDoAction i tk action sts stk tks in @@ -1165,13 +1194,14 @@ happyNewToken action sts stk (tk:tks) = PT _ (TS _ 42) -> cont 42#; PT _ (TS _ 43) -> cont 43#; PT _ (TS _ 44) -> cont 44#; - PT _ (TV _) -> cont 45#; - PT _ (TI _) -> cont 46#; - PT _ (TL _) -> cont 47#; + PT _ (TS _ 45) -> cont 45#; + PT _ (TV _) -> cont 46#; + PT _ (TI _) -> cont 47#; + PT _ (TL _) -> cont 48#; _ -> happyError' ((tk:tks), []) } -happyError_ explist 48# tk tks = happyError' (tks, explist) +happyError_ explist 49# tk tks = happyError' (tks, explist) happyError_ explist _ tk tks = happyError' ((tk:tks), explist) happyThen :: () => Err a -> (a -> Err b) -> Err b @@ -1207,219 +1237,7 @@ myLexer = tokens pProgram = (>>= return . snd) . pProgram_internal {-# LINE 1 "templates/GenericTemplate.hs" #-} -{-# LINE 1 "templates/GenericTemplate.hs" #-} -{-# LINE 1 "" #-} -{-# LINE 1 "" #-} -{-# LINE 10 "" #-} -# 1 "/usr/include/stdc-predef.h" 1 3 4 - -# 17 "/usr/include/stdc-predef.h" 3 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -{-# LINE 10 "" #-} -{-# LINE 1 "/usr/lib/ghc/include/ghcversion.h" #-} - - - - - - - - - - - - - - - -{-# LINE 10 "" #-} -{-# LINE 1 "/tmp/ghc8371_0/ghc_2.h" #-} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +-- $Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp $ @@ -1433,6 +1251,16 @@ pProgram = (>>= return . snd) . pProgram_internal +-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex. +#if __GLASGOW_HASKELL__ > 706 +#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool) +#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool) +#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool) +#else +#define LT(n,m) (n Happy_GHC_Exts.<# m) +#define GTE(n,m) (n Happy_GHC_Exts.>=# m) +#define EQ(n,m) (n Happy_GHC_Exts.==# m) +#endif @@ -1452,6 +1280,7 @@ pProgram = (>>= return . snd) . pProgram_internal +data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList @@ -1468,9 +1297,6 @@ pProgram = (>>= return . snd) . pProgram_internal -{-# LINE 10 "" #-} -{-# LINE 1 "templates/GenericTemplate.hs" #-} --- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp @@ -1484,19 +1310,7 @@ pProgram = (>>= return . snd) . pProgram_internal --- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex. -#if __GLASGOW_HASKELL__ > 706 -#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool) -#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool) -#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool) -#else -#define LT(n,m) (n Happy_GHC_Exts.<# m) -#define GTE(n,m) (n Happy_GHC_Exts.>=# m) -#define EQ(n,m) (n Happy_GHC_Exts.==# m) -#endif -{-# LINE 43 "templates/GenericTemplate.hs" #-} -data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList @@ -1504,11 +1318,8 @@ data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList -{-# LINE 65 "templates/GenericTemplate.hs" #-} -{-# LINE 75 "templates/GenericTemplate.hs" #-} -{-# LINE 84 "templates/GenericTemplate.hs" #-} infixr 9 `HappyStk` data HappyStk a = HappyStk a (HappyStk a) @@ -1521,7 +1332,7 @@ happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll ----------------------------------------------------------------------------- -- Accepting the parse --- If the current token is 0#, it means we've just accepted a partial +-- 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 0# tk st sts (_ `HappyStk` ans `HappyStk` _) = @@ -1536,24 +1347,19 @@ happyAccept j tk st sts (HappyStk ans _) = happyDoAction i tk st = {- nothing -} - - case action of 0# -> {- nothing -} happyFail (happyExpListPerState ((Happy_GHC_Exts.I# (st)) :: Int)) i tk st -1# -> {- nothing -} happyAccept i tk st n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -} - (happyReduceArr Happy_Data_Array.! rule) i tk st where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#)))))) n -> {- nothing -} - - happyShift new_state i tk st where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) where off = happyAdjustOffset (indexShortOffAddr happyActOffsets st) - off_i = (off Happy_GHC_Exts.+# i) + off_i = (off Happy_GHC_Exts.+# i) check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#)) then EQ(indexShortOffAddr happyCheck off_i, i) else False @@ -1594,7 +1400,17 @@ data HappyAddr = HappyA# Happy_GHC_Exts.Addr# ----------------------------------------------------------------------------- -- HappyState data type (not arrays) -{-# LINE 180 "templates/GenericTemplate.hs" #-} + + + + + + + + + + + ----------------------------------------------------------------------------- -- Shifting a token @@ -1656,7 +1472,7 @@ happyMonad2Reduce k nt fn j tk st sts stk = let drop_stk = happyDropStk k stk off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st1) - off_i = (off Happy_GHC_Exts.+# nt) + off_i = (off Happy_GHC_Exts.+# nt) new_state = indexShortOffAddr happyTable off_i @@ -1679,14 +1495,14 @@ happyGoto nt j tk st = {- nothing -} happyDoAction j tk new_state where off = happyAdjustOffset (indexShortOffAddr happyGotoOffsets st) - off_i = (off Happy_GHC_Exts.+# nt) + off_i = (off Happy_GHC_Exts.+# nt) new_state = indexShortOffAddr happyTable off_i ----------------------------------------------------------------------------- --- Error recovery (0# is the error token) +-- Error recovery (ERROR_TOK is the error token) -- parse error if we are in recovery and we fail again happyFail explist 0# tk old_st _ stk@(x `HappyStk` _) = @@ -1699,17 +1515,17 @@ happyFail explist 0# tk old_st _ stk@(x `HappyStk` _) = for now --SDM -- discard a state -happyFail 0# tk old_st (HappyCons ((action)) (sts)) +happyFail ERROR_TOK tk old_st CONS(HAPPYSTATE(action),sts) (saved_tok `HappyStk` _ `HappyStk` stk) = -- trace ("discarding state, depth " ++ show (length stk)) $ - happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk)) + DO_ACTION(action,ERROR_TOK,tk,sts,(saved_tok`HappyStk`stk)) -} -- Enter error recovery: generate an error token, -- save the old token and carry on. happyFail explist i tk (action) sts stk = -- trace "entering error recovery" $ - happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk) + happyDoAction 0# tk action sts ((Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk) -- Internal happy errors: diff --git a/src/Syntax/Printer.hs b/src/Syntax/Printer.hs index 5389164..8756f7b 100644 --- a/src/Syntax/Printer.hs +++ b/src/Syntax/Printer.hs @@ -126,7 +126,7 @@ instance Print (Stmt a) where Cond _ expr stmt -> prPrec i 0 (concatD [doc (showString "if"), doc (showString "("), prt 0 expr, doc (showString ")"), prt 0 stmt]) CondElse _ expr stmt1 stmt2 -> prPrec i 0 (concatD [doc (showString "if"), doc (showString "("), prt 0 expr, doc (showString ")"), prt 0 stmt1, doc (showString "else"), prt 0 stmt2]) While _ expr stmt -> prPrec i 0 (concatD [doc (showString "while"), doc (showString "("), prt 0 expr, doc (showString ")"), prt 0 stmt]) - For _ type_ id expr -> prPrec i 0 (concatD [doc (showString "for"), doc (showString "("), prt 0 type_, prt 0 id, doc (showString ":"), prt 0 expr, doc (showString ")")]) + For _ type_ id expr stmt -> prPrec i 0 (concatD [doc (showString "for"), doc (showString "("), prt 0 type_, prt 0 id, doc (showString ":"), prt 0 expr, doc (showString ")"), prt 0 stmt]) SExp _ expr -> prPrec i 0 (concatD [prt 0 expr, doc (showString ";")]) prtList _ [] = (concatD []) prtList _ (x:xs) = (concatD [prt 0 x, prt 0 xs]) @@ -142,6 +142,7 @@ instance Print (Type a) where Str _ -> prPrec i 0 (concatD [doc (showString "string")]) Bool _ -> prPrec i 0 (concatD [doc (showString "boolean")]) Void _ -> prPrec i 0 (concatD [doc (showString "void")]) + Var _ -> prPrec i 0 (concatD [doc (showString "var")]) Arr _ type_ -> prPrec i 0 (concatD [prt 0 type_, doc (showString "[]")]) Cl _ id -> prPrec i 0 (concatD [prt 0 id]) Fun _ type_ types -> prPrec i 0 (concatD [prt 0 type_, doc (showString "("), prt 0 types, doc (showString ")")]) @@ -156,7 +157,9 @@ instance Print (Expr a) where EString _ str -> prPrec i 6 (concatD [prt 0 str]) ELitTrue _ -> prPrec i 6 (concatD [doc (showString "true")]) ELitFalse _ -> prPrec i 6 (concatD [doc (showString "false")]) - ELitNull _ type_ -> prPrec i 6 (concatD [doc (showString "("), prt 0 type_, doc (showString ")null")]) + ENullI _ id -> prPrec i 6 (concatD [doc (showString "("), prt 0 id, doc (showString ")"), doc (showString "null")]) + ENullArr _ id -> prPrec i 6 (concatD [doc (showString "("), prt 0 id, doc (showString "[]"), doc (showString ")"), doc (showString "null")]) + ENull _ type_ -> prPrec i 6 (concatD [doc (showString "("), prt 0 type_, doc (showString ")"), doc (showString "null")]) ENew _ type_ -> prPrec i 6 (concatD [doc (showString "new"), prt 0 type_]) ENewArr _ type_ expr -> prPrec i 6 (concatD [doc (showString "new"), prt 0 type_, doc (showString "["), prt 0 expr, doc (showString "]")]) EApp _ expr exprs -> prPrec i 6 (concatD [prt 6 expr, doc (showString "("), prt 0 exprs, doc (showString ")")]) diff --git a/src/Syntax/Rewriter.hs b/src/Syntax/Rewriter.hs new file mode 100644 index 0000000..43df3c0 --- /dev/null +++ b/src/Syntax/Rewriter.hs @@ -0,0 +1,204 @@ +-- The syntactic rewrite phase. +-- Desugaring and simplification of source code. +module Syntax.Rewriter (rewrite) where + +import Identifiers +import Syntax.Abs +import Syntax.Code +import Syntax.Printer + +-- Desugar and simplify the input program while retaining +-- the exact source code and position information inside the tree. +rewrite :: Program Pos -> Program Code +rewrite p@(Program _ tds) = let tds' = map rewriteTopDef tds + in Program (toCode p) tds' + +rewriteTopDef :: TopDef Pos -> TopDef Code +rewriteTopDef td = case td of + FnDef _ t i args blk -> let t' = rewriteType t + args' = map rewriteArg args + blk' = rewriteBlock blk + in FnDef (toCode td) t' i args' blk' + ClDef _ i clblk -> let clblk' = rewriteClBlock clblk + in ClDef (toCode td) i clblk' + ClExtDef _ i ext clblk -> let clblk' = rewriteClBlock clblk + in ClExtDef (toCode td) i ext clblk' + +rewriteBlock :: Block Pos -> Block Code +rewriteBlock x@(Block _ stmts) = let stmts' = map rewriteStmt stmts + in Block (toCode x) stmts' + +rewriteClBlock :: ClBlock Pos -> ClBlock Code +rewriteClBlock x@(ClBlock _ cldefs) = let cldefs' = map rewriteClDef cldefs + in ClBlock (toCode x) cldefs' + +rewriteClDef :: ClDef Pos -> ClDef Code +rewriteClDef cldef = case cldef of + MthDef _ t i args blk -> let t' = rewriteType t + args' = map rewriteArg args + blk' = rewriteBlock blk + in MthDef (toCode cldef) t' i args' blk' + FldDef _ t i -> let t' = rewriteType t + in FldDef (toCode cldef) t' i + +rewriteStmt :: Stmt Pos -> Stmt Code +rewriteStmt stmt = + let code = toCode stmt + in case stmt of + Empty _ -> Empty code + BStmt _ blk -> BStmt code (rewriteBlock blk) + Decl _ t items -> Decl code (rewriteType t) (map rewriteItem items) + Ass _ expr1 expr2 -> Ass code (rewriteExpr expr1) (rewriteExpr expr2) + Incr _ i -> Incr code i + Decr _ i -> Decr code i + Ret _ expr -> Ret code (rewriteExpr expr) + VRet _ -> VRet code + Cond _ expr stmt -> Cond code (rewriteExpr expr) (blkWrap $ rewriteStmt stmt) + CondElse _ expr stmt1 stmt2 -> CondElse code (rewriteExpr expr) (blkWrap $ rewriteStmt stmt1) (blkWrap $ rewriteStmt stmt2) + While _ expr stmt -> While code (rewriteExpr expr) (blkWrap $ rewriteStmt stmt) + For _ t i expr stmt -> let expr' = rewriteExpr expr + stmt' = rewriteStmt stmt + t' = rewriteType t + exprCode = unwrap expr' + stmtCode = unwrap stmt' + tCode = unwrap t' + arrDecl = Decl exprCode (Var exprCode) [Init exprCode forArrayIdent expr'] + idxDecl = Decl exprCode (Int exprCode) [Init exprCode forIndexIdent (ELitInt exprCode 0)] + arrVar = EVar exprCode forArrayIdent + idxVar = EVar exprCode forIndexIdent + lenExpr = EAcc exprCode arrVar arrayLengthIdent + whileGuard = ERel exprCode idxVar (LTH exprCode) lenExpr + arrAccess = EIdx exprCode arrVar idxVar + elemDecl = Decl tCode t' [Init tCode i arrAccess] + idxIncr = Incr exprCode forIndexIdent +{- { -} in BStmt stmtCode $ Block stmtCode [ +{- var ~l_arr = ; -} arrDecl, +{- int ~l_idx = 0; -} idxDecl, +{- while(~l_idx < ~l_arr.length)-} While stmtCode whileGuard $ +{- { -} BStmt stmtCode $ Block stmtCode [ +{- = ~l_arr[~l_idx];-} elemDecl, +{- -} stmt', +{- ~l_idx++; -} idxIncr +{- } -} ] +{- } -} ] + SExp _ expr -> SExp code (rewriteExpr expr) + +-- Wrap a single statement into a block. +blkWrap :: Stmt Code -> Stmt Code +blkWrap stmt = case stmt of + BStmt {} -> stmt + _ -> let code = unwrap stmt + in BStmt code (Block code [stmt]) + +rewriteItem :: Item Pos -> Item Code +rewriteItem item = + let code = toCode item + in case item of + NoInit _ i -> NoInit code i + Init _ i expr -> Init code i (rewriteExpr expr) + +rewriteExpr :: Expr Pos -> Expr Code +rewriteExpr expr = + let code = toCode expr + expr' = case expr of + EVar _ i -> EVar code i + ELitInt _ n -> ELitInt code n + EString _ s -> EString code s + ELitTrue _ -> ELitTrue code + ELitFalse _ -> ELitFalse code + ENullI _ i -> ENull code (Cl code i) + ENullArr _ i -> ENull code (Arr code (Cl code i)) + ENull _ type_ -> ENull code (rewriteType type_) + ENew _ t -> ENew code (rewriteType t) + ENewArr _ t expr -> ENewArr code (rewriteType t) (rewriteExpr expr) + EApp _ expr exprs -> EApp code (rewriteExpr expr) (map rewriteExpr exprs) + EIdx _ expr1 expr2 -> EIdx code (rewriteExpr expr1) (rewriteExpr expr2) + EAcc _ expr i -> EAcc code (rewriteExpr expr) i + ENeg _ expr -> ENeg code (rewriteExpr expr) + ENot _ expr -> ENot code (rewriteExpr expr) + EMul _ expr1 op expr2 -> EMul code (rewriteExpr expr1) (nullRewrite op) (rewriteExpr expr2) + EAdd _ expr1 op expr2 -> EAdd code (rewriteExpr expr1) (nullRewrite op) (rewriteExpr expr2) + ERel _ expr1 op expr2 -> ERel code (rewriteExpr expr1) (nullRewrite op) (rewriteExpr expr2) + EAnd _ expr1 expr2 -> EAnd code (rewriteExpr expr1) (rewriteExpr expr2) + EOr _ expr1 expr2 -> EOr code (rewriteExpr expr1) (rewriteExpr expr2) + in calcConstexpr expr' + +-- Calculate the value of an expression containing only constants or trivial cases as leaves. +-- If the values are of incorrect types, for example someone tries to negate a string, +-- the expression remains the same and the error will be caught during the analysis phase. +calcConstexpr :: Expr Code -> Expr Code +calcConstexpr srcExpr = case srcExpr of + ENeg code expr -> case expr of + ELitInt _ n -> ELitInt code (-n) + _ -> srcExpr + ENot code expr -> case expr of + ELitTrue _ -> ELitFalse code + ELitFalse _ -> ELitTrue code + _ -> srcExpr + EMul code expr1 op expr2 -> case (expr1, expr2) of + (ELitInt _ n1, ELitInt _ n2) -> case op of + Times _ -> ELitInt code (n1 * n2) + Div _ -> ELitInt code (n1 `div` n2) + Mod _ -> ELitInt code (n1 `mod` n2) + _ -> srcExpr + EAdd code expr1 op expr2 -> case (expr1, expr2) of + (ELitInt _ n1, ELitInt _ n2) -> case op of + Plus _ -> ELitInt code (n1 + n2) + Minus _ -> ELitInt code (n1 - n2) + (EString _ s1, EString _ s2) -> case op of + Plus _ -> EString code (s1 ++ s2) + _ -> srcExpr + _ -> srcExpr + ERel code expr1 op expr2 -> case (expr1, expr2) of + (EVar _ i1, EVar _ i2) | i1 == i2 -> case op of + -- Comparing a variable to itself always yields equality. + LE _ -> ELitTrue code + GE _ -> ELitTrue code + EQU _ -> ELitTrue code + LTH _ -> ELitFalse code + GTH _ -> ELitFalse code + NE _ -> ELitFalse code + (ELitInt _ n1, ELitInt _ n2) -> ordWithOp op n1 n2 code + (EString _ s1, EString _ s2) -> ordWithOp op s1 s2 code + (ELitTrue _, ELitTrue _) -> ordWithOp op True True code + (ELitFalse _, ELitTrue _) -> ordWithOp op False True code + (ELitTrue _, ELitFalse _) -> ordWithOp op True False code + (ELitFalse _, ELitFalse _) -> ordWithOp op False False code + (ENull {}, ENull {}) -> case op of + EQU _ -> ELitTrue code + NE _ -> ELitFalse code + _ -> srcExpr + EAnd code expr1 expr2 -> case (expr1, expr2) of + (ELitTrue _, ELitTrue _) -> ELitTrue code + (ELitFalse _, ELitTrue _) -> ELitFalse code + (ELitTrue _, ELitFalse _) -> ELitFalse code + (ELitFalse _, ELitFalse _) -> ELitFalse code + _ -> srcExpr + EOr code expr1 expr2 -> case (expr1, expr2) of + (ELitTrue _, ELitTrue _) -> ELitTrue code + (ELitFalse _, ELitTrue _) -> ELitTrue code + (ELitTrue _, ELitFalse _) -> ELitTrue code + (ELitFalse _, ELitFalse _) -> ELitFalse code + _ -> srcExpr + _ -> srcExpr + +-- Convert a relational operation on two values to a boolean literal. +ordWithOp :: Ord b => RelOp a -> b -> b -> Code -> Expr Code +ordWithOp op a1 a2 code = + let b = case op of + LTH _ -> a1 < a2 + LE _ -> a1 <= a2 + GTH _ -> a1 > a2 + GE _ -> a1 >= a2 + EQU _ -> a1 == a2 + NE _ -> a1 /= a2 + in if b then ELitTrue code else ELitFalse code + +rewriteType :: Type Pos -> Type Code +rewriteType = nullRewrite + +rewriteArg :: Arg Pos -> Arg Code +rewriteArg = nullRewrite + +nullRewrite :: (Functor f, Unwrappable f, Positioned a, Print (f a)) => f a -> f Code +nullRewrite x = toCode x <$ x diff --git a/stack.yaml b/stack.yaml index e4de399..beecf5e 100755 --- a/stack.yaml +++ b/stack.yaml @@ -45,6 +45,8 @@ packages: # Override default flag values for local packages and extra-deps # flags: {} +local-bin-path: "./" + # Extra package databases containing global packages # extra-package-dbs: [] diff --git a/test/SemanticAnalysis/AcceptanceSpec.hs b/test/SemanticAnalysis/AcceptanceSpec.hs index a3f815b..ff07d6a 100644 --- a/test/SemanticAnalysis/AcceptanceSpec.hs +++ b/test/SemanticAnalysis/AcceptanceSpec.hs @@ -1,9 +1,11 @@ module SemanticAnalysis.AcceptanceSpec (spec) where import ErrM (toEither) +import SemanticAnalysis.Analyser (analyse) import SemanticAnalysis.Toplevel (programMetadata) import Syntax.Abs (unwrapPos) import Syntax.Parser (myLexer, pProgram) +import Syntax.Rewriter (rewrite) import System.Directory (listDirectory) import System.FilePath (replaceExtension, takeBaseName, takeExtension, ()) @@ -35,6 +37,12 @@ spec = parallel $ do describe "Extension objects2 good" $ do tests <- runIO $ getLatTestsFromDir objects2GoodDir mapM_ goodTest tests + describe "Extension var good" $ do + tests <- runIO $ getLatTestsFromDir varGoodDir + mapM_ goodTest tests + describe "Extension var bad" $ do + tests <- runIO $ getLatTestsFromDir varBadDir + mapM_ badTest tests goodTest :: LatTest -> Spec goodTest latTest = do @@ -47,9 +55,11 @@ badTest latTest = do run :: String -> LatResult run s = case toEither $ pProgram ts of Left e -> Error $ "ERROR\n" ++ e - Right t -> case programMetadata (unwrapPos t) of + Right t -> case programMetadata (rewrite $ unwrapPos t) of Left e -> Error $ "ERROR\n" ++ e - Right _ -> Ok + Right m -> case analyse m of + Left e -> Error $ "ERROR\n" ++ e + Right _ -> Ok where ts = myLexer s getLatTestsFromDir :: FilePath -> IO [LatTest] @@ -89,5 +99,11 @@ objects2GoodDir = testRootDir "extensions" "objects2" structGoodDir :: FilePath structGoodDir = testRootDir "extensions" "struct" +varGoodDir :: FilePath +varGoodDir = testRootDir "extensions" "var" "good" + +varBadDir :: FilePath +varBadDir = testRootDir "extensions" "var" "bad" + testRootDir :: FilePath testRootDir = "." "test" "lattests" diff --git a/test/lattests/bad/assignmentToFunction.err b/test/lattests/bad/assignmentToFunction.err new file mode 100644 index 0000000..18a0eb8 --- /dev/null +++ b/test/lattests/bad/assignmentToFunction.err @@ -0,0 +1,4 @@ +ERROR +Cannot assign to a value of type `int()`. +Line 10, character 5: +foo \ No newline at end of file diff --git a/test/lattests/bad/assignmentToFunction.lat b/test/lattests/bad/assignmentToFunction.lat new file mode 100644 index 0000000..843da45 --- /dev/null +++ b/test/lattests/bad/assignmentToFunction.lat @@ -0,0 +1,13 @@ +int foo() { + return 1; +} + +int bar() { + return 0; +} + +int main() { + foo = bar; + + return 0; +} \ No newline at end of file diff --git a/test/lattests/bad/assignmentToRvalue.err b/test/lattests/bad/assignmentToRvalue.err new file mode 100644 index 0000000..88581e9 --- /dev/null +++ b/test/lattests/bad/assignmentToRvalue.err @@ -0,0 +1,4 @@ +ERROR +Cannot assign to a value of type `int`. +Line 2, character 5: +42 \ No newline at end of file diff --git a/test/lattests/bad/assignmentToRvalue.lat b/test/lattests/bad/assignmentToRvalue.lat new file mode 100644 index 0000000..66a9b4e --- /dev/null +++ b/test/lattests/bad/assignmentToRvalue.lat @@ -0,0 +1,4 @@ +int main() { + 42 = 42; + return 0; +} \ No newline at end of file diff --git a/test/lattests/bad/bad006.err b/test/lattests/bad/bad006.err index 39472e5..8578787 100644 --- a/test/lattests/bad/bad006.err +++ b/test/lattests/bad/bad006.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Undeclared identifier `x`. +Line 2, character 9: +x \ No newline at end of file diff --git a/test/lattests/bad/bad007.err b/test/lattests/bad/bad007.err index 39472e5..0e3e9e3 100644 --- a/test/lattests/bad/bad007.err +++ b/test/lattests/bad/bad007.err @@ -1,2 +1,5 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Conflicting declarations in the same scope. +Line 3, character 13: +In declaration of `x`. +Line 2, character 13: previously declared here. \ No newline at end of file diff --git a/test/lattests/bad/bad008.err b/test/lattests/bad/bad008.err index 39472e5..477a644 100644 --- a/test/lattests/bad/bad008.err +++ b/test/lattests/bad/bad008.err @@ -1,2 +1,6 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Control may reach the end of a non-void function without a return statement. Expected return type: `int`. +Line 1, character 3: +int main () { + if (false)return 0 ; + } diff --git a/test/lattests/bad/bad009.err b/test/lattests/bad/bad009.err index 39472e5..c56cddb 100644 --- a/test/lattests/bad/bad009.err +++ b/test/lattests/bad/bad009.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Invalid expression type. Expected `int`, found `boolean`. +Line 3, character 13: +true \ No newline at end of file diff --git a/test/lattests/bad/bad010.err b/test/lattests/bad/bad010.err index 39472e5..a87f3cd 100644 --- a/test/lattests/bad/bad010.err +++ b/test/lattests/bad/bad010.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Invalid expression type. Expected `int`, found `void`. +Line 3, character 17: +return ; diff --git a/test/lattests/bad/bad011.err b/test/lattests/bad/bad011.err index 39472e5..5b83be6 100644 --- a/test/lattests/bad/bad011.err +++ b/test/lattests/bad/bad011.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Invalid expression type. Expected `int`, found `boolean`. +Line 2, character 13: +true \ No newline at end of file diff --git a/test/lattests/bad/bad012.err b/test/lattests/bad/bad012.err index 39472e5..3801041 100644 --- a/test/lattests/bad/bad012.err +++ b/test/lattests/bad/bad012.err @@ -1,2 +1,6 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Control may reach the end of a non-void function without a return statement. Expected return type: `int`. +Line 6, character 1: +int foo (boolean b){ + b = true ; + } diff --git a/test/lattests/bad/bad013.err b/test/lattests/bad/bad013.err index 39472e5..2824c85 100644 --- a/test/lattests/bad/bad013.err +++ b/test/lattests/bad/bad013.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Cannot add expressions of types `string` and `int`. Only two expressions of type `int` or two expressions of type `string` can be added. +Line 3, character 11: +"pi" + 1 \ No newline at end of file diff --git a/test/lattests/bad/bad015.err b/test/lattests/bad/bad015.err index 39472e5..d07f96e 100644 --- a/test/lattests/bad/bad015.err +++ b/test/lattests/bad/bad015.err @@ -1,2 +1,5 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Mismatched types of arguments in function call. +Argument `"foo"` has invalid type `string`. Expected type `int`. +Line 4, character 9: +printInt ("foo") \ No newline at end of file diff --git a/test/lattests/bad/bad016.err b/test/lattests/bad/bad016.err index 39472e5..ce9cd5a 100644 --- a/test/lattests/bad/bad016.err +++ b/test/lattests/bad/bad016.err @@ -1,2 +1,5 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Mismatched types of arguments in function call. +Argument `1` has invalid type `int`. Expected type `string`. +Line 4, character 9: +printString (1) \ No newline at end of file diff --git a/test/lattests/bad/bad017.err b/test/lattests/bad/bad017.err index 39472e5..bd3a519 100644 --- a/test/lattests/bad/bad017.err +++ b/test/lattests/bad/bad017.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Mismatched number of arguments in function call. Expected 1, found 0. +Line 4, character 17: +foo () \ No newline at end of file diff --git a/test/lattests/bad/bad018.err b/test/lattests/bad/bad018.err index 39472e5..853bb8c 100644 --- a/test/lattests/bad/bad018.err +++ b/test/lattests/bad/bad018.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Mismatched number of arguments in function call. Expected 2, found 1. +Line 4, character 17: +foo (1) \ No newline at end of file diff --git a/test/lattests/bad/bad019.err b/test/lattests/bad/bad019.err index 39472e5..e3bbc87 100644 --- a/test/lattests/bad/bad019.err +++ b/test/lattests/bad/bad019.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Mismatched number of arguments in function call. Expected 1, found 2. +Line 4, character 17: +foo (1, 2) \ No newline at end of file diff --git a/test/lattests/bad/bad020.err b/test/lattests/bad/bad020.err index 39472e5..731e5bb 100644 --- a/test/lattests/bad/bad020.err +++ b/test/lattests/bad/bad020.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Cannot equate expressions of types `string` and `boolean`. Only expressions of types within the same inheritance chain can be equated. +Line 4, character 7: +"true" == true \ No newline at end of file diff --git a/test/lattests/bad/bad021.err b/test/lattests/bad/bad021.err index 39472e5..9751b86 100644 --- a/test/lattests/bad/bad021.err +++ b/test/lattests/bad/bad021.err @@ -1,2 +1,5 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Control may reach the end of a non-void function without a return statement. Expected return type: `int`. +Line 5, character 1: +int main () { + } diff --git a/test/lattests/bad/bad022.err b/test/lattests/bad/bad022.err index 39472e5..63828ed 100644 --- a/test/lattests/bad/bad022.err +++ b/test/lattests/bad/bad022.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Invalid expression type. Expected `int`, found `string`. +Line 4, character 10: +"" \ No newline at end of file diff --git a/test/lattests/bad/bad023.err b/test/lattests/bad/bad023.err index 39472e5..74debbd 100644 --- a/test/lattests/bad/bad023.err +++ b/test/lattests/bad/bad023.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Invalid expression type. Expected `string`, found `int`. +Line 4, character 13: +1 \ No newline at end of file diff --git a/test/lattests/bad/bad024.err b/test/lattests/bad/bad024.err index 39472e5..d71643c 100644 --- a/test/lattests/bad/bad024.err +++ b/test/lattests/bad/bad024.err @@ -1,2 +1,6 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Control may reach the end of a non-void function without a return statement. Expected return type: `int`. +Line 1, character 1: +int main () { + if (false)return 0 ; + } diff --git a/test/lattests/bad/bad025.err b/test/lattests/bad/bad025.err index 39472e5..8ba50da 100644 --- a/test/lattests/bad/bad025.err +++ b/test/lattests/bad/bad025.err @@ -1,2 +1,6 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Control may reach the end of a non-void function without a return statement. Expected return type: `int`. +Line 5, character 1: +int f (int x){ + if (x < 0)return x ; + } diff --git a/test/lattests/bad/bad026.err b/test/lattests/bad/bad026.err index 39472e5..3d24831 100644 --- a/test/lattests/bad/bad026.err +++ b/test/lattests/bad/bad026.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Invalid expression type. Expected `int`, found `string`. +Line 5, character 7: +"foo" + "bar" \ No newline at end of file diff --git a/test/lattests/bad/bad027.err b/test/lattests/bad/bad027.err index 39472e5..e766c18 100644 --- a/test/lattests/bad/bad027.err +++ b/test/lattests/bad/bad027.err @@ -1,2 +1,4 @@ ERROR -syntax error at line 1, column 1 before `/' \ No newline at end of file +Invalid expression type. Expected `string`, found `int`. +Line 5, character 6: +1 \ No newline at end of file diff --git a/test/lattests/bad/callToNonFunction.err b/test/lattests/bad/callToNonFunction.err new file mode 100644 index 0000000..5d70770 --- /dev/null +++ b/test/lattests/bad/callToNonFunction.err @@ -0,0 +1,4 @@ +ERROR +Invalid call to a non-function type `int`. +Line 3, character 5: +a (2) \ No newline at end of file diff --git a/test/lattests/bad/callToNonFunction.lat b/test/lattests/bad/callToNonFunction.lat new file mode 100644 index 0000000..a45c36b --- /dev/null +++ b/test/lattests/bad/callToNonFunction.lat @@ -0,0 +1,4 @@ +int main() { + int a = 42; + a(2); +} \ No newline at end of file diff --git a/test/lattests/bad/declInFor.err b/test/lattests/bad/declInFor.err new file mode 100644 index 0000000..83353fc --- /dev/null +++ b/test/lattests/bad/declInFor.err @@ -0,0 +1,4 @@ +ERROR +Undeclared identifier `x`. +Line 6, character 14: +x \ No newline at end of file diff --git a/test/lattests/bad/declInFor.lat b/test/lattests/bad/declInFor.lat new file mode 100644 index 0000000..424c678 --- /dev/null +++ b/test/lattests/bad/declInFor.lat @@ -0,0 +1,9 @@ +int[] foo() { return new int[]; } + +int main() { + for (int a : foo()) int x = 42; + + printInt(x); + + return 0; +} \ No newline at end of file diff --git a/test/lattests/bad/declInIf.err b/test/lattests/bad/declInIf.err new file mode 100644 index 0000000..83353fc --- /dev/null +++ b/test/lattests/bad/declInIf.err @@ -0,0 +1,4 @@ +ERROR +Undeclared identifier `x`. +Line 6, character 14: +x \ No newline at end of file diff --git a/test/lattests/bad/declInIf.lat b/test/lattests/bad/declInIf.lat new file mode 100644 index 0000000..1ddfc9b --- /dev/null +++ b/test/lattests/bad/declInIf.lat @@ -0,0 +1,9 @@ +boolean foo() { return false; } + +int main() { + if (foo()) int x = 42; + + printInt(x); + + return 0; +} \ No newline at end of file diff --git a/test/lattests/bad/declInIfElse.err b/test/lattests/bad/declInIfElse.err new file mode 100644 index 0000000..5d730aa --- /dev/null +++ b/test/lattests/bad/declInIfElse.err @@ -0,0 +1,4 @@ +ERROR +Undeclared identifier `x`. +Line 7, character 14: +x \ No newline at end of file diff --git a/test/lattests/bad/declInIfElse.lat b/test/lattests/bad/declInIfElse.lat new file mode 100644 index 0000000..d1b3079 --- /dev/null +++ b/test/lattests/bad/declInIfElse.lat @@ -0,0 +1,10 @@ +boolean foo() { return false; } + +int main() { + if (foo()) int x = 42; + else int x = 37; + + printInt(x); + + return 0; +} \ No newline at end of file diff --git a/test/lattests/bad/declInWhile.err b/test/lattests/bad/declInWhile.err new file mode 100644 index 0000000..83353fc --- /dev/null +++ b/test/lattests/bad/declInWhile.err @@ -0,0 +1,4 @@ +ERROR +Undeclared identifier `x`. +Line 6, character 14: +x \ No newline at end of file diff --git a/test/lattests/bad/declInWhile.lat b/test/lattests/bad/declInWhile.lat new file mode 100644 index 0000000..dd2812d --- /dev/null +++ b/test/lattests/bad/declInWhile.lat @@ -0,0 +1,9 @@ +boolean foo() { return false; } + +int main() { + while (foo()) int x = 42; + + printInt(x); + + return 0; +} \ No newline at end of file diff --git a/test/lattests/bad/parameterOfVoidType.err b/test/lattests/bad/parameterOfVoidType.err new file mode 100644 index 0000000..7fc6850 --- /dev/null +++ b/test/lattests/bad/parameterOfVoidType.err @@ -0,0 +1,4 @@ +ERROR +Cannot use `void` as a type of a value. +Line 1, character 11: +void a \ No newline at end of file diff --git a/test/lattests/bad/parameterOfVoidType.lat b/test/lattests/bad/parameterOfVoidType.lat new file mode 100644 index 0000000..c5a7108 --- /dev/null +++ b/test/lattests/bad/parameterOfVoidType.lat @@ -0,0 +1,4 @@ +void foo (void a) { +} + +int main() { return 0; } \ No newline at end of file diff --git a/test/lattests/bad/useForVariableOutsideVar.err b/test/lattests/bad/useForVariableOutsideVar.err new file mode 100644 index 0000000..cc680c0 --- /dev/null +++ b/test/lattests/bad/useForVariableOutsideVar.err @@ -0,0 +1,4 @@ +ERROR +Undeclared identifier `a`. +Line 6, character 14: +a \ No newline at end of file diff --git a/test/lattests/bad/useForVariableOutsideVar.lat b/test/lattests/bad/useForVariableOutsideVar.lat new file mode 100644 index 0000000..ff54bf2 --- /dev/null +++ b/test/lattests/bad/useForVariableOutsideVar.lat @@ -0,0 +1,9 @@ +int[] foo() { return new int[]; } + +int main() { + for (int a : foo()) {} + + printInt(a); + + return 0; +} \ No newline at end of file diff --git a/test/lattests/bad/variableOfVoidType.err b/test/lattests/bad/variableOfVoidType.err new file mode 100644 index 0000000..bc63b22 --- /dev/null +++ b/test/lattests/bad/variableOfVoidType.err @@ -0,0 +1,4 @@ +ERROR +Cannot use `void` as a type of a value. +Line 2, character 10: +a \ No newline at end of file diff --git a/test/lattests/bad/variableOfVoidType.lat b/test/lattests/bad/variableOfVoidType.lat new file mode 100644 index 0000000..2a35a19 --- /dev/null +++ b/test/lattests/bad/variableOfVoidType.lat @@ -0,0 +1,4 @@ +int main() { + void a; + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/duplicateMethods.lat b/test/lattests/extensions/objects1/bad/duplicateMethods.lat index 2a3fd55..0ac02c2 100644 --- a/test/lattests/extensions/objects1/bad/duplicateMethods.lat +++ b/test/lattests/extensions/objects1/bad/duplicateMethods.lat @@ -1,4 +1,4 @@ class a { int foo(int x) { return 0; } - int foo(int x) { return 0; } + int foo(boolean x) { return 0; } } \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/fieldAndMethodOfTheSameName.err b/test/lattests/extensions/objects1/bad/fieldAndMethodOfTheSameName.err new file mode 100644 index 0000000..0054d56 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/fieldAndMethodOfTheSameName.err @@ -0,0 +1,6 @@ +ERROR +Conflicting field/method identifiers: `foo`. +Line 2, character 5 conflicting with Line 4, character 5 + +Line 1, character 1: +In definition of class `a`. \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/fieldAndMethodOfTheSameName.lat b/test/lattests/extensions/objects1/bad/fieldAndMethodOfTheSameName.lat new file mode 100644 index 0000000..84b54b6 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/fieldAndMethodOfTheSameName.lat @@ -0,0 +1,7 @@ +class a { + int foo; + + boolean foo(int x) { return true; } +} + +int main() { return 0; } \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/fieldNamedSelf.err b/test/lattests/extensions/objects1/bad/fieldNamedSelf.err new file mode 100644 index 0000000..b5052c7 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/fieldNamedSelf.err @@ -0,0 +1,6 @@ +ERROR +Reserved names used as field identifiers: `self`. +Line 2, character 5 + +Line 1, character 1: +In definition of class `a`. \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/fieldNamedSelf.lat b/test/lattests/extensions/objects1/bad/fieldNamedSelf.lat new file mode 100644 index 0000000..b80724d --- /dev/null +++ b/test/lattests/extensions/objects1/bad/fieldNamedSelf.lat @@ -0,0 +1,5 @@ +class a { + int self; +} + +int main() { return 0; } \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/fieldOfNonexistentType.err b/test/lattests/extensions/objects1/bad/fieldOfNonexistentType.err new file mode 100644 index 0000000..881d488 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/fieldOfNonexistentType.err @@ -0,0 +1,4 @@ +ERROR +Use of undeclared type `b`. +Line 2, character 5: +b x ; diff --git a/test/lattests/extensions/objects1/bad/fieldOfNonexistentType.lat b/test/lattests/extensions/objects1/bad/fieldOfNonexistentType.lat new file mode 100644 index 0000000..e51c367 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/fieldOfNonexistentType.lat @@ -0,0 +1,5 @@ +class a { + b x; +} + +int main() { return 0; } \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/fieldVoidType.err b/test/lattests/extensions/objects1/bad/fieldVoidType.err new file mode 100644 index 0000000..2b579f8 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/fieldVoidType.err @@ -0,0 +1,4 @@ +ERROR +Cannot use `void` as a type of a field. +Line 2, character 5: +void x ; diff --git a/test/lattests/extensions/objects1/bad/fieldVoidType.lat b/test/lattests/extensions/objects1/bad/fieldVoidType.lat new file mode 100644 index 0000000..d54d7d6 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/fieldVoidType.lat @@ -0,0 +1,5 @@ +class a { + void x; +} + +int main() { return 0; } \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/methodNamedSelf.err b/test/lattests/extensions/objects1/bad/methodNamedSelf.err new file mode 100644 index 0000000..dba894d --- /dev/null +++ b/test/lattests/extensions/objects1/bad/methodNamedSelf.err @@ -0,0 +1,6 @@ +ERROR +Reserved names used as method identifiers: `self`. +Line 2, character 5 + +Line 1, character 1: +In definition of class `a`. \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/methodNamedSelf.lat b/test/lattests/extensions/objects1/bad/methodNamedSelf.lat new file mode 100644 index 0000000..e137a39 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/methodNamedSelf.lat @@ -0,0 +1,5 @@ +class a { + int self(int x) { return 1; } +} + +int main() { return 0; } \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/newArrayOfNonexistentType.err b/test/lattests/extensions/objects1/bad/newArrayOfNonexistentType.err new file mode 100644 index 0000000..9f7ec26 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/newArrayOfNonexistentType.err @@ -0,0 +1,4 @@ +ERROR +Use of undeclared type `a`. +Line 2, character 13: +new a [10] \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/newArrayOfNonexistentType.lat b/test/lattests/extensions/objects1/bad/newArrayOfNonexistentType.lat new file mode 100644 index 0000000..7fb7cf1 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/newArrayOfNonexistentType.lat @@ -0,0 +1,4 @@ +int main() { + int x = new a[10]; + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/newOffNonexistentType.err b/test/lattests/extensions/objects1/bad/newOffNonexistentType.err new file mode 100644 index 0000000..6f7e026 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/newOffNonexistentType.err @@ -0,0 +1,4 @@ +ERROR +Use of undeclared type `a`. +Line 2, character 13: +new a \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/newOffNonexistentType.lat b/test/lattests/extensions/objects1/bad/newOffNonexistentType.lat new file mode 100644 index 0000000..78fa265 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/newOffNonexistentType.lat @@ -0,0 +1,4 @@ +int main() { + int x = new a; + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/newVoid.err b/test/lattests/extensions/objects1/bad/newVoid.err new file mode 100644 index 0000000..7c4a6c8 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/newVoid.err @@ -0,0 +1,4 @@ +ERROR +Cannot use `void` as a type of a value. +Line 2, character 13: +new void \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/newVoid.lat b/test/lattests/extensions/objects1/bad/newVoid.lat new file mode 100644 index 0000000..6d5b21c --- /dev/null +++ b/test/lattests/extensions/objects1/bad/newVoid.lat @@ -0,0 +1,4 @@ +int main() { + int x = new void; + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/newVoidArray.err b/test/lattests/extensions/objects1/bad/newVoidArray.err new file mode 100644 index 0000000..1499b08 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/newVoidArray.err @@ -0,0 +1,4 @@ +ERROR +Cannot use `void` as a type of a value. +Line 2, character 13: +new void [10] \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/newVoidArray.lat b/test/lattests/extensions/objects1/bad/newVoidArray.lat new file mode 100644 index 0000000..bfba9cc --- /dev/null +++ b/test/lattests/extensions/objects1/bad/newVoidArray.lat @@ -0,0 +1,4 @@ +int main() { + int x = new void[10]; + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/nullCastToNonexistentType.err b/test/lattests/extensions/objects1/bad/nullCastToNonexistentType.err new file mode 100644 index 0000000..c2b7194 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/nullCastToNonexistentType.err @@ -0,0 +1,4 @@ +ERROR +Use of undeclared type `a`. +Line 2, character 13: +(a)null \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/nullCastToNonexistentType.lat b/test/lattests/extensions/objects1/bad/nullCastToNonexistentType.lat new file mode 100644 index 0000000..12fbc69 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/nullCastToNonexistentType.lat @@ -0,0 +1,4 @@ +int main() { + int x = (a)null; + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/nullVoid.err b/test/lattests/extensions/objects1/bad/nullVoid.err new file mode 100644 index 0000000..0a9baa5 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/nullVoid.err @@ -0,0 +1,2 @@ +ERROR +syntax error at line 2, column 14 before `void' \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/nullVoid.lat b/test/lattests/extensions/objects1/bad/nullVoid.lat new file mode 100644 index 0000000..f05c391 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/nullVoid.lat @@ -0,0 +1,4 @@ +int main() { + int x = (void)null; + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/parameterOfNonexistentType.err b/test/lattests/extensions/objects1/bad/parameterOfNonexistentType.err new file mode 100644 index 0000000..3421f28 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/parameterOfNonexistentType.err @@ -0,0 +1,4 @@ +ERROR +Use of undeclared type `a`. +Line 1, character 11: +a a \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/parameterOfNonexistentType.lat b/test/lattests/extensions/objects1/bad/parameterOfNonexistentType.lat new file mode 100644 index 0000000..304a732 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/parameterOfNonexistentType.lat @@ -0,0 +1,4 @@ +void foo (a a) { +} + +int main() { return 0; } \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/redefinedMethodFromBase.err b/test/lattests/extensions/objects1/bad/redefinedMethodFromBase.err index e69de29..170c8a8 100644 --- a/test/lattests/extensions/objects1/bad/redefinedMethodFromBase.err +++ b/test/lattests/extensions/objects1/bad/redefinedMethodFromBase.err @@ -0,0 +1,7 @@ +ERROR +Overriding method `bar` has a different type than the base method. +Base method type is `int(int)`, overriding method type is `int(boolean)`. +Line 7, character 5 + +Line 6, character 1: +In definition of class `b`. \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/redefinedMethodFromBase.lat b/test/lattests/extensions/objects1/bad/redefinedMethodFromBase.lat index 7ebf567..4eb05c6 100644 --- a/test/lattests/extensions/objects1/bad/redefinedMethodFromBase.lat +++ b/test/lattests/extensions/objects1/bad/redefinedMethodFromBase.lat @@ -6,15 +6,4 @@ class a { class b extends a { int bar(boolean y) { return 1; } int baz(int z) { return 2; } -} - -int main() { - a a1 = new a; - a a2 = new b; - - int bar1 = a1.bar(0); - int bar2 = a2.bar(false); - - printInt(bar1); - printInt(bar2); } \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/returnOfNonexistentType.err b/test/lattests/extensions/objects1/bad/returnOfNonexistentType.err new file mode 100644 index 0000000..0b5419d --- /dev/null +++ b/test/lattests/extensions/objects1/bad/returnOfNonexistentType.err @@ -0,0 +1,5 @@ +ERROR +Use of undeclared type `a`. +Line 1, character 1: +a foo () { + } diff --git a/test/lattests/extensions/objects1/bad/returnOfNonexistentType.lat b/test/lattests/extensions/objects1/bad/returnOfNonexistentType.lat new file mode 100644 index 0000000..f8a5241 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/returnOfNonexistentType.lat @@ -0,0 +1,3 @@ +a foo() { + +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/variableOfNonexistentType.err b/test/lattests/extensions/objects1/bad/variableOfNonexistentType.err new file mode 100644 index 0000000..671f372 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/variableOfNonexistentType.err @@ -0,0 +1,4 @@ +ERROR +Use of undeclared type `a`. +Line 2, character 7: +a \ No newline at end of file diff --git a/test/lattests/extensions/objects1/bad/variableOfNonexistentType.lat b/test/lattests/extensions/objects1/bad/variableOfNonexistentType.lat new file mode 100644 index 0000000..4a507e4 --- /dev/null +++ b/test/lattests/extensions/objects1/bad/variableOfNonexistentType.lat @@ -0,0 +1,5 @@ +int main() { + a a; + + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/good/redefinedMethodFromBase.lat b/test/lattests/extensions/objects1/good/redefinedMethodFromBase.lat deleted file mode 100644 index 34d0fa3..0000000 --- a/test/lattests/extensions/objects1/good/redefinedMethodFromBase.lat +++ /dev/null @@ -1,20 +0,0 @@ -class a { - int foo(int x) { return 0; } - int bar(int y) { return 0; } -} - -class b extends a { - int bar(boolean y) { return 1; } - int baz(int z) { return 2; } -} - -int main() { - a a1 = new a; - b a2 = new b; - - int bar1 = a1.bar(0); - int bar2 = a2.bar(false); - - printInt(bar1); - printInt(bar2); -} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/good/redefinedMethodFromBase.output b/test/lattests/extensions/objects1/good/redefinedMethodFromBase.output deleted file mode 100644 index cc9b5e3..0000000 --- a/test/lattests/extensions/objects1/good/redefinedMethodFromBase.output +++ /dev/null @@ -1,2 +0,0 @@ -0 -1 \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInArg.err b/test/lattests/extensions/var/bad/varInArg.err new file mode 100644 index 0000000..937693a --- /dev/null +++ b/test/lattests/extensions/var/bad/varInArg.err @@ -0,0 +1,4 @@ +ERROR +Cannot use `var` as the type of a function parameter. +Line 1, character 9: +var x \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInArg.lat b/test/lattests/extensions/var/bad/varInArg.lat new file mode 100644 index 0000000..3fda030 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInArg.lat @@ -0,0 +1 @@ +int foo(var x) { return x; } \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInCast.err b/test/lattests/extensions/var/bad/varInCast.err new file mode 100644 index 0000000..3c19e02 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInCast.err @@ -0,0 +1,2 @@ +ERROR +syntax error at line 2, column 14 before `var' \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInCast.lat b/test/lattests/extensions/var/bad/varInCast.lat new file mode 100644 index 0000000..491cecd --- /dev/null +++ b/test/lattests/extensions/var/bad/varInCast.lat @@ -0,0 +1,4 @@ +int main() { + var x = (var) null; + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInField.err b/test/lattests/extensions/var/bad/varInField.err new file mode 100644 index 0000000..945661e --- /dev/null +++ b/test/lattests/extensions/var/bad/varInField.err @@ -0,0 +1,4 @@ +ERROR +Cannot use `var` as the type of a field. +Line 2, character 5: +var x ; diff --git a/test/lattests/extensions/var/bad/varInField.lat b/test/lattests/extensions/var/bad/varInField.lat new file mode 100644 index 0000000..cbb89d1 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInField.lat @@ -0,0 +1,3 @@ +class box { + var x; +} \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInFunctionReturn.err b/test/lattests/extensions/var/bad/varInFunctionReturn.err new file mode 100644 index 0000000..b51df88 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInFunctionReturn.err @@ -0,0 +1,6 @@ +ERROR +Cannot use `var` as the return type of a function. +Line 1, character 1: +var foo () { + return 0 ; + } diff --git a/test/lattests/extensions/var/bad/varInFunctionReturn.lat b/test/lattests/extensions/var/bad/varInFunctionReturn.lat new file mode 100644 index 0000000..6be7935 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInFunctionReturn.lat @@ -0,0 +1,7 @@ +var foo() { + return 0; +} + +int main() { + return foo(); +} \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInMethodReturn.err b/test/lattests/extensions/var/bad/varInMethodReturn.err new file mode 100644 index 0000000..4444c30 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInMethodReturn.err @@ -0,0 +1,6 @@ +ERROR +Cannot use `var` as the return type of a function. +Line 2, character 5: +var foo () { + return 0 ; + } diff --git a/test/lattests/extensions/var/bad/varInMethodReturn.lat b/test/lattests/extensions/var/bad/varInMethodReturn.lat new file mode 100644 index 0000000..a8f7ec2 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInMethodReturn.lat @@ -0,0 +1,3 @@ +class a { + var foo() { return 0; } +} \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInMultiItemWithoutInit.err b/test/lattests/extensions/var/bad/varInMultiItemWithoutInit.err new file mode 100644 index 0000000..45d5a82 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInMultiItemWithoutInit.err @@ -0,0 +1,4 @@ +ERROR +Cannot declare a `var` type variable without initialization. +Line 2, character 16: +b \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInMultiItemWithoutInit.lat b/test/lattests/extensions/var/bad/varInMultiItemWithoutInit.lat new file mode 100644 index 0000000..760d17b --- /dev/null +++ b/test/lattests/extensions/var/bad/varInMultiItemWithoutInit.lat @@ -0,0 +1,5 @@ +int main() { + var a = 1, b, c = 3; + b = 2; + return a + b + c; +} \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInNew.err b/test/lattests/extensions/var/bad/varInNew.err new file mode 100644 index 0000000..ec7316d --- /dev/null +++ b/test/lattests/extensions/var/bad/varInNew.err @@ -0,0 +1,4 @@ +ERROR +Cannot use `var` in a `new` expression. +Line 8, character 13: +new var \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInNew.lat b/test/lattests/extensions/var/bad/varInNew.lat new file mode 100644 index 0000000..e252617 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInNew.lat @@ -0,0 +1,11 @@ +class box { + int x; +} + +void foo(box x) { } + +int main() { + box x = new var; + foo(x); + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInNewArr.err b/test/lattests/extensions/var/bad/varInNewArr.err new file mode 100644 index 0000000..9415172 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInNewArr.err @@ -0,0 +1,4 @@ +ERROR +Cannot use `var` in a `new` expression. +Line 8, character 15: +new var [] \ No newline at end of file diff --git a/test/lattests/extensions/var/bad/varInNewArr.lat b/test/lattests/extensions/var/bad/varInNewArr.lat new file mode 100644 index 0000000..4ed7312 --- /dev/null +++ b/test/lattests/extensions/var/bad/varInNewArr.lat @@ -0,0 +1,11 @@ +class box { + int x; +} + +void foo(box[] x) { } + +int main() { + box[] x = new var[]; + foo(x); + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/objects1/good/redefinedMethodFromBase.err b/test/lattests/extensions/var/good/var001.err similarity index 100% rename from test/lattests/extensions/objects1/good/redefinedMethodFromBase.err rename to test/lattests/extensions/var/good/var001.err diff --git a/test/lattests/extensions/var/good/var001.lat b/test/lattests/extensions/var/good/var001.lat new file mode 100644 index 0000000..7248ade --- /dev/null +++ b/test/lattests/extensions/var/good/var001.lat @@ -0,0 +1,4 @@ +int main() { + var x = 0; + return x; +} \ No newline at end of file diff --git a/test/lattests/extensions/var/good/var001.out b/test/lattests/extensions/var/good/var001.out new file mode 100644 index 0000000..e69de29 diff --git a/test/lattests/extensions/var/good/var002.err b/test/lattests/extensions/var/good/var002.err new file mode 100644 index 0000000..a0aba93 --- /dev/null +++ b/test/lattests/extensions/var/good/var002.err @@ -0,0 +1 @@ +OK \ No newline at end of file diff --git a/test/lattests/extensions/var/good/var002.lat b/test/lattests/extensions/var/good/var002.lat new file mode 100644 index 0000000..9a36973 --- /dev/null +++ b/test/lattests/extensions/var/good/var002.lat @@ -0,0 +1,16 @@ +void foo(int[] tab) { + for (var x : tab) { + printInt(x); + } +} + +int main() { + var tab = new int[3]; + tab[0] = 17; + tab[1] = 42; + tab[2] = 37; + + foo(tab); + + return 1; +} \ No newline at end of file diff --git a/test/lattests/extensions/var/good/var002.out b/test/lattests/extensions/var/good/var002.out new file mode 100644 index 0000000..3480eda --- /dev/null +++ b/test/lattests/extensions/var/good/var002.out @@ -0,0 +1,3 @@ +17 +42 +37 \ No newline at end of file diff --git a/test/lattests/extensions/var/good/var003.err b/test/lattests/extensions/var/good/var003.err new file mode 100644 index 0000000..a0aba93 --- /dev/null +++ b/test/lattests/extensions/var/good/var003.err @@ -0,0 +1 @@ +OK \ No newline at end of file diff --git a/test/lattests/extensions/var/good/var003.lat b/test/lattests/extensions/var/good/var003.lat new file mode 100644 index 0000000..f5416c7 --- /dev/null +++ b/test/lattests/extensions/var/good/var003.lat @@ -0,0 +1,14 @@ +class box { + int x; +} + +void foo(box x) { + printInt(x.x); +} + +int main() { + var x = new box; + x.x = 42; + foo(x); + return 0; +} \ No newline at end of file diff --git a/test/lattests/extensions/var/good/var003.out b/test/lattests/extensions/var/good/var003.out new file mode 100644 index 0000000..f70d7bb --- /dev/null +++ b/test/lattests/extensions/var/good/var003.out @@ -0,0 +1 @@ +42 \ No newline at end of file diff --git a/test/lattests/extensions/var/good/var004.err b/test/lattests/extensions/var/good/var004.err new file mode 100644 index 0000000..a0aba93 --- /dev/null +++ b/test/lattests/extensions/var/good/var004.err @@ -0,0 +1 @@ +OK \ No newline at end of file diff --git a/test/lattests/extensions/var/good/var004.lat b/test/lattests/extensions/var/good/var004.lat new file mode 100644 index 0000000..667d3d2 --- /dev/null +++ b/test/lattests/extensions/var/good/var004.lat @@ -0,0 +1,4 @@ +int main() { + var a = 1, b = 2, c = 3; + return a + b - c; +} \ No newline at end of file diff --git a/test/lattests/extensions/var/good/var004.out b/test/lattests/extensions/var/good/var004.out new file mode 100644 index 0000000..e69de29 diff --git a/test/lattests/good/constexprInIf.err b/test/lattests/good/constexprInIf.err new file mode 100644 index 0000000..a0aba93 --- /dev/null +++ b/test/lattests/good/constexprInIf.err @@ -0,0 +1 @@ +OK \ No newline at end of file diff --git a/test/lattests/good/constexprInIf.lat b/test/lattests/good/constexprInIf.lat new file mode 100644 index 0000000..7124120 --- /dev/null +++ b/test/lattests/good/constexprInIf.lat @@ -0,0 +1,5 @@ +int main() { + if ((40 + 2) <= (10 * 2 * 2 + 3) && (true == !false && (1 == 0 || "abc" < "def"))) { + return 0; + } +} \ No newline at end of file diff --git a/test/lattests/good/constexprInIf.out b/test/lattests/good/constexprInIf.out new file mode 100644 index 0000000..e69de29 diff --git a/test/lattests/good/constexprInWhile.err b/test/lattests/good/constexprInWhile.err new file mode 100644 index 0000000..a0aba93 --- /dev/null +++ b/test/lattests/good/constexprInWhile.err @@ -0,0 +1 @@ +OK \ No newline at end of file diff --git a/test/lattests/good/constexprInWhile.lat b/test/lattests/good/constexprInWhile.lat new file mode 100644 index 0000000..aec83b1 --- /dev/null +++ b/test/lattests/good/constexprInWhile.lat @@ -0,0 +1,5 @@ +int main() { + while ((40 + 2) <= (10 * 2 * 2 + 3) && (true == !false && (1 == 0 || "abc" < "def"))) { + return 0; + } +} \ No newline at end of file diff --git a/test/lattests/good/constexprInWhile.out b/test/lattests/good/constexprInWhile.out new file mode 100644 index 0000000..e69de29