clafer 0.3.7 → 0.3.8
raw patch · 53 files changed
+3724/−3559 lines, 53 filesdep +HTTPdep +bytestringdep +networkdep ~clafer
Dependencies added: HTTP, bytestring, network
Dependency ranges changed: clafer
Files
- CHANGES.md +4/−12
- Makefile +4/−5
- README.md +9/−8
- clafer.cabal +27/−22
- dist/build/Language/Clafer/Front/Lexclafer.hs +7/−7
- dist/build/Language/Clafer/Front/Parclafer.hs +1699/−1679
- src-cmd/clafer.hs +7/−167
- src/GetURL.hs +24/−0
- src/Language/Clafer.hs +257/−102
- src/Language/Clafer/ClaferArgs.hs +26/−17
- src/Language/Clafer/Comments.hs +3/−3
- src/Language/Clafer/Common.hs +105/−50
- src/Language/Clafer/Css.hs +1/−1
- src/Language/Clafer/Front/Absclafer.hs +16/−16
- src/Language/Clafer/Front/LayoutResolver.hs +4/−4
- src/Language/Clafer/Front/Lexclafer.x +3/−3
- src/Language/Clafer/Front/Parclafer.y +42/−37
- src/Language/Clafer/Front/Printclafer.hs +11/−11
- src/Language/Clafer/Generator/Alloy.hs +113/−140
- src/Language/Clafer/Generator/Choco.hs +56/−127
- src/Language/Clafer/Generator/Concat.hs +84/−0
- src/Language/Clafer/Generator/Graph.hs +161/−69
- src/Language/Clafer/Generator/Html.hs +79/−72
- src/Language/Clafer/Generator/Python.hs +41/−21
- src/Language/Clafer/Generator/Schema.hs +100/−68
- src/Language/Clafer/Generator/Stats.hs +9/−7
- src/Language/Clafer/Generator/Xml.hs +26/−12
- src/Language/Clafer/Intermediate/Analysis.hs +53/−57
- src/Language/Clafer/Intermediate/Desugarer.hs +97/−90
- src/Language/Clafer/Intermediate/GLPKScopeAnalyzer.hs +75/−74
- src/Language/Clafer/Intermediate/Intclafer.hs +147/−163
- src/Language/Clafer/Intermediate/Resolver.hs +13/−13
- src/Language/Clafer/Intermediate/ResolverInheritance.hs +35/−46
- src/Language/Clafer/Intermediate/ResolverName.hs +75/−65
- src/Language/Clafer/Intermediate/ResolverType.hs +34/−34
- src/Language/Clafer/Intermediate/ScopeAnalysis.hs +3/−3
- src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs +40/−51
- src/Language/Clafer/Intermediate/StringAnalyzer.hs +3/−3
- src/Language/Clafer/Intermediate/Tracing.hs +19/−15
- src/Language/Clafer/Intermediate/Transformer.hs +3/−3
- src/Language/Clafer/JSONMetaData.hs +14/−14
- src/Language/Clafer/Optimizer/Optimizer.hs +28/−42
- src/Language/Clafer/QNameUID.hs +18/−18
- src/Language/Clafer/SplitJoin.hs +1/−1
- src/Language/ClaferT.hs +88/−49
- test/Functions.hs +5/−4
- test/Suite/Example.hs +0/−110
- test/Suite/Negative.hs +7/−7
- test/Suite/Positive.hs +11/−11
- test/Suite/SimpleScopeAnalyser.hs +33/−17
- test/test-suite.hs +2/−2
- tools/Makefile +2/−7
- tools/XsdCheck.class binary
CHANGES.md view
@@ -1,3 +1,7 @@+**Clafer Version 0.3.8 released on Jan 27, 2015** + +[Release](https://github.com/gsdlab/clafer/pull/60) + **Clafer Version 0.3.7 released on Oct 23, 2014** [Release](https://github.com/gsdlab/clafer/pull/53) @@ -14,31 +18,19 @@ [Release](https://github.com/gsdlab/clafer/pull/44) -[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.5,clafer/page:1/) - **Clafer Version 0.3.4 released on September 20, 2013** -[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.4,clafer/page:1/) - **Clafer Version 0.3.3 released on August 14, 2013** [Release](https://github.com/gsdlab/clafer/pull/35) -[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.3,clafer/page:1/) - **Clafer Version 0.3.2 released on April 11, 2013** -[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.2,clafer/page:1/) - **Clafer Version 0.3.1 released on October 17, 2012** -[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3.1,clafer/page:1/) - **Clafer Version 0.3 released on July 17, 2012** This was the first release of Clafer and included all code since the beginning of the project. - -[New features and bug fixes](http://gsd.uwaterloo.ca:8888/questions/scope:all/sort:activity-desc/tags:v0.3,clafer/page:1/) Basic features - See the `README.md`.
Makefile view
@@ -17,18 +17,17 @@ cabal sandbox init --sandbox=../.clafertools-cabal-sandbox cabal install --only-dependencies $(GPLK_LIBS_INCLUDES) $(MAC_USR_LIB) --enable-tests -build: +build: $(MAKE) -C $(TOOL_DIR) cabal configure cabal build -install: +install: mkdir -p $(to) mkdir -p $(to)/tools cp -f README.md $(to)/clafer-README.md cp -f LICENSE $(to)/ cp -f CHANGES.md $(to)/clafer-CHANGES.md - cp -f tools/alloy4.jar $(to)/tools cp -f tools/alloy4.2.jar $(to)/tools cp -f tools/XsdCheck.class $(to)/tools cp -f tools/ecore2clafer.jar $(to)/tools @@ -40,7 +39,7 @@ make clean ghc-pkg unregister clafer --package-db=../.clafertools-cabal-sandbox/x86_64-windows-ghc-7.8.3 rm `which clafer` - make + make # regenerate grammar, call after clafer.cf changed grammar: @@ -66,7 +65,7 @@ .PHONY : test test: - cabal test + cabal test $(MAKE) -C $(TEST_DIR) test generateAlloyJSPythonXMLXHTMLDot:
README.md view
@@ -1,7 +1,7 @@ Clafer ====== -v0.3.7 +v0.3.8 [Clafer](http://clafer.org) is a general-purpose lightweight structural modeling language developed by [GSD Lab](http://gsd.uwaterloo.ca/), [University of Waterloo](http://uwaterloo.ca), and @@ -95,7 +95,7 @@ ### Installation from binaries -Binary distributions of the release 0.3.7 of Clafer Tools for Windows, Mac, and Linux, +Binary distributions of the release 0.3.8 of Clafer Tools for Windows, Mac, and Linux, can be downloaded from [Clafer Tools - Binary Distributions](http://http://gsd.uwaterloo.ca/clafer-tools-binary-distributions). @@ -109,11 +109,11 @@ * [The Haskell Platform](http://hackage.haskell.org/platform/) v2014.2.0.0 64bit * on Windows, use 32bit -Clafer is now available on [Hackage](http://hackage.haskell.org/package/clafer-0.3.7/) and it can be installed using +Clafer is now available on [Hackage](http://hackage.haskell.org/package/clafer-0.3.8/) and it can be installed using 1. `cabal update` 2. `cabal install clafer` -3. `cd <cabal's lib or share folder>` (`C:\Users\<user>\AppData\Roaming\cabal\x86_64-windows-ghc-7.8.3\clafer-0.3.7` on Windows or `.cabal/share/x86_64-linux-ghc-7.8.3/clafer-0.3.7/` on Linux) +3. `cd <cabal's lib or share folder>` (`C:\Users\<user>\AppData\Roaming\cabal\x86_64-windows-ghc-7.8.3\clafer-0.3.8` on Windows or `.cabal/share/x86_64-linux-ghc-7.8.3/clafer-0.3.8/` on Linux) 4. to automatically download Alloy jars * execute `make` in `tools` @@ -191,15 +191,15 @@ (As printed by `clafer --help`) ``` -Clafer 0.3.7 +Clafer 0.3.8 clafer [OPTIONS] [FILE] Common flags: -m --mode=CLAFERMODE Generated output type. Available CLAFERMODEs are: 'alloy' (Alloy 4.1); - 'alloy42' (default, Alloy 4.2); - 'xml' (intermediate representation of + 'alloy42' (default, Alloy 4.2); 'xml' + (intermediate representation of Clafer model); 'clafer' (analyzed and desugared clafer model); 'html' (original model in HTML); 'graph' @@ -273,6 +273,7 @@ ('.cfr-scope'). -? --help Display help message -V --version Print version information + --numeric-version Print just the version number ``` The dependencies among the command line arguments are described on the [model wiki](http://t3-necsis.cs.uwaterloo.ca:8091/ClaferTools/CommandLineArguments). @@ -323,4 +324,4 @@ * Try a live instance of [ClaferMooVisualizer](http://t3-necsis.cs.uwaterloo.ca:8092) * Take a look at (incomplete) [Clafer by examples wiki](https://github.com/gsdlab/clafer/wiki) * Browse example models in the [test suite](https://github.com/gsdlab/clafer/tree/master/test/positive) and [MOO examples](https://github.com/gsdlab/clafer/tree/master/spl_configurator/dataset) -* Post questions, report bugs, suggest improvements [GSD Lab Bug Tracker](http://gsd.uwaterloo.ca:8888/questions/). Tag your entries with `clafer` (so that we know what they are related to) and with `jimmy-liang` or `michal` (so that Jimmy or Michał gets a notification).+* Post questions, report bugs, suggest improvements [GSD Lab Bug Tracker](http://gsd.uwaterloo.ca:8888/questions/). Tag your entries with `clafer` (so that we know what they are related to) and with `jimmy-liang` or `michal` (so that Jimmy or Michał gets a notification).
clafer.cabal view
@@ -1,5 +1,5 @@ Name: clafer -Version: 0.3.7 +Version: 0.3.8 Synopsis: clafer compiles Clafer models to other formats, such as Alloy, XML, HTML, Dot. Description: Clafer is a general purpose, lightweight, structural modeling language developed at GSD Lab, University of Waterloo. Lightweight modeling aims at improving the understanding of the problem domain in the early stages of software development and determining the requirements with fewer defects. Clafer's goal is to make modeling more accessible to a wider range of users and domains. The tool provides a reference language implementation. It translates models to other formats (e.g. Alloy, XML) to allow for reasoning with existing tools. Homepage: http://clafer.org @@ -24,7 +24,7 @@ location: git://github.com/gsdlab/clafer.git Executable clafer build-tools: ghc >= 7.6.3 - default-language: + default-language: Haskell2010 default-extensions: DeriveDataTypeable, @@ -37,10 +37,10 @@ process >= 1.1.0.2, mtl >= 2.1.2, - cmdargs >= 0.10.7, - split >= 0.2.2, + cmdargs >= 0.10.7, + split >= 0.2.2, - clafer == 0.3.7 + clafer == 0.3.8 if os(windows) build-depends: HaXml == 1.24 else @@ -48,10 +48,10 @@ other-modules: Paths_clafer -library +library build-tools: ghc >= 7.6.3 - default-language: - Haskell2010 + default-language: + Haskell2010 default-extensions: DeriveDataTypeable, RankNTypes @@ -61,6 +61,9 @@ directory >= 1.2.0.1, filepath >= 1.3.0.1, process >= 1.1.0.2, + network < 2.6, + HTTP, + bytestring, mtl >= 2.1.2, parsec >= 3.1.3, @@ -71,11 +74,11 @@ json-builder >= 0.3, lens >= 4.1.1 && < 4.4, string-conversions >= 0.3.0.2, - cmdargs >= 0.10.7, - executable-path >= 0.0.3, + cmdargs >= 0.10.7, + executable-path >= 0.0.3, glpk-hs >= 0.3.4, MaybeT >= 0.1.2, - split >= 0.2.2, + split >= 0.2.2, text >= 0.11.3.1 if os(windows) @@ -85,7 +88,7 @@ hs-source-dirs: src ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-orphans - exposed-modules: + exposed-modules: Language.Clafer, Language.ClaferT, Language.Clafer.ClaferArgs, @@ -102,13 +105,14 @@ Language.Clafer.Front.Printclafer, Language.Clafer.Generator.Alloy, Language.Clafer.Generator.Choco, + Language.Clafer.Generator.Concat, Language.Clafer.Generator.Graph, Language.Clafer.Generator.Html, Language.Clafer.Generator.Python, Language.Clafer.Generator.Schema, Language.Clafer.Generator.Stats, Language.Clafer.Generator.Xml, - Language.Clafer.Intermediate.Analysis, + Language.Clafer.Intermediate.Analysis, Language.Clafer.Intermediate.Desugarer, Language.Clafer.Intermediate.Intclafer, Language.Clafer.Intermediate.Resolver, @@ -123,15 +127,17 @@ Language.Clafer.Intermediate.Transformer, Language.Clafer.Optimizer.Optimizer, Language.Clafer.SplitJoin - other-modules: Paths_clafer + other-modules: Paths_clafer, + GetURL + Test-Suite test-suite build-tools: ghc >= 7.6.3 - default-language: - Haskell2010 - type: exitcode-stdio-1.0 + default-language: + Haskell2010 + type: exitcode-stdio-1.0 main-is: test-suite.hs hs-source-dirs: test - build-depends: + build-depends: base >= 4.6.0.1 && < 5, containers >= 0.5.0.0, directory >= 1.2.0.1, @@ -139,25 +145,24 @@ HUnit >= 1.2.5.2, mtl >= 2.1.2, - QuickCheck >= 2.6, + QuickCheck >= 2.6, lens >= 4.1.1 && < 4.4, tasty >= 0.10, tasty-hunit >= 0.9, tasty-th >= 0.1.2, - clafer == 0.3.7 + clafer == 0.3.8 if os(windows) build-depends: HaXml == 1.24 else build-depends: HaXml >= 1.24 - ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-orphans -threaded + ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-orphans other-modules: Paths_clafer, Functions, - Suite.Example, Suite.Positive, Suite.Negative, Suite.SimpleScopeAnalyser
dist/build/Language/Clafer/Front/Lexclafer.hs view
@@ -29,18 +29,18 @@ import GlaExts #endif alex_base :: AlexAddr -alex_base = AlexA# "\xf8\xff\xff\xff\x4c\x00\x00\x00\x22\x01\x00\x00\xa2\x01\x00\x00\x22\x02\x00\x00\x22\x03\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x13\x04\x00\x00\x34\x00\x00\x00\xd3\x03\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x29\x05\x00\x00\x9e\x05\x00\x00\xd9\xff\xff\xff\x4d\x00\x00\x00\x61\x00\x00\x00\x9e\x06\x00\x00\x5e\x06\x00\x00\x00\x00\x00\x00\x54\x07\x00\x00\x00\x00\x00\x00\x2a\x08\x00\x00\x7e\x00\x00\x00\xed\xff\xff\xff\xdc\xff\xff\xff\x4f\x00\x00\x00\xcb\xff\xff\xff\xd6\xff\xff\xff\x00\x00\x00\x00\x99\xff\xff\xff\xd8\xff\xff\xff\x3d\x00\x00\x00\xef\xff\xff\xff\xf9\xff\xff\xff\x79\x00\x00\x00\x2f\x07\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x03\x09\x00\x00"# +alex_base = AlexA# "\xf8\xff\xff\xff\x4c\x00\x00\x00\x22\x01\x00\x00\xa2\x01\x00\x00\x22\x02\x00\x00\x22\x03\x00\x00\x92\x00\x00\x00\x00\x00\x00\x00\x13\x03\x00\x00\x13\x04\x00\x00\x34\x00\x00\x00\xd3\x03\x00\x00\xa9\x04\x00\x00\x00\x00\x00\x00\x15\x04\x00\x00\x29\x05\x00\x00\x9e\x05\x00\x00\xd9\xff\xff\xff\x4d\x00\x00\x00\x61\x00\x00\x00\xe1\xff\xff\xff\x9e\x06\x00\x00\x5e\x06\x00\x00\x00\x00\x00\x00\x54\x07\x00\x00\x00\x00\x00\x00\x2a\x08\x00\x00\x7e\x00\x00\x00\xed\xff\xff\xff\xdd\xff\xff\xff\x4f\x00\x00\x00\xd6\xff\xff\xff\xd7\xff\xff\xff\x00\x00\x00\x00\x9a\xff\xff\xff\xdf\xff\xff\xff\x3d\x00\x00\x00\xf1\xff\xff\xff\x0e\x00\x00\x00\x79\x00\x00\x00\x2f\x07\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x03\x09\x00\x00"# alex_table :: AlexAddr -alex_table = AlexA# "\x00\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x13\x00\x20\x00\x20\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x20\x00\x20\x00\x20\x00\x20\x00\x0c\x00\x1a\x00\x1e\x00\x10\x00\x20\x00\x17\x00\x20\x00\x25\x00\x20\x00\x20\x00\x20\x00\x20\x00\x1c\x00\x20\x00\x1d\x00\x24\x00\x1b\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x1f\x00\x20\x00\x23\x00\x22\x00\x1f\x00\x20\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x20\x00\x20\x00\x20\x00\x10\x00\x00\x00\x20\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x20\x00\x21\x00\x20\x00\x02\x00\x20\x00\x00\x00\x20\x00\x22\x00\x18\x00\x20\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x1a\x00\x00\x00\x22\x00\x00\x00\x00\x00\x10\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\x1a\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x10\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x05\x00\x06\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\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x06\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\x14\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x03\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x06\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\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x29\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\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\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x09\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x14\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x16\x00\x15\x00\x03\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0e\x00\x04\x00\x07\x00\x07\x00\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\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x06\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\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\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\x2a\x00\x00\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\x00\x2a\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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_table = AlexA# "\x00\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x13\x00\x21\x00\x21\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x21\x00\x21\x00\x21\x00\x21\x00\x0c\x00\x1b\x00\x1f\x00\x10\x00\x21\x00\x18\x00\x21\x00\x14\x00\x21\x00\x21\x00\x21\x00\x26\x00\x1d\x00\x21\x00\x1e\x00\x25\x00\x1c\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x20\x00\x21\x00\x24\x00\x23\x00\x20\x00\x21\x00\x21\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x21\x00\x21\x00\x21\x00\x10\x00\x00\x00\x21\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x21\x00\x22\x00\x21\x00\x02\x00\x21\x00\x00\x00\x21\x00\x23\x00\x19\x00\x21\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x1b\x00\x00\x00\x23\x00\x00\x00\x00\x00\x10\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x10\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\x00\x29\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\x05\x00\x06\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\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x06\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\x15\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x03\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\x16\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x06\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\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2a\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x09\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x28\x00\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\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x15\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x17\x00\x16\x00\x03\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0d\x00\x0e\x00\x04\x00\x07\x00\x07\x00\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\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x06\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\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x2d\x00\x2b\x00\x3d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3d\x00\x3e\x00\x7c\x00\x3e\x00\x2a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x2f\x00\x2e\x00\x26\x00\x26\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\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\x5c\x00\x5d\x00\x22\x00\xff\xff\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\x2a\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x2f\x00\x2d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x3e\x00\xff\xff\xff\xff\x5c\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\x20\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x74\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\xc3\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\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\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\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\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\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\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\x22\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\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\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\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\xff\xff\x65\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\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\x2a\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\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_check = AlexA# "\xff\xff\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x2d\x00\x26\x00\x2b\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3d\x00\x3d\x00\x3e\x00\x7c\x00\x2a\x00\x20\x00\x21\x00\x22\x00\x23\x00\x2f\x00\x3e\x00\x26\x00\x2e\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\x2a\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\x22\x00\xff\xff\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\x2a\x00\x3a\x00\xff\xff\x3c\x00\x3d\x00\x2f\x00\x2d\x00\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\xff\xff\x3e\x00\xff\xff\xff\xff\x5c\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\x20\x00\xff\xff\xff\xff\xff\xff\x6e\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2e\x00\x74\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\xc3\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\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\x2a\x00\xff\xff\xff\xff\xff\xff\xff\xff\x2f\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\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\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\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\x22\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\xff\xff\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x5c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00\x88\x00\x89\x00\x8a\x00\x8b\x00\x8c\x00\x8d\x00\x8e\x00\x8f\x00\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00\x98\x00\x99\x00\x9a\x00\x9b\x00\x9c\x00\x9d\x00\x9e\x00\x9f\x00\xa0\x00\xa1\x00\xa2\x00\xa3\x00\xa4\x00\xa5\x00\xa6\x00\xa7\x00\xa8\x00\xa9\x00\xaa\x00\xab\x00\xac\x00\xad\x00\xae\x00\xaf\x00\xb0\x00\xb1\x00\xb2\x00\xb3\x00\xb4\x00\xb5\x00\xb6\x00\xb7\x00\xb8\x00\xb9\x00\xba\x00\xbb\x00\xbc\x00\xbd\x00\xbe\x00\xbf\x00\xc0\x00\xc1\x00\xc2\x00\xc3\x00\xc4\x00\xc5\x00\xc6\x00\xc7\x00\xc8\x00\xc9\x00\xca\x00\xcb\x00\xcc\x00\xcd\x00\xce\x00\xcf\x00\xd0\x00\xd1\x00\xd2\x00\xd3\x00\xd4\x00\xd5\x00\xd6\x00\xd7\x00\xd8\x00\xd9\x00\xda\x00\xdb\x00\xdc\x00\xdd\x00\xde\x00\xdf\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\xe6\x00\xe7\x00\xe8\x00\xe9\x00\xea\x00\xeb\x00\xec\x00\xed\x00\xee\x00\xef\x00\xf0\x00\xf1\x00\xf2\x00\xf3\x00\xf4\x00\xf5\x00\xf6\x00\xf7\x00\xf8\x00\xf9\x00\xfa\x00\xfb\x00\xfc\x00\xfd\x00\xfe\x00\xff\x00\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\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\xff\xff\x65\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\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\x2a\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\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\x0c\x00\x0c\x00\xff\xff\xff\xff\x0c\x00\x0c\x00\x0d\x00\x0d\x00\x10\x00\xff\xff\x10\x00\x0c\x00\x16\x00\x16\x00\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\x17\x00\x17\x00\x17\x00\x17\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# +alex_deflt = AlexA# "\xff\xff\x0c\x00\x0c\x00\xff\xff\xff\xff\x0c\x00\x0c\x00\x0d\x00\x0d\x00\x10\x00\xff\xff\x10\x00\x0c\x00\x17\x00\x17\x00\xff\xff\x10\x00\xff\xff\xff\xff\xff\xff\xff\xff\x18\x00\x18\x00\x18\x00\x18\x00\xff\xff\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\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# -alex_accept = listArray (0::Int,42) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7)] +alex_accept = listArray (0::Int,43) [AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccNone,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAccSkip,AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_3),AlexAcc (alex_action_4),AlexAcc (alex_action_5),AlexAcc (alex_action_5),AlexAcc (alex_action_6),AlexAcc (alex_action_7)] {-# LINE 42 "src\Language\Clafer\Front\Lexclafer.x" #-} @@ -101,7 +101,7 @@ | s > a = treeFind right | s == a = t -resWords = b ">=" 31 (b "." 16 (b "*" 8 (b "&" 4 (b "!=" 2 (b "!" 1 N N) (b "#" 3 N N)) (b "(" 6 (b "&&" 5 N N) (b ")" 7 N N))) (b "-" 12 (b "++" 10 (b "+" 9 N N) (b "," 11 N N)) (b "->" 14 (b "--" 13 N N) (b "->>" 15 N N)))) (b "<:" 24 (b ":=" 20 (b "/" 18 (b ".." 17 N N) (b ":" 19 N N)) (b ";" 22 (b ":>" 21 N N) (b "<" 23 N N))) (b "=" 28 (b "<=" 26 (b "<<" 25 N N) (b "<=>" 27 N N)) (b ">" 30 (b "=>" 29 N N) N)))) (b "min" 47 (b "all" 39 (b "\\" 35 (b "?" 33 (b ">>" 32 N N) (b "[" 34 N N)) (b "`" 37 (b "]" 36 N N) (b "abstract" 38 N N))) (b "if" 43 (b "else" 41 (b "disj" 40 N N) (b "enum" 42 N N)) (b "lone" 45 (b "in" 44 N N) (b "max" 46 N N)))) (b "sum" 55 (b "one" 51 (b "no" 49 (b "mux" 48 N N) (b "not" 50 N N)) (b "or" 53 (b "opt" 52 N N) (b "some" 54 N N))) (b "|" 59 (b "xor" 57 (b "then" 56 N N) (b "{" 58 N N)) (b "}" 61 (b "||" 60 N N) N)))) +resWords = b ">>" 32 (b "." 16 (b "**" 8 (b "&&" 4 (b "!=" 2 (b "!" 1 N N) (b "#" 3 N N)) (b ")" 6 (b "(" 5 N N) (b "*" 7 N N))) (b "-" 12 (b "++" 10 (b "+" 9 N N) (b "," 11 N N)) (b "->" 14 (b "--" 13 N N) (b "->>" 15 N N)))) (b "<:" 24 (b ":=" 20 (b "/" 18 (b ".." 17 N N) (b ":" 19 N N)) (b ";" 22 (b ":>" 21 N N) (b "<" 23 N N))) (b "=" 28 (b "<=" 26 (b "<<" 25 N N) (b "<=>" 27 N N)) (b ">" 30 (b "=>" 29 N N) (b ">=" 31 N N))))) (b "min" 48 (b "assert" 40 (b "]" 36 (b "[" 34 (b "?" 33 N N) (b "\\" 35 N N)) (b "abstract" 38 (b "`" 37 N N) (b "all" 39 N N))) (b "if" 44 (b "else" 42 (b "disj" 41 N N) (b "enum" 43 N N)) (b "lone" 46 (b "in" 45 N N) (b "max" 47 N N)))) (b "sum" 56 (b "one" 52 (b "no" 50 (b "mux" 49 N N) (b "not" 51 N N)) (b "or" 54 (b "opt" 53 N N) (b "some" 55 N N))) (b "|" 60 (b "xor" 58 (b "then" 57 N N) (b "{" 59 N N)) (b "}" 62 (b "||" 61 N N) N)))) where b s n = let bs = id s in B bs (TS bs n) @@ -162,7 +162,7 @@ alexInputPrevChar :: AlexInput -> Char alexInputPrevChar (p, c, bs, s) = c --- | Encode a Haskell String to a list of Word8 values, in UTF8 format. + -- | Encode a Haskell String to a list of Word8 values, in UTF8 format. utf8Encode :: Char -> [Word8] utf8Encode = map fromIntegral . go . ord where
dist/build/Language/Clafer/Front/Parclafer.hs view
@@ -17,1685 +17,1705 @@ #else type HappyAny = forall a . a #endif -happyIn4 :: (PosInteger) -> (HappyAbsSyn ) -happyIn4 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn4 #-} -happyOut4 :: (HappyAbsSyn ) -> (PosInteger) -happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut4 #-} -happyIn5 :: (PosDouble) -> (HappyAbsSyn ) -happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn5 #-} -happyOut5 :: (HappyAbsSyn ) -> (PosDouble) -happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut5 #-} -happyIn6 :: (PosString) -> (HappyAbsSyn ) -happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn6 #-} -happyOut6 :: (HappyAbsSyn ) -> (PosString) -happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut6 #-} -happyIn7 :: (PosIdent) -> (HappyAbsSyn ) -happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn7 #-} -happyOut7 :: (HappyAbsSyn ) -> (PosIdent) -happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut7 #-} -happyIn8 :: (Module) -> (HappyAbsSyn ) -happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn8 #-} -happyOut8 :: (HappyAbsSyn ) -> (Module) -happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut8 #-} -happyIn9 :: (Declaration) -> (HappyAbsSyn ) -happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn9 #-} -happyOut9 :: (HappyAbsSyn ) -> (Declaration) -happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut9 #-} -happyIn10 :: (Clafer) -> (HappyAbsSyn ) -happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn10 #-} -happyOut10 :: (HappyAbsSyn ) -> (Clafer) -happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut10 #-} -happyIn11 :: (Constraint) -> (HappyAbsSyn ) -happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn11 #-} -happyOut11 :: (HappyAbsSyn ) -> (Constraint) -happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut11 #-} -happyIn12 :: (SoftConstraint) -> (HappyAbsSyn ) -happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn12 #-} -happyOut12 :: (HappyAbsSyn ) -> (SoftConstraint) -happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut12 #-} -happyIn13 :: (Goal) -> (HappyAbsSyn ) -happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn13 #-} -happyOut13 :: (HappyAbsSyn ) -> (Goal) -happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut13 #-} -happyIn14 :: (Abstract) -> (HappyAbsSyn ) -happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn14 #-} -happyOut14 :: (HappyAbsSyn ) -> (Abstract) -happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut14 #-} -happyIn15 :: (Elements) -> (HappyAbsSyn ) -happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn15 #-} -happyOut15 :: (HappyAbsSyn ) -> (Elements) -happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut15 #-} -happyIn16 :: (Element) -> (HappyAbsSyn ) -happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn16 #-} -happyOut16 :: (HappyAbsSyn ) -> (Element) -happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut16 #-} -happyIn17 :: (Super) -> (HappyAbsSyn ) -happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn17 #-} -happyOut17 :: (HappyAbsSyn ) -> (Super) -happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut17 #-} -happyIn18 :: (SuperHow) -> (HappyAbsSyn ) -happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn18 #-} -happyOut18 :: (HappyAbsSyn ) -> (SuperHow) -happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut18 #-} -happyIn19 :: (Init) -> (HappyAbsSyn ) -happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn19 #-} -happyOut19 :: (HappyAbsSyn ) -> (Init) -happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut19 #-} -happyIn20 :: (InitHow) -> (HappyAbsSyn ) -happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn20 #-} -happyOut20 :: (HappyAbsSyn ) -> (InitHow) -happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut20 #-} -happyIn21 :: (GCard) -> (HappyAbsSyn ) -happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn21 #-} -happyOut21 :: (HappyAbsSyn ) -> (GCard) -happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut21 #-} -happyIn22 :: (Card) -> (HappyAbsSyn ) -happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn22 #-} -happyOut22 :: (HappyAbsSyn ) -> (Card) -happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut22 #-} -happyIn23 :: (NCard) -> (HappyAbsSyn ) -happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn23 #-} -happyOut23 :: (HappyAbsSyn ) -> (NCard) -happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut23 #-} -happyIn24 :: (ExInteger) -> (HappyAbsSyn ) -happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn24 #-} -happyOut24 :: (HappyAbsSyn ) -> (ExInteger) -happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut24 #-} -happyIn25 :: (Name) -> (HappyAbsSyn ) -happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn25 #-} -happyOut25 :: (HappyAbsSyn ) -> (Name) -happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut25 #-} -happyIn26 :: (Exp) -> (HappyAbsSyn ) -happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn26 #-} -happyOut26 :: (HappyAbsSyn ) -> (Exp) -happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut26 #-} -happyIn27 :: (Exp) -> (HappyAbsSyn ) -happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn27 #-} -happyOut27 :: (HappyAbsSyn ) -> (Exp) -happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut27 #-} -happyIn28 :: (Exp) -> (HappyAbsSyn ) -happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn28 #-} -happyOut28 :: (HappyAbsSyn ) -> (Exp) -happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut28 #-} -happyIn29 :: (Exp) -> (HappyAbsSyn ) -happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn29 #-} -happyOut29 :: (HappyAbsSyn ) -> (Exp) -happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut29 #-} -happyIn30 :: (Exp) -> (HappyAbsSyn ) -happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn30 #-} -happyOut30 :: (HappyAbsSyn ) -> (Exp) -happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut30 #-} -happyIn31 :: (Exp) -> (HappyAbsSyn ) -happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn31 #-} -happyOut31 :: (HappyAbsSyn ) -> (Exp) -happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut31 #-} -happyIn32 :: (Exp) -> (HappyAbsSyn ) -happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn32 #-} -happyOut32 :: (HappyAbsSyn ) -> (Exp) -happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut32 #-} -happyIn33 :: (Exp) -> (HappyAbsSyn ) -happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn33 #-} -happyOut33 :: (HappyAbsSyn ) -> (Exp) -happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut33 #-} -happyIn34 :: (Exp) -> (HappyAbsSyn ) -happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn34 #-} -happyOut34 :: (HappyAbsSyn ) -> (Exp) -happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut34 #-} -happyIn35 :: (Exp) -> (HappyAbsSyn ) -happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn35 #-} -happyOut35 :: (HappyAbsSyn ) -> (Exp) -happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut35 #-} -happyIn36 :: (Exp) -> (HappyAbsSyn ) -happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn36 #-} -happyOut36 :: (HappyAbsSyn ) -> (Exp) -happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut36 #-} -happyIn37 :: (Exp) -> (HappyAbsSyn ) -happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn37 #-} -happyOut37 :: (HappyAbsSyn ) -> (Exp) -happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut37 #-} -happyIn38 :: (Exp) -> (HappyAbsSyn ) -happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn38 #-} -happyOut38 :: (HappyAbsSyn ) -> (Exp) -happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut38 #-} -happyIn39 :: (Exp) -> (HappyAbsSyn ) -happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn39 #-} -happyOut39 :: (HappyAbsSyn ) -> (Exp) -happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut39 #-} -happyIn40 :: (SetExp) -> (HappyAbsSyn ) -happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn40 #-} -happyOut40 :: (HappyAbsSyn ) -> (SetExp) -happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut40 #-} -happyIn41 :: (SetExp) -> (HappyAbsSyn ) -happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn41 #-} -happyOut41 :: (HappyAbsSyn ) -> (SetExp) -happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut41 #-} -happyIn42 :: (SetExp) -> (HappyAbsSyn ) -happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn42 #-} -happyOut42 :: (HappyAbsSyn ) -> (SetExp) -happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut42 #-} -happyIn43 :: (SetExp) -> (HappyAbsSyn ) -happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn43 #-} -happyOut43 :: (HappyAbsSyn ) -> (SetExp) -happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut43 #-} -happyIn44 :: (SetExp) -> (HappyAbsSyn ) -happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn44 #-} -happyOut44 :: (HappyAbsSyn ) -> (SetExp) -happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut44 #-} -happyIn45 :: (SetExp) -> (HappyAbsSyn ) -happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn45 #-} -happyOut45 :: (HappyAbsSyn ) -> (SetExp) -happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut45 #-} -happyIn46 :: (SetExp) -> (HappyAbsSyn ) -happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn46 #-} -happyOut46 :: (HappyAbsSyn ) -> (SetExp) -happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut46 #-} -happyIn47 :: (Decl) -> (HappyAbsSyn ) -happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn47 #-} -happyOut47 :: (HappyAbsSyn ) -> (Decl) -happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut47 #-} -happyIn48 :: (Quant) -> (HappyAbsSyn ) -happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn48 #-} -happyOut48 :: (HappyAbsSyn ) -> (Quant) -happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut48 #-} -happyIn49 :: (EnumId) -> (HappyAbsSyn ) -happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn49 #-} -happyOut49 :: (HappyAbsSyn ) -> (EnumId) -happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut49 #-} -happyIn50 :: (ModId) -> (HappyAbsSyn ) -happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn50 #-} -happyOut50 :: (HappyAbsSyn ) -> (ModId) -happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut50 #-} -happyIn51 :: (LocId) -> (HappyAbsSyn ) -happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn51 #-} -happyOut51 :: (HappyAbsSyn ) -> (LocId) -happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut51 #-} -happyIn52 :: ([Declaration]) -> (HappyAbsSyn ) -happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn52 #-} -happyOut52 :: (HappyAbsSyn ) -> ([Declaration]) -happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut52 #-} -happyIn53 :: ([EnumId]) -> (HappyAbsSyn ) -happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn53 #-} -happyOut53 :: (HappyAbsSyn ) -> ([EnumId]) -happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut53 #-} -happyIn54 :: ([Element]) -> (HappyAbsSyn ) -happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn54 #-} -happyOut54 :: (HappyAbsSyn ) -> ([Element]) -happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut54 #-} -happyIn55 :: ([Exp]) -> (HappyAbsSyn ) -happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn55 #-} -happyOut55 :: (HappyAbsSyn ) -> ([Exp]) -happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut55 #-} -happyIn56 :: ([LocId]) -> (HappyAbsSyn ) -happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn56 #-} -happyOut56 :: (HappyAbsSyn ) -> ([LocId]) -happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut56 #-} -happyIn57 :: ([ModId]) -> (HappyAbsSyn ) -happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyIn57 #-} -happyOut57 :: (HappyAbsSyn ) -> ([ModId]) -happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOut57 #-} -happyInTok :: (Token) -> (HappyAbsSyn ) -happyInTok x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyInTok #-} -happyOutTok :: (HappyAbsSyn ) -> (Token) -happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x -{-# INLINE happyOutTok #-} - - -happyActOffsets :: HappyAddr -happyActOffsets = HappyA# "\x00\x00\x1b\x01\x00\x00\x17\x01\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x16\x01\x00\x00\x16\x01\x3a\x01\x00\x00\x00\x00\x09\x00\x32\x01\x00\x00\x54\x00\x1d\x00\x01\x00\x41\x01\x0f\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x01\x2a\x01\xf3\x00\xf7\x00\x29\x01\x00\x00\x8d\x05\x00\x00\xb6\x00\x03\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x20\x01\x28\x01\x10\x01\x11\x01\x13\x01\x00\x00\xb4\x00\x8a\x00\xfb\xff\x70\x00\x00\x00\xfb\xff\xde\xff\xfb\xff\x00\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd9\x00\x07\x01\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\x00\x00\x00\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4\x00\xfb\xff\xd4\x00\xb2\x00\x00\x00\xb1\x00\xcc\x00\xce\x00\xa8\x00\x00\x00\xcf\x00\x0c\x00\x00\x00\x8d\x05\x76\x00\x00\x00\xa0\x00\x94\x00\xfd\xff\xfd\xff\xfd\xff\xfd\xff\xfd\xff\xfd\xff\xfd\xff\xc0\x00\xc0\x00\xc0\x00\xc0\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x8a\x00\x9b\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\xa7\x00\x00\x00\x00\x00\x00\x00\x09\x00\xfd\xff\x00\x00\x00\x00\x00\x00\x0f\x00\xfd\xff\xfc\xff\xa1\x00\x89\x00\x80\x00\xaf\x00\x00\x00\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x00\x00\x00\x00\xab\x00\xab\x00\xa5\x00\x82\x00\x8f\x00\x7f\x00\x00\x00\x5d\x00\x70\x00\x00\x00\x00\x00\x56\x00\xfd\xff\x4d\x00\x70\x00\xfb\xff\xbe\x00\x4d\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x00\x00\x0f\x00\x70\x00\x00\x00\x70\x00\x00\x00\x36\x00\x70\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00"# - -happyGotoOffsets :: HappyAddr -happyGotoOffsets = HappyA# "\x05\x00\x00\x00\x00\x00\x00\x00\x7c\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x44\x00\x3c\x00\x1e\x00\x18\x00\x00\x00\x28\x00\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x00\x00\x07\x02\x07\x02\x07\x02\x00\x00\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x57\x04\x7f\x03\x5d\x05\xd8\x01\x00\x00\x43\x05\xf6\x00\x2d\x05\x00\x00\x94\x02\x65\x02\x00\x00\x00\x00\x00\x00\x00\x00\x13\x05\x00\x00\x00\x00\x00\x00\x00\x00\x33\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00\x00\x00\xda\xff\x00\x00\x00\x00\x00\x00\xfd\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x71\x00\x4f\x00\x18\x06\x02\x06\xf9\x05\xea\x05\xe1\x05\xcb\x05\xcd\x04\xb3\x04\x9d\x04\x6e\x04\x3f\x04\x27\x04\x0f\x04\xf7\x03\xdf\x03\xc7\x03\xaf\x03\x00\x00\x50\x03\x21\x03\xf2\x02\xc3\x02\x36\x02\x00\x00\x00\x00\x00\x00\x0a\x00\xb5\x05\x00\x00\x00\x00\x00\x00\x00\x00\x9f\x05\x49\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x01\x00\x00\x00\x00\x00\x00\x89\x05\x46\x00\x7a\x01\xe3\x04\xc7\x00\x85\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4b\x01\x00\x00\x1c\x01\x00\x00\xfa\xff\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x05\x00\x00\x00\x00"# - -happyDefActions :: HappyAddr -happyDefActions = HappyA# "\x8a\xff\x00\x00\xfe\xff\x00\x00\xf3\xff\x89\xff\xef\xff\xed\xff\xeb\xff\xec\xff\xe1\xff\xf8\xff\x84\xff\x84\xff\x84\xff\x00\x00\xf2\xff\x00\x00\x00\x00\xfb\xff\x8c\xff\xdb\xff\x80\xff\xd2\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdc\xff\xde\xff\xdd\xff\xdf\xff\xe0\xff\xea\xff\x00\x00\xa7\xff\xa6\xff\xa5\xff\x95\xff\x83\xff\xcd\xff\xc9\xff\xc7\xff\xc5\xff\xc3\xff\xc1\xff\xbf\xff\xb6\xff\xb4\xff\xb1\xff\xae\xff\xaa\xff\xa8\xff\xa4\xff\xa0\xff\x9e\xff\x9c\xff\x9a\xff\x98\xff\x96\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xff\x00\x00\x00\x00\x00\x00\x90\xff\x00\x00\x00\x00\x92\xff\x91\xff\x8f\xff\x8e\xff\x00\x00\xfd\xff\xfc\xff\xf4\xff\xf6\xff\x00\x00\xd7\xff\xf1\xff\xd6\xff\xd8\xff\xd9\xff\xda\xff\x00\x00\x8d\xff\x88\xff\xf9\xff\xee\xff\x86\xff\x7f\xff\xad\xff\xcb\xff\x00\x00\xcc\xff\x00\x00\x8b\xff\x00\x00\x82\xff\x00\x00\x00\x00\xab\xff\x00\x00\xa4\xff\xac\xff\xc0\xff\x8c\xff\xb5\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\xd3\xff\xd5\xff\xd4\xff\xdb\xff\x00\x00\xe7\xff\xe6\xff\xe8\xff\xe9\xff\x00\x00\xe5\xff\xca\xff\xc8\xff\xc6\xff\xc4\xff\xc2\xff\x00\x00\xb8\xff\xba\xff\xbd\xff\xbc\xff\xbb\xff\xbe\xff\xb9\xff\xb2\xff\xb3\xff\xaf\xff\xb0\xff\xa1\xff\xa2\xff\x9f\xff\x9d\xff\x9b\xff\x99\xff\x97\xff\x00\x00\x00\x00\x94\xff\xa3\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf3\xff\x00\x00\x87\xff\x85\xff\xf0\xff\x00\x00\xd0\xff\x81\xff\x93\xff\x00\x00\xce\xff\x00\x00\xb7\xff\xf1\xff\x00\x00\xe2\xff\xe3\xff\x00\x00\xe4\xff\xf7\xff\xcf\xff\xd1\xff\x00\x00\xa9\xff"# - -happyCheck :: HappyAddr -happyCheck = HappyA# "\xff\xff\x06\x00\x01\x00\x06\x00\x03\x00\x0b\x00\x28\x00\x06\x00\x07\x00\x04\x00\x00\x00\x08\x00\x32\x00\x0c\x00\x00\x00\x08\x00\x14\x00\x08\x00\x09\x00\x07\x00\x00\x00\x12\x00\x0a\x00\x0b\x00\x1c\x00\x0a\x00\x0b\x00\x03\x00\x12\x00\x13\x00\x01\x00\x41\x00\x03\x00\x0b\x00\x14\x00\x06\x00\x03\x00\x11\x00\x2b\x00\x13\x00\x27\x00\x0c\x00\x21\x00\x03\x00\x2b\x00\x15\x00\x2d\x00\x2e\x00\x2f\x00\x06\x00\x31\x00\x32\x00\x33\x00\x30\x00\x03\x00\x36\x00\x37\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x20\x00\x41\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x06\x00\x27\x00\x3e\x00\x2e\x00\x3e\x00\x2b\x00\x03\x00\x2d\x00\x2e\x00\x2f\x00\x35\x00\x31\x00\x32\x00\x33\x00\x33\x00\x03\x00\x36\x00\x37\x00\x01\x00\x19\x00\x03\x00\x0f\x00\x10\x00\x06\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x22\x00\x0c\x00\x2e\x00\x25\x00\x26\x00\x15\x00\x0d\x00\x0e\x00\x2a\x00\x35\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x0e\x00\x0f\x00\x33\x00\x3a\x00\x01\x00\x13\x00\x03\x00\x03\x00\x2f\x00\x06\x00\x33\x00\x24\x00\x2a\x00\x34\x00\x27\x00\x0c\x00\x2e\x00\x29\x00\x2b\x00\x43\x00\x2d\x00\x2e\x00\x2f\x00\x35\x00\x31\x00\x32\x00\x33\x00\x03\x00\x13\x00\x36\x00\x37\x00\x16\x00\x03\x00\x41\x00\x10\x00\x06\x00\x3b\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x0c\x00\x27\x00\x3b\x00\x00\x00\x18\x00\x2b\x00\x2b\x00\x2d\x00\x2e\x00\x2f\x00\x2f\x00\x31\x00\x32\x00\x33\x00\x15\x00\x34\x00\x36\x00\x37\x00\x01\x00\x04\x00\x03\x00\x12\x00\x13\x00\x06\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x2d\x00\x0c\x00\x05\x00\x2b\x00\x31\x00\x2d\x00\x0d\x00\x39\x00\x06\x00\x31\x00\x32\x00\x33\x00\x1d\x00\x09\x00\x36\x00\x37\x00\x0c\x00\x03\x00\x06\x00\x3c\x00\x06\x00\x2c\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x0c\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x2b\x00\x0c\x00\x2d\x00\x41\x00\x07\x00\x19\x00\x31\x00\x32\x00\x33\x00\x3b\x00\x28\x00\x36\x00\x37\x00\x2b\x00\x22\x00\x13\x00\x16\x00\x25\x00\x26\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x41\x00\x38\x00\x2b\x00\x3b\x00\x00\x00\x01\x00\x02\x00\x03\x00\x1d\x00\x3e\x00\x3f\x00\x40\x00\x41\x00\x3b\x00\x37\x00\x03\x00\x03\x00\x41\x00\x3d\x00\x3a\x00\x03\x00\x3e\x00\x3f\x00\x40\x00\x41\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\x11\x00\x2c\x00\x41\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x2b\x00\x2b\x00\x35\x00\x10\x00\x2f\x00\x2f\x00\x15\x00\x2d\x00\x18\x00\x34\x00\x34\x00\x31\x00\x04\x00\x0d\x00\x05\x00\x3c\x00\x39\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\x1d\x00\x2c\x00\x1b\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x30\x00\x41\x00\x35\x00\x11\x00\x34\x00\x35\x00\x23\x00\x1c\x00\x41\x00\x39\x00\x3e\x00\x43\x00\xff\xff\xff\xff\x3e\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x15\x00\xff\xff\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\x35\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\x02\x00\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\x17\x00\xff\xff\xff\xff\x1a\x00\x35\x00\x1c\x00\xff\xff\x1e\x00\x1f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\x2c\x00\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x32\x00\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\x15\x00\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x03\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\x15\x00\x2e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\x35\x00\x15\x00\x2e\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x35\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\x15\x00\x35\x00\xff\xff\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\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"# - -happyTable :: HappyAddr -happyTable = HappyA# "\x00\x00\x41\x00\x3f\x00\x94\x00\x40\x00\xc9\x00\x69\x00\x41\x00\x42\x00\x03\x00\x52\x00\x7a\x00\xb6\x00\x43\x00\x8a\x00\x8d\x00\xc6\x00\x56\x00\x57\x00\xb0\x00\x1b\x00\x7b\x00\x78\x00\x79\x00\xc7\x00\x78\x00\x79\x00\x14\x00\x94\x00\x54\x00\x3f\x00\x14\x00\x40\x00\x5c\x00\x8b\x00\x41\x00\x22\x00\x1c\x00\x45\x00\x1d\x00\x44\x00\x43\x00\x58\x00\x12\x00\x45\x00\x15\x00\x46\x00\x47\x00\x48\x00\x41\x00\x49\x00\x4a\x00\x4b\x00\x04\x00\x14\x00\x4c\x00\x4d\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x50\x00\x14\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x0d\x00\x44\x00\x03\x00\x16\x00\x03\x00\x45\x00\x64\x00\x46\x00\x47\x00\x48\x00\x17\x00\x49\x00\x4a\x00\x4b\x00\x18\x00\x14\x00\x4c\x00\x4d\x00\x3f\x00\x0e\x00\x40\x00\xc3\x00\xc4\x00\x41\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x0f\x00\x43\x00\x16\x00\x10\x00\x11\x00\x27\x00\x8d\x00\x8e\x00\x12\x00\x5e\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x90\x00\x91\x00\x19\x00\x5e\x00\x3f\x00\x92\x00\x40\x00\x64\x00\x66\x00\x41\x00\x1a\x00\x51\x00\xac\x00\xbd\x00\x44\x00\x43\x00\x16\x00\xcd\x00\x45\x00\xfa\xff\x46\x00\x47\x00\x48\x00\x17\x00\x49\x00\x4a\x00\x4b\x00\x59\x00\x8b\xff\x4c\x00\x4d\x00\x8b\xff\x40\x00\x14\x00\x73\x00\x41\x00\xc0\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x43\x00\x44\x00\xc2\x00\x52\x00\x75\x00\x45\x00\xad\x00\x46\x00\x47\x00\x48\x00\x66\x00\x49\x00\x4a\x00\x4b\x00\x74\x00\x67\x00\x4c\x00\x4d\x00\x3f\x00\x76\x00\x40\x00\x53\x00\x54\x00\x41\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x5a\x00\x43\x00\x86\x00\x45\x00\xb8\x00\x46\x00\x77\x00\x87\x00\x41\x00\x49\x00\x4a\x00\x4b\x00\x89\x00\x7c\x00\x4c\x00\x4d\x00\x7d\x00\x40\x00\x0d\x00\x88\x00\x41\x00\x9b\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x43\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x45\x00\xb9\x00\x46\x00\x14\x00\xb1\x00\x0e\x00\x49\x00\x4a\x00\x4b\x00\xaf\x00\x72\x00\x4c\x00\x4d\x00\x45\x00\x0f\x00\xb3\x00\xb4\x00\x10\x00\x11\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x14\x00\xb6\x00\x45\x00\xb5\x00\x24\x00\x25\x00\x26\x00\x14\x00\x89\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\xb8\x00\x4d\x00\x64\x00\x64\x00\x14\x00\xbb\x00\x5e\x00\x59\x00\x03\x00\x4e\x00\x4f\x00\x14\x00\x27\x00\xc8\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\x24\x00\x3d\x00\x14\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\xb1\x00\x65\x00\x17\x00\x73\x00\x66\x00\x66\x00\x74\x00\x5a\x00\x75\x00\x67\x00\x67\x00\x5b\x00\x76\x00\x77\x00\x86\x00\x88\x00\x87\x00\x27\x00\xca\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\x89\x00\x3d\x00\x8a\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x1f\x00\x14\x00\x17\x00\x24\x00\x20\x00\x21\x00\x52\x00\x59\x00\x14\x00\x22\x00\x03\x00\xff\xff\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x27\x00\xcb\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\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\xbc\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\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\xc0\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\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x6a\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\x6b\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\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\x00\x00\x3d\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x00\x00\x00\x00\x95\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x00\x00\x00\x00\x60\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x00\x00\x00\x00\x62\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x00\x00\x00\x00\x00\x00\x96\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x97\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\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\x00\x00\x61\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x00\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x6d\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\xc2\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9b\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9c\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9d\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9e\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x9f\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\xa0\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\x00\x00\x61\x00\x27\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x6e\x00\x00\x00\x17\x00\xa1\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\x00\x00\x61\x00\x27\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x70\x00\x27\x00\x00\x00\x16\x00\x66\x00\x00\x00\x00\x00\x00\x00\x00\x00\x67\x00\x17\x00\x00\x00\xa2\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x24\x00\x25\x00\x26\x00\x14\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\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\xa4\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\xbb\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x5f\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x69\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x27\x00\x24\x00\x25\x00\x26\x00\x14\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6c\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x00\x00\x00\x00\x7e\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\xcd\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x80\x00\x17\x00\x81\x00\x00\x00\x82\x00\x83\x00\xbe\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x85\x00\x00\x00\x00\x00\x00\x00\xc7\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x92\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\xa6\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x27\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x27\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\xa7\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x27\x00\x16\x00\xa8\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x17\x00\x27\x00\x16\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x17\x00\xa9\x00\x3a\x00\x3b\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\x00\x00\x00\x00\x00\xaa\x00\x3b\x00\x3c\x00\x27\x00\x17\x00\x00\x00\x16\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\xab\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x16\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"# - -happyReduceArr = Happy_Data_Array.array (1, 128) [ - (1 , happyReduce_1), - (2 , happyReduce_2), - (3 , happyReduce_3), - (4 , happyReduce_4), - (5 , happyReduce_5), - (6 , happyReduce_6), - (7 , happyReduce_7), - (8 , happyReduce_8), - (9 , happyReduce_9), - (10 , happyReduce_10), - (11 , happyReduce_11), - (12 , happyReduce_12), - (13 , happyReduce_13), - (14 , happyReduce_14), - (15 , happyReduce_15), - (16 , happyReduce_16), - (17 , happyReduce_17), - (18 , happyReduce_18), - (19 , happyReduce_19), - (20 , happyReduce_20), - (21 , happyReduce_21), - (22 , happyReduce_22), - (23 , happyReduce_23), - (24 , happyReduce_24), - (25 , happyReduce_25), - (26 , happyReduce_26), - (27 , happyReduce_27), - (28 , happyReduce_28), - (29 , happyReduce_29), - (30 , happyReduce_30), - (31 , happyReduce_31), - (32 , happyReduce_32), - (33 , happyReduce_33), - (34 , happyReduce_34), - (35 , happyReduce_35), - (36 , happyReduce_36), - (37 , happyReduce_37), - (38 , happyReduce_38), - (39 , happyReduce_39), - (40 , happyReduce_40), - (41 , happyReduce_41), - (42 , happyReduce_42), - (43 , happyReduce_43), - (44 , happyReduce_44), - (45 , happyReduce_45), - (46 , happyReduce_46), - (47 , happyReduce_47), - (48 , happyReduce_48), - (49 , happyReduce_49), - (50 , happyReduce_50), - (51 , happyReduce_51), - (52 , happyReduce_52), - (53 , happyReduce_53), - (54 , happyReduce_54), - (55 , happyReduce_55), - (56 , happyReduce_56), - (57 , happyReduce_57), - (58 , happyReduce_58), - (59 , happyReduce_59), - (60 , happyReduce_60), - (61 , happyReduce_61), - (62 , happyReduce_62), - (63 , happyReduce_63), - (64 , happyReduce_64), - (65 , happyReduce_65), - (66 , happyReduce_66), - (67 , happyReduce_67), - (68 , happyReduce_68), - (69 , happyReduce_69), - (70 , happyReduce_70), - (71 , happyReduce_71), - (72 , happyReduce_72), - (73 , happyReduce_73), - (74 , happyReduce_74), - (75 , happyReduce_75), - (76 , happyReduce_76), - (77 , happyReduce_77), - (78 , happyReduce_78), - (79 , happyReduce_79), - (80 , happyReduce_80), - (81 , happyReduce_81), - (82 , happyReduce_82), - (83 , happyReduce_83), - (84 , happyReduce_84), - (85 , happyReduce_85), - (86 , happyReduce_86), - (87 , happyReduce_87), - (88 , happyReduce_88), - (89 , happyReduce_89), - (90 , happyReduce_90), - (91 , happyReduce_91), - (92 , happyReduce_92), - (93 , happyReduce_93), - (94 , happyReduce_94), - (95 , happyReduce_95), - (96 , happyReduce_96), - (97 , happyReduce_97), - (98 , happyReduce_98), - (99 , happyReduce_99), - (100 , happyReduce_100), - (101 , happyReduce_101), - (102 , happyReduce_102), - (103 , happyReduce_103), - (104 , happyReduce_104), - (105 , happyReduce_105), - (106 , happyReduce_106), - (107 , happyReduce_107), - (108 , happyReduce_108), - (109 , happyReduce_109), - (110 , happyReduce_110), - (111 , happyReduce_111), - (112 , happyReduce_112), - (113 , happyReduce_113), - (114 , happyReduce_114), - (115 , happyReduce_115), - (116 , happyReduce_116), - (117 , happyReduce_117), - (118 , happyReduce_118), - (119 , happyReduce_119), - (120 , happyReduce_120), - (121 , happyReduce_121), - (122 , happyReduce_122), - (123 , happyReduce_123), - (124 , happyReduce_124), - (125 , happyReduce_125), - (126 , happyReduce_126), - (127 , happyReduce_127), - (128 , happyReduce_128) - ] - -happy_n_terms = 68 :: Int -happy_n_nonterms = 54 :: Int - -happyReduce_1 = happySpecReduce_1 0# happyReduction_1 -happyReduction_1 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn4 - (PosInteger (mkPosToken happy_var_1) - )} - -happyReduce_2 = happySpecReduce_1 1# happyReduction_2 -happyReduction_2 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn5 - (PosDouble (mkPosToken happy_var_1) - )} - -happyReduce_3 = happySpecReduce_1 2# happyReduction_3 -happyReduction_3 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn6 - (PosString (mkPosToken happy_var_1) - )} - -happyReduce_4 = happySpecReduce_1 3# happyReduction_4 -happyReduction_4 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn7 - (PosIdent (mkPosToken happy_var_1) - )} - -happyReduce_5 = happySpecReduce_1 4# happyReduction_5 -happyReduction_5 happy_x_1 - = case happyOut52 happy_x_1 of { happy_var_1 -> - happyIn8 - (Module ((mkCatSpan happy_var_1)) (reverse happy_var_1) - )} - -happyReduce_6 = happyReduce 4# 5# happyReduction_6 -happyReduction_6 (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 happyOut7 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - case happyOut53 happy_x_4 of { happy_var_4 -> - happyIn9 - (EnumDecl ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4 - ) `HappyStk` happyRest}}}} - -happyReduce_7 = happySpecReduce_1 5# happyReduction_7 -happyReduction_7 happy_x_1 - = case happyOut16 happy_x_1 of { happy_var_1 -> - happyIn9 - (ElementDecl ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_8 = happyReduce 7# 6# happyReduction_8 -happyReduction_8 (happy_x_7 `HappyStk` - happy_x_6 `HappyStk` - happy_x_5 `HappyStk` - happy_x_4 `HappyStk` - happy_x_3 `HappyStk` - happy_x_2 `HappyStk` - happy_x_1 `HappyStk` - happyRest) - = case happyOut14 happy_x_1 of { happy_var_1 -> - case happyOut21 happy_x_2 of { happy_var_2 -> - case happyOut7 happy_x_3 of { happy_var_3 -> - case happyOut17 happy_x_4 of { happy_var_4 -> - case happyOut22 happy_x_5 of { happy_var_5 -> - case happyOut19 happy_x_6 of { happy_var_6 -> - case happyOut15 happy_x_7 of { happy_var_7 -> - happyIn10 - (Clafer ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkCatSpan happy_var_5) >- (mkCatSpan happy_var_6) >- (mkCatSpan happy_var_7)) happy_var_1 happy_var_2 happy_var_3 happy_var_4 happy_var_5 happy_var_6 happy_var_7 - ) `HappyStk` happyRest}}}}}}} - -happyReduce_9 = happySpecReduce_3 7# happyReduction_9 -happyReduction_9 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut55 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - happyIn11 - (Constraint ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2) - )}}} - -happyReduce_10 = happySpecReduce_3 8# happyReduction_10 -happyReduction_10 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut55 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - happyIn12 - (SoftConstraint ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2) - )}}} - -happyReduce_11 = happySpecReduce_3 9# happyReduction_11 -happyReduction_11 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut55 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - happyIn13 - (Goal ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2) - )}}} - -happyReduce_12 = happySpecReduce_0 10# happyReduction_12 -happyReduction_12 = happyIn14 - (AbstractEmpty noSpan - ) - -happyReduce_13 = happySpecReduce_1 10# happyReduction_13 -happyReduction_13 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn14 - (Abstract ((mkTokenSpan happy_var_1)) - )} - -happyReduce_14 = happySpecReduce_0 11# happyReduction_14 -happyReduction_14 = happyIn15 - (ElementsEmpty noSpan - ) - -happyReduce_15 = happySpecReduce_3 11# happyReduction_15 -happyReduction_15 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut54 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - happyIn15 - (ElementsList ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2) - )}}} - -happyReduce_16 = happySpecReduce_1 12# happyReduction_16 -happyReduction_16 happy_x_1 - = case happyOut10 happy_x_1 of { happy_var_1 -> - happyIn16 - (Subclafer ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_17 = happyReduce 4# 12# happyReduction_17 -happyReduction_17 (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 happyOut25 happy_x_2 of { happy_var_2 -> - case happyOut22 happy_x_3 of { happy_var_3 -> - case happyOut15 happy_x_4 of { happy_var_4 -> - happyIn16 - (ClaferUse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_3 happy_var_4 - ) `HappyStk` happyRest}}}} - -happyReduce_18 = happySpecReduce_1 12# happyReduction_18 -happyReduction_18 happy_x_1 - = case happyOut11 happy_x_1 of { happy_var_1 -> - happyIn16 - (Subconstraint ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_19 = happySpecReduce_1 12# happyReduction_19 -happyReduction_19 happy_x_1 - = case happyOut13 happy_x_1 of { happy_var_1 -> - happyIn16 - (Subgoal ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_20 = happySpecReduce_1 12# happyReduction_20 -happyReduction_20 happy_x_1 - = case happyOut12 happy_x_1 of { happy_var_1 -> - happyIn16 - (Subsoftconstraint ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_21 = happySpecReduce_0 13# happyReduction_21 -happyReduction_21 = happyIn17 - (SuperEmpty noSpan - ) - -happyReduce_22 = happySpecReduce_2 13# happyReduction_22 -happyReduction_22 happy_x_2 - happy_x_1 - = case happyOut18 happy_x_1 of { happy_var_1 -> - case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn17 - (SuperSome ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2 - )}} - -happyReduce_23 = happySpecReduce_1 14# happyReduction_23 -happyReduction_23 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn18 - (SuperColon ((mkTokenSpan happy_var_1)) - )} - -happyReduce_24 = happySpecReduce_1 14# happyReduction_24 -happyReduction_24 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn18 - (SuperArrow ((mkTokenSpan happy_var_1)) - )} - -happyReduce_25 = happySpecReduce_1 14# happyReduction_25 -happyReduction_25 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn18 - (SuperMArrow ((mkTokenSpan happy_var_1)) - )} - -happyReduce_26 = happySpecReduce_0 15# happyReduction_26 -happyReduction_26 = happyIn19 - (InitEmpty noSpan - ) - -happyReduce_27 = happySpecReduce_2 15# happyReduction_27 -happyReduction_27 happy_x_2 - happy_x_1 - = case happyOut20 happy_x_1 of { happy_var_1 -> - case happyOut26 happy_x_2 of { happy_var_2 -> - happyIn19 - (InitSome ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2 - )}} - -happyReduce_28 = happySpecReduce_1 16# happyReduction_28 -happyReduction_28 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn20 - (InitHow_1 ((mkTokenSpan happy_var_1)) - )} - -happyReduce_29 = happySpecReduce_1 16# happyReduction_29 -happyReduction_29 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn20 - (InitHow_2 ((mkTokenSpan happy_var_1)) - )} - -happyReduce_30 = happySpecReduce_0 17# happyReduction_30 -happyReduction_30 = happyIn21 - (GCardEmpty noSpan - ) - -happyReduce_31 = happySpecReduce_1 17# happyReduction_31 -happyReduction_31 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn21 - (GCardXor ((mkTokenSpan happy_var_1)) - )} - -happyReduce_32 = happySpecReduce_1 17# happyReduction_32 -happyReduction_32 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn21 - (GCardOr ((mkTokenSpan happy_var_1)) - )} - -happyReduce_33 = happySpecReduce_1 17# happyReduction_33 -happyReduction_33 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn21 - (GCardMux ((mkTokenSpan happy_var_1)) - )} - -happyReduce_34 = happySpecReduce_1 17# happyReduction_34 -happyReduction_34 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn21 - (GCardOpt ((mkTokenSpan happy_var_1)) - )} - -happyReduce_35 = happySpecReduce_1 17# happyReduction_35 -happyReduction_35 happy_x_1 - = case happyOut23 happy_x_1 of { happy_var_1 -> - happyIn21 - (GCardInterval ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_36 = happySpecReduce_0 18# happyReduction_36 -happyReduction_36 = happyIn22 - (CardEmpty noSpan - ) - -happyReduce_37 = happySpecReduce_1 18# happyReduction_37 -happyReduction_37 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn22 - (CardLone ((mkTokenSpan happy_var_1)) - )} - -happyReduce_38 = happySpecReduce_1 18# happyReduction_38 -happyReduction_38 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn22 - (CardSome ((mkTokenSpan happy_var_1)) - )} - -happyReduce_39 = happySpecReduce_1 18# happyReduction_39 -happyReduction_39 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn22 - (CardAny ((mkTokenSpan happy_var_1)) - )} - -happyReduce_40 = happySpecReduce_1 18# happyReduction_40 -happyReduction_40 happy_x_1 - = case happyOut4 happy_x_1 of { happy_var_1 -> - happyIn22 - (CardNum ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_41 = happySpecReduce_1 18# happyReduction_41 -happyReduction_41 happy_x_1 - = case happyOut23 happy_x_1 of { happy_var_1 -> - happyIn22 - (CardInterval ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_42 = happySpecReduce_3 19# happyReduction_42 -happyReduction_42 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut4 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut24 happy_x_3 of { happy_var_3 -> - happyIn23 - (NCard ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_43 = happySpecReduce_1 20# happyReduction_43 -happyReduction_43 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn24 - (ExIntegerAst ((mkTokenSpan happy_var_1)) - )} - -happyReduce_44 = happySpecReduce_1 20# happyReduction_44 -happyReduction_44 happy_x_1 - = case happyOut4 happy_x_1 of { happy_var_1 -> - happyIn24 - (ExIntegerNum ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_45 = happySpecReduce_1 21# happyReduction_45 -happyReduction_45 happy_x_1 - = case happyOut57 happy_x_1 of { happy_var_1 -> - happyIn25 - (Path ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_46 = happyReduce 5# 22# happyReduction_46 -happyReduction_46 (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 happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut47 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { happy_var_4 -> - case happyOut26 happy_x_5 of { happy_var_5 -> - happyIn26 - (DeclAllDisj ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_3 happy_var_5 - ) `HappyStk` happyRest}}}}} - -happyReduce_47 = happyReduce 4# 22# happyReduction_47 -happyReduction_47 (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 happyOut47 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - case happyOut26 happy_x_4 of { happy_var_4 -> - happyIn26 - (DeclAll ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4 - ) `HappyStk` happyRest}}}} - -happyReduce_48 = happyReduce 5# 22# happyReduction_48 -happyReduction_48 (happy_x_5 `HappyStk` - happy_x_4 `HappyStk` - happy_x_3 `HappyStk` - happy_x_2 `HappyStk` - happy_x_1 `HappyStk` - happyRest) - = case happyOut48 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut47 happy_x_3 of { happy_var_3 -> - case happyOutTok happy_x_4 of { happy_var_4 -> - case happyOut26 happy_x_5 of { happy_var_5 -> - happyIn26 - (DeclQuantDisj ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_1 happy_var_3 happy_var_5 - ) `HappyStk` happyRest}}}}} - -happyReduce_49 = happyReduce 4# 22# happyReduction_49 -happyReduction_49 (happy_x_4 `HappyStk` - happy_x_3 `HappyStk` - happy_x_2 `HappyStk` - happy_x_1 `HappyStk` - happyRest) - = case happyOut48 happy_x_1 of { happy_var_1 -> - case happyOut47 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - case happyOut26 happy_x_4 of { happy_var_4 -> - happyIn26 - (DeclQuant ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_2 happy_var_4 - ) `HappyStk` happyRest}}}} - -happyReduce_50 = happySpecReduce_1 22# happyReduction_50 -happyReduction_50 happy_x_1 - = case happyOut27 happy_x_1 of { happy_var_1 -> - happyIn26 - (happy_var_1 - )} - -happyReduce_51 = happySpecReduce_2 23# happyReduction_51 -happyReduction_51 happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut28 happy_x_2 of { happy_var_2 -> - happyIn27 - (EGMax ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 - )}} - -happyReduce_52 = happySpecReduce_2 23# happyReduction_52 -happyReduction_52 happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut28 happy_x_2 of { happy_var_2 -> - happyIn27 - (EGMin ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 - )}} - -happyReduce_53 = happySpecReduce_3 23# happyReduction_53 -happyReduction_53 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut27 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut28 happy_x_3 of { happy_var_3 -> - happyIn27 - (EIff ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_54 = happySpecReduce_1 23# happyReduction_54 -happyReduction_54 happy_x_1 - = case happyOut28 happy_x_1 of { happy_var_1 -> - happyIn27 - (happy_var_1 - )} - -happyReduce_55 = happySpecReduce_3 24# happyReduction_55 -happyReduction_55 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut28 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut29 happy_x_3 of { happy_var_3 -> - happyIn28 - (EImplies ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_56 = happySpecReduce_1 24# happyReduction_56 -happyReduction_56 happy_x_1 - = case happyOut29 happy_x_1 of { happy_var_1 -> - happyIn28 - (happy_var_1 - )} - -happyReduce_57 = happySpecReduce_3 25# happyReduction_57 -happyReduction_57 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut29 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut30 happy_x_3 of { happy_var_3 -> - happyIn29 - (EOr ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_58 = happySpecReduce_1 25# happyReduction_58 -happyReduction_58 happy_x_1 - = case happyOut30 happy_x_1 of { happy_var_1 -> - happyIn29 - (happy_var_1 - )} - -happyReduce_59 = happySpecReduce_3 26# happyReduction_59 -happyReduction_59 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut30 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut31 happy_x_3 of { happy_var_3 -> - happyIn30 - (EXor ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_60 = happySpecReduce_1 26# happyReduction_60 -happyReduction_60 happy_x_1 - = case happyOut31 happy_x_1 of { happy_var_1 -> - happyIn30 - (happy_var_1 - )} - -happyReduce_61 = happySpecReduce_3 27# happyReduction_61 -happyReduction_61 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut31 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut32 happy_x_3 of { happy_var_3 -> - happyIn31 - (EAnd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_62 = happySpecReduce_1 27# happyReduction_62 -happyReduction_62 happy_x_1 - = case happyOut32 happy_x_1 of { happy_var_1 -> - happyIn31 - (happy_var_1 - )} - -happyReduce_63 = happySpecReduce_2 28# happyReduction_63 -happyReduction_63 happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut33 happy_x_2 of { happy_var_2 -> - happyIn32 - (ENeg ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 - )}} - -happyReduce_64 = happySpecReduce_1 28# happyReduction_64 -happyReduction_64 happy_x_1 - = case happyOut33 happy_x_1 of { happy_var_1 -> - happyIn32 - (happy_var_1 - )} - -happyReduce_65 = happySpecReduce_3 29# happyReduction_65 -happyReduction_65 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut34 happy_x_3 of { happy_var_3 -> - happyIn33 - (ELt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_66 = happySpecReduce_3 29# happyReduction_66 -happyReduction_66 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut34 happy_x_3 of { happy_var_3 -> - happyIn33 - (EGt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_67 = happySpecReduce_3 29# happyReduction_67 -happyReduction_67 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut34 happy_x_3 of { happy_var_3 -> - happyIn33 - (EEq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_68 = happySpecReduce_3 29# happyReduction_68 -happyReduction_68 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut34 happy_x_3 of { happy_var_3 -> - happyIn33 - (ELte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_69 = happySpecReduce_3 29# happyReduction_69 -happyReduction_69 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut34 happy_x_3 of { happy_var_3 -> - happyIn33 - (EGte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_70 = happySpecReduce_3 29# happyReduction_70 -happyReduction_70 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut34 happy_x_3 of { happy_var_3 -> - happyIn33 - (ENeq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_71 = happySpecReduce_3 29# happyReduction_71 -happyReduction_71 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut34 happy_x_3 of { happy_var_3 -> - happyIn33 - (EIn ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_72 = happyReduce 4# 29# happyReduction_72 -happyReduction_72 (happy_x_4 `HappyStk` - happy_x_3 `HappyStk` - happy_x_2 `HappyStk` - happy_x_1 `HappyStk` - happyRest) - = case happyOut33 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - case happyOut34 happy_x_4 of { happy_var_4 -> - happyIn33 - (ENin ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_4 - ) `HappyStk` happyRest}}}} - -happyReduce_73 = happySpecReduce_1 29# happyReduction_73 -happyReduction_73 happy_x_1 - = case happyOut34 happy_x_1 of { happy_var_1 -> - happyIn33 - (happy_var_1 - )} - -happyReduce_74 = happySpecReduce_2 30# happyReduction_74 -happyReduction_74 happy_x_2 - happy_x_1 - = case happyOut48 happy_x_1 of { happy_var_1 -> - case happyOut38 happy_x_2 of { happy_var_2 -> - happyIn34 - (QuantExp ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2 - )}} - -happyReduce_75 = happySpecReduce_1 30# happyReduction_75 -happyReduction_75 happy_x_1 - = case happyOut35 happy_x_1 of { happy_var_1 -> - happyIn34 - (happy_var_1 - )} - -happyReduce_76 = happySpecReduce_3 31# happyReduction_76 -happyReduction_76 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut35 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut36 happy_x_3 of { happy_var_3 -> - happyIn35 - (EAdd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_77 = happySpecReduce_3 31# happyReduction_77 -happyReduction_77 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut35 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut36 happy_x_3 of { happy_var_3 -> - happyIn35 - (ESub ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_78 = happySpecReduce_1 31# happyReduction_78 -happyReduction_78 happy_x_1 - = case happyOut36 happy_x_1 of { happy_var_1 -> - happyIn35 - (happy_var_1 - )} - -happyReduce_79 = happySpecReduce_3 32# happyReduction_79 -happyReduction_79 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut36 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn36 - (EMul ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_80 = happySpecReduce_3 32# happyReduction_80 -happyReduction_80 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut36 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut37 happy_x_3 of { happy_var_3 -> - happyIn36 - (EDiv ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_81 = happySpecReduce_1 32# happyReduction_81 -happyReduction_81 happy_x_1 - = case happyOut37 happy_x_1 of { happy_var_1 -> - happyIn36 - (happy_var_1 - )} - -happyReduce_82 = happySpecReduce_2 33# happyReduction_82 -happyReduction_82 happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut38 happy_x_2 of { happy_var_2 -> - happyIn37 - (ESumSetExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 - )}} - -happyReduce_83 = happySpecReduce_2 33# happyReduction_83 -happyReduction_83 happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut38 happy_x_2 of { happy_var_2 -> - happyIn37 - (ECSetExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 - )}} - -happyReduce_84 = happySpecReduce_2 33# happyReduction_84 -happyReduction_84 happy_x_2 - happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut38 happy_x_2 of { happy_var_2 -> - happyIn37 - (EMinExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 - )}} - -happyReduce_85 = happySpecReduce_1 33# happyReduction_85 -happyReduction_85 happy_x_1 - = case happyOut38 happy_x_1 of { happy_var_1 -> - happyIn37 - (happy_var_1 - )} - -happyReduce_86 = happyReduce 6# 34# happyReduction_86 -happyReduction_86 (happy_x_6 `HappyStk` - happy_x_5 `HappyStk` - happy_x_4 `HappyStk` - happy_x_3 `HappyStk` - happy_x_2 `HappyStk` - happy_x_1 `HappyStk` - happyRest) - = case happyOutTok happy_x_1 of { happy_var_1 -> - case happyOut38 happy_x_2 of { happy_var_2 -> - case happyOutTok happy_x_3 of { happy_var_3 -> - case happyOut38 happy_x_4 of { happy_var_4 -> - case happyOutTok happy_x_5 of { happy_var_5 -> - case happyOut39 happy_x_6 of { happy_var_6 -> - happyIn38 - (EImpliesElse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkTokenSpan happy_var_5) >- (mkCatSpan happy_var_6)) happy_var_2 happy_var_4 happy_var_6 - ) `HappyStk` happyRest}}}}}} - -happyReduce_87 = happySpecReduce_1 34# happyReduction_87 -happyReduction_87 happy_x_1 - = case happyOut39 happy_x_1 of { happy_var_1 -> - happyIn38 - (happy_var_1 - )} - -happyReduce_88 = happySpecReduce_1 35# happyReduction_88 -happyReduction_88 happy_x_1 - = case happyOut4 happy_x_1 of { happy_var_1 -> - happyIn39 - (EInt ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_89 = happySpecReduce_1 35# happyReduction_89 -happyReduction_89 happy_x_1 - = case happyOut5 happy_x_1 of { happy_var_1 -> - happyIn39 - (EDouble ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_90 = happySpecReduce_1 35# happyReduction_90 -happyReduction_90 happy_x_1 - = case happyOut6 happy_x_1 of { happy_var_1 -> - happyIn39 - (EStr ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_91 = happySpecReduce_1 35# happyReduction_91 -happyReduction_91 happy_x_1 - = case happyOut40 happy_x_1 of { happy_var_1 -> - happyIn39 - (ESetExp ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_92 = happySpecReduce_3 35# happyReduction_92 -happyReduction_92 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut26 happy_x_2 of { happy_var_2 -> - happyIn39 - (happy_var_2 - )} - -happyReduce_93 = happySpecReduce_3 36# happyReduction_93 -happyReduction_93 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut40 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut41 happy_x_3 of { happy_var_3 -> - happyIn40 - (Union ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_94 = happySpecReduce_3 36# happyReduction_94 -happyReduction_94 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut40 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut41 happy_x_3 of { happy_var_3 -> - happyIn40 - (UnionCom ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_95 = happySpecReduce_1 36# happyReduction_95 -happyReduction_95 happy_x_1 - = case happyOut41 happy_x_1 of { happy_var_1 -> - happyIn40 - (happy_var_1 - )} - -happyReduce_96 = happySpecReduce_3 37# happyReduction_96 -happyReduction_96 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut41 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut42 happy_x_3 of { happy_var_3 -> - happyIn41 - (Difference ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_97 = happySpecReduce_1 37# happyReduction_97 -happyReduction_97 happy_x_1 - = case happyOut42 happy_x_1 of { happy_var_1 -> - happyIn41 - (happy_var_1 - )} - -happyReduce_98 = happySpecReduce_3 38# happyReduction_98 -happyReduction_98 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut42 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut43 happy_x_3 of { happy_var_3 -> - happyIn42 - (Intersection ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_99 = happySpecReduce_1 38# happyReduction_99 -happyReduction_99 happy_x_1 - = case happyOut43 happy_x_1 of { happy_var_1 -> - happyIn42 - (happy_var_1 - )} - -happyReduce_100 = happySpecReduce_3 39# happyReduction_100 -happyReduction_100 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut43 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut44 happy_x_3 of { happy_var_3 -> - happyIn43 - (Domain ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_101 = happySpecReduce_1 39# happyReduction_101 -happyReduction_101 happy_x_1 - = case happyOut44 happy_x_1 of { happy_var_1 -> - happyIn43 - (happy_var_1 - )} - -happyReduce_102 = happySpecReduce_3 40# happyReduction_102 -happyReduction_102 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut44 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut45 happy_x_3 of { happy_var_3 -> - happyIn44 - (Range ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_103 = happySpecReduce_1 40# happyReduction_103 -happyReduction_103 happy_x_1 - = case happyOut45 happy_x_1 of { happy_var_1 -> - happyIn44 - (happy_var_1 - )} - -happyReduce_104 = happySpecReduce_3 41# happyReduction_104 -happyReduction_104 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut45 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut46 happy_x_3 of { happy_var_3 -> - happyIn45 - (Join ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_105 = happySpecReduce_1 41# happyReduction_105 -happyReduction_105 happy_x_1 - = case happyOut46 happy_x_1 of { happy_var_1 -> - happyIn45 - (happy_var_1 - )} - -happyReduce_106 = happySpecReduce_1 42# happyReduction_106 -happyReduction_106 happy_x_1 - = case happyOut25 happy_x_1 of { happy_var_1 -> - happyIn46 - (ClaferId ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_107 = happySpecReduce_3 42# happyReduction_107 -happyReduction_107 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut40 happy_x_2 of { happy_var_2 -> - happyIn46 - (happy_var_2 - )} - -happyReduce_108 = happySpecReduce_3 43# happyReduction_108 -happyReduction_108 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut56 happy_x_1 of { happy_var_1 -> - case happyOutTok happy_x_2 of { happy_var_2 -> - case happyOut40 happy_x_3 of { happy_var_3 -> - happyIn47 - (Decl ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 - )}}} - -happyReduce_109 = happySpecReduce_1 44# happyReduction_109 -happyReduction_109 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn48 - (QuantNo ((mkTokenSpan happy_var_1)) - )} - -happyReduce_110 = happySpecReduce_1 44# happyReduction_110 -happyReduction_110 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn48 - (QuantNot ((mkTokenSpan happy_var_1)) - )} - -happyReduce_111 = happySpecReduce_1 44# happyReduction_111 -happyReduction_111 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn48 - (QuantLone ((mkTokenSpan happy_var_1)) - )} - -happyReduce_112 = happySpecReduce_1 44# happyReduction_112 -happyReduction_112 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn48 - (QuantOne ((mkTokenSpan happy_var_1)) - )} - -happyReduce_113 = happySpecReduce_1 44# happyReduction_113 -happyReduction_113 happy_x_1 - = case happyOutTok happy_x_1 of { happy_var_1 -> - happyIn48 - (QuantSome ((mkTokenSpan happy_var_1)) - )} - -happyReduce_114 = happySpecReduce_1 45# happyReduction_114 -happyReduction_114 happy_x_1 - = case happyOut7 happy_x_1 of { happy_var_1 -> - happyIn49 - (EnumIdIdent ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_115 = happySpecReduce_1 46# happyReduction_115 -happyReduction_115 happy_x_1 - = case happyOut7 happy_x_1 of { happy_var_1 -> - happyIn50 - (ModIdIdent ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_116 = happySpecReduce_1 47# happyReduction_116 -happyReduction_116 happy_x_1 - = case happyOut7 happy_x_1 of { happy_var_1 -> - happyIn51 - (LocIdIdent ((mkCatSpan happy_var_1)) happy_var_1 - )} - -happyReduce_117 = happySpecReduce_0 48# happyReduction_117 -happyReduction_117 = happyIn52 - ([] - ) - -happyReduce_118 = happySpecReduce_2 48# happyReduction_118 -happyReduction_118 happy_x_2 - happy_x_1 - = case happyOut52 happy_x_1 of { happy_var_1 -> - case happyOut9 happy_x_2 of { happy_var_2 -> - happyIn52 - (flip (:) happy_var_1 happy_var_2 - )}} - -happyReduce_119 = happySpecReduce_1 49# happyReduction_119 -happyReduction_119 happy_x_1 - = case happyOut49 happy_x_1 of { happy_var_1 -> - happyIn53 - ((:[]) happy_var_1 - )} - -happyReduce_120 = happySpecReduce_3 49# happyReduction_120 -happyReduction_120 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut49 happy_x_1 of { happy_var_1 -> - case happyOut53 happy_x_3 of { happy_var_3 -> - happyIn53 - ((:) happy_var_1 happy_var_3 - )}} - -happyReduce_121 = happySpecReduce_0 50# happyReduction_121 -happyReduction_121 = happyIn54 - ([] - ) - -happyReduce_122 = happySpecReduce_2 50# happyReduction_122 -happyReduction_122 happy_x_2 - happy_x_1 - = case happyOut54 happy_x_1 of { happy_var_1 -> - case happyOut16 happy_x_2 of { happy_var_2 -> - happyIn54 - (flip (:) happy_var_1 happy_var_2 - )}} - -happyReduce_123 = happySpecReduce_0 51# happyReduction_123 -happyReduction_123 = happyIn55 - ([] - ) - -happyReduce_124 = happySpecReduce_2 51# happyReduction_124 -happyReduction_124 happy_x_2 - happy_x_1 - = case happyOut55 happy_x_1 of { happy_var_1 -> - case happyOut26 happy_x_2 of { happy_var_2 -> - happyIn55 - (flip (:) happy_var_1 happy_var_2 - )}} - -happyReduce_125 = happySpecReduce_1 52# happyReduction_125 -happyReduction_125 happy_x_1 - = case happyOut51 happy_x_1 of { happy_var_1 -> - happyIn56 - ((:[]) happy_var_1 - )} - -happyReduce_126 = happySpecReduce_3 52# happyReduction_126 -happyReduction_126 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut51 happy_x_1 of { happy_var_1 -> - case happyOut56 happy_x_3 of { happy_var_3 -> - happyIn56 - ((:) happy_var_1 happy_var_3 - )}} - -happyReduce_127 = happySpecReduce_1 53# happyReduction_127 -happyReduction_127 happy_x_1 - = case happyOut50 happy_x_1 of { happy_var_1 -> - happyIn57 - ((:[]) happy_var_1 - )} - -happyReduce_128 = happySpecReduce_3 53# happyReduction_128 -happyReduction_128 happy_x_3 - happy_x_2 - happy_x_1 - = case happyOut50 happy_x_1 of { happy_var_1 -> - case happyOut57 happy_x_3 of { happy_var_3 -> - happyIn57 - ((:) happy_var_1 happy_var_3 - )}} - -happyNewToken action sts stk [] = - happyDoAction 67# notHappyAtAll action sts stk [] - -happyNewToken action sts stk (tk:tks) = - let cont i = happyDoAction i tk action sts stk tks in - case tk of { - PT _ (TS _ 1) -> cont 1#; - PT _ (TS _ 2) -> cont 2#; - PT _ (TS _ 3) -> cont 3#; - PT _ (TS _ 4) -> cont 4#; - PT _ (TS _ 5) -> cont 5#; - PT _ (TS _ 6) -> cont 6#; - PT _ (TS _ 7) -> cont 7#; - PT _ (TS _ 8) -> cont 8#; - PT _ (TS _ 9) -> cont 9#; - PT _ (TS _ 10) -> cont 10#; - PT _ (TS _ 11) -> cont 11#; - PT _ (TS _ 12) -> cont 12#; - PT _ (TS _ 13) -> cont 13#; - PT _ (TS _ 14) -> cont 14#; - PT _ (TS _ 15) -> cont 15#; - PT _ (TS _ 16) -> cont 16#; - PT _ (TS _ 17) -> cont 17#; - PT _ (TS _ 18) -> cont 18#; - PT _ (TS _ 19) -> cont 19#; - PT _ (TS _ 20) -> cont 20#; - PT _ (TS _ 21) -> cont 21#; - PT _ (TS _ 22) -> cont 22#; - PT _ (TS _ 23) -> cont 23#; - PT _ (TS _ 24) -> cont 24#; - PT _ (TS _ 25) -> cont 25#; - PT _ (TS _ 26) -> cont 26#; - PT _ (TS _ 27) -> cont 27#; - PT _ (TS _ 28) -> cont 28#; - PT _ (TS _ 29) -> cont 29#; - PT _ (TS _ 30) -> cont 30#; - PT _ (TS _ 31) -> cont 31#; - PT _ (TS _ 32) -> cont 32#; - PT _ (TS _ 33) -> cont 33#; - PT _ (TS _ 34) -> cont 34#; - PT _ (TS _ 35) -> cont 35#; - PT _ (TS _ 36) -> cont 36#; - PT _ (TS _ 37) -> cont 37#; - PT _ (TS _ 38) -> cont 38#; - PT _ (TS _ 39) -> cont 39#; - PT _ (TS _ 40) -> cont 40#; - PT _ (TS _ 41) -> cont 41#; - PT _ (TS _ 42) -> cont 42#; - PT _ (TS _ 43) -> cont 43#; - PT _ (TS _ 44) -> cont 44#; - PT _ (TS _ 45) -> cont 45#; - PT _ (TS _ 46) -> cont 46#; - PT _ (TS _ 47) -> cont 47#; - PT _ (TS _ 48) -> cont 48#; - PT _ (TS _ 49) -> cont 49#; - PT _ (TS _ 50) -> cont 50#; - PT _ (TS _ 51) -> cont 51#; - PT _ (TS _ 52) -> cont 52#; - PT _ (TS _ 53) -> cont 53#; - PT _ (TS _ 54) -> cont 54#; - PT _ (TS _ 55) -> cont 55#; - PT _ (TS _ 56) -> cont 56#; - PT _ (TS _ 57) -> cont 57#; - PT _ (TS _ 58) -> cont 58#; - PT _ (TS _ 59) -> cont 59#; - PT _ (TS _ 60) -> cont 60#; - PT _ (TS _ 61) -> cont 61#; - PT _ (T_PosInteger _) -> cont 62#; - PT _ (T_PosDouble _) -> cont 63#; - PT _ (T_PosString _) -> cont 64#; - PT _ (T_PosIdent _) -> cont 65#; - _ -> cont 66#; - _ -> happyError' (tk:tks) - } - -happyError_ 67# tk tks = happyError' tks -happyError_ _ tk tks = happyError' (tk:tks) - -happyThen :: () => Err a -> (a -> Err b) -> Err b -happyThen = (thenM) -happyReturn :: () => a -> Err a -happyReturn = (returnM) -happyThen1 m k tks = (thenM) m (\a -> k a tks) -happyReturn1 :: () => a -> b -> Err a -happyReturn1 = \a tks -> (returnM) a -happyError' :: () => [(Token)] -> Err a -happyError' = happyError - -pModule tks = happySomeParser where - happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut8 x)) +happyIn8 :: (PosInteger) -> (HappyAbsSyn ) +happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn8 #-} +happyOut8 :: (HappyAbsSyn ) -> (PosInteger) +happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut8 #-} +happyIn9 :: (PosDouble) -> (HappyAbsSyn ) +happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn9 #-} +happyOut9 :: (HappyAbsSyn ) -> (PosDouble) +happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut9 #-} +happyIn10 :: (PosString) -> (HappyAbsSyn ) +happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn10 #-} +happyOut10 :: (HappyAbsSyn ) -> (PosString) +happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut10 #-} +happyIn11 :: (PosIdent) -> (HappyAbsSyn ) +happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn11 #-} +happyOut11 :: (HappyAbsSyn ) -> (PosIdent) +happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut11 #-} +happyIn12 :: (Module) -> (HappyAbsSyn ) +happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn12 #-} +happyOut12 :: (HappyAbsSyn ) -> (Module) +happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut12 #-} +happyIn13 :: (Declaration) -> (HappyAbsSyn ) +happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn13 #-} +happyOut13 :: (HappyAbsSyn ) -> (Declaration) +happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut13 #-} +happyIn14 :: (Clafer) -> (HappyAbsSyn ) +happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn14 #-} +happyOut14 :: (HappyAbsSyn ) -> (Clafer) +happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut14 #-} +happyIn15 :: (Constraint) -> (HappyAbsSyn ) +happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn15 #-} +happyOut15 :: (HappyAbsSyn ) -> (Constraint) +happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut15 #-} +happyIn16 :: (SoftConstraint) -> (HappyAbsSyn ) +happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn16 #-} +happyOut16 :: (HappyAbsSyn ) -> (SoftConstraint) +happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut16 #-} +happyIn17 :: (Goal) -> (HappyAbsSyn ) +happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn17 #-} +happyOut17 :: (HappyAbsSyn ) -> (Goal) +happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut17 #-} +happyIn18 :: (Abstract) -> (HappyAbsSyn ) +happyIn18 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn18 #-} +happyOut18 :: (HappyAbsSyn ) -> (Abstract) +happyOut18 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut18 #-} +happyIn19 :: (Elements) -> (HappyAbsSyn ) +happyIn19 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn19 #-} +happyOut19 :: (HappyAbsSyn ) -> (Elements) +happyOut19 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut19 #-} +happyIn20 :: (Element) -> (HappyAbsSyn ) +happyIn20 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn20 #-} +happyOut20 :: (HappyAbsSyn ) -> (Element) +happyOut20 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut20 #-} +happyIn21 :: (Super) -> (HappyAbsSyn ) +happyIn21 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn21 #-} +happyOut21 :: (HappyAbsSyn ) -> (Super) +happyOut21 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut21 #-} +happyIn22 :: (Reference) -> (HappyAbsSyn ) +happyIn22 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn22 #-} +happyOut22 :: (HappyAbsSyn ) -> (Reference) +happyOut22 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut22 #-} +happyIn23 :: (Init) -> (HappyAbsSyn ) +happyIn23 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn23 #-} +happyOut23 :: (HappyAbsSyn ) -> (Init) +happyOut23 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut23 #-} +happyIn24 :: (InitHow) -> (HappyAbsSyn ) +happyIn24 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn24 #-} +happyOut24 :: (HappyAbsSyn ) -> (InitHow) +happyOut24 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut24 #-} +happyIn25 :: (GCard) -> (HappyAbsSyn ) +happyIn25 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn25 #-} +happyOut25 :: (HappyAbsSyn ) -> (GCard) +happyOut25 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut25 #-} +happyIn26 :: (Card) -> (HappyAbsSyn ) +happyIn26 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn26 #-} +happyOut26 :: (HappyAbsSyn ) -> (Card) +happyOut26 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut26 #-} +happyIn27 :: (NCard) -> (HappyAbsSyn ) +happyIn27 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn27 #-} +happyOut27 :: (HappyAbsSyn ) -> (NCard) +happyOut27 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut27 #-} +happyIn28 :: (ExInteger) -> (HappyAbsSyn ) +happyIn28 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn28 #-} +happyOut28 :: (HappyAbsSyn ) -> (ExInteger) +happyOut28 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut28 #-} +happyIn29 :: (Name) -> (HappyAbsSyn ) +happyIn29 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn29 #-} +happyOut29 :: (HappyAbsSyn ) -> (Name) +happyOut29 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut29 #-} +happyIn30 :: (Exp) -> (HappyAbsSyn ) +happyIn30 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn30 #-} +happyOut30 :: (HappyAbsSyn ) -> (Exp) +happyOut30 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut30 #-} +happyIn31 :: (Exp) -> (HappyAbsSyn ) +happyIn31 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn31 #-} +happyOut31 :: (HappyAbsSyn ) -> (Exp) +happyOut31 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut31 #-} +happyIn32 :: (Exp) -> (HappyAbsSyn ) +happyIn32 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn32 #-} +happyOut32 :: (HappyAbsSyn ) -> (Exp) +happyOut32 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut32 #-} +happyIn33 :: (Exp) -> (HappyAbsSyn ) +happyIn33 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn33 #-} +happyOut33 :: (HappyAbsSyn ) -> (Exp) +happyOut33 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut33 #-} +happyIn34 :: (Exp) -> (HappyAbsSyn ) +happyIn34 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn34 #-} +happyOut34 :: (HappyAbsSyn ) -> (Exp) +happyOut34 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut34 #-} +happyIn35 :: (Exp) -> (HappyAbsSyn ) +happyIn35 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn35 #-} +happyOut35 :: (HappyAbsSyn ) -> (Exp) +happyOut35 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut35 #-} +happyIn36 :: (Exp) -> (HappyAbsSyn ) +happyIn36 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn36 #-} +happyOut36 :: (HappyAbsSyn ) -> (Exp) +happyOut36 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut36 #-} +happyIn37 :: (Exp) -> (HappyAbsSyn ) +happyIn37 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn37 #-} +happyOut37 :: (HappyAbsSyn ) -> (Exp) +happyOut37 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut37 #-} +happyIn38 :: (Exp) -> (HappyAbsSyn ) +happyIn38 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn38 #-} +happyOut38 :: (HappyAbsSyn ) -> (Exp) +happyOut38 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut38 #-} +happyIn39 :: (Exp) -> (HappyAbsSyn ) +happyIn39 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn39 #-} +happyOut39 :: (HappyAbsSyn ) -> (Exp) +happyOut39 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut39 #-} +happyIn40 :: (Exp) -> (HappyAbsSyn ) +happyIn40 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn40 #-} +happyOut40 :: (HappyAbsSyn ) -> (Exp) +happyOut40 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut40 #-} +happyIn41 :: (Exp) -> (HappyAbsSyn ) +happyIn41 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn41 #-} +happyOut41 :: (HappyAbsSyn ) -> (Exp) +happyOut41 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut41 #-} +happyIn42 :: (Exp) -> (HappyAbsSyn ) +happyIn42 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn42 #-} +happyOut42 :: (HappyAbsSyn ) -> (Exp) +happyOut42 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut42 #-} +happyIn43 :: (Exp) -> (HappyAbsSyn ) +happyIn43 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn43 #-} +happyOut43 :: (HappyAbsSyn ) -> (Exp) +happyOut43 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut43 #-} +happyIn44 :: (SetExp) -> (HappyAbsSyn ) +happyIn44 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn44 #-} +happyOut44 :: (HappyAbsSyn ) -> (SetExp) +happyOut44 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut44 #-} +happyIn45 :: (SetExp) -> (HappyAbsSyn ) +happyIn45 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn45 #-} +happyOut45 :: (HappyAbsSyn ) -> (SetExp) +happyOut45 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut45 #-} +happyIn46 :: (SetExp) -> (HappyAbsSyn ) +happyIn46 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn46 #-} +happyOut46 :: (HappyAbsSyn ) -> (SetExp) +happyOut46 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut46 #-} +happyIn47 :: (SetExp) -> (HappyAbsSyn ) +happyIn47 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn47 #-} +happyOut47 :: (HappyAbsSyn ) -> (SetExp) +happyOut47 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut47 #-} +happyIn48 :: (SetExp) -> (HappyAbsSyn ) +happyIn48 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn48 #-} +happyOut48 :: (HappyAbsSyn ) -> (SetExp) +happyOut48 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut48 #-} +happyIn49 :: (SetExp) -> (HappyAbsSyn ) +happyIn49 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn49 #-} +happyOut49 :: (HappyAbsSyn ) -> (SetExp) +happyOut49 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut49 #-} +happyIn50 :: (SetExp) -> (HappyAbsSyn ) +happyIn50 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn50 #-} +happyOut50 :: (HappyAbsSyn ) -> (SetExp) +happyOut50 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut50 #-} +happyIn51 :: (Decl) -> (HappyAbsSyn ) +happyIn51 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn51 #-} +happyOut51 :: (HappyAbsSyn ) -> (Decl) +happyOut51 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut51 #-} +happyIn52 :: (Quant) -> (HappyAbsSyn ) +happyIn52 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn52 #-} +happyOut52 :: (HappyAbsSyn ) -> (Quant) +happyOut52 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut52 #-} +happyIn53 :: (EnumId) -> (HappyAbsSyn ) +happyIn53 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn53 #-} +happyOut53 :: (HappyAbsSyn ) -> (EnumId) +happyOut53 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut53 #-} +happyIn54 :: (ModId) -> (HappyAbsSyn ) +happyIn54 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn54 #-} +happyOut54 :: (HappyAbsSyn ) -> (ModId) +happyOut54 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut54 #-} +happyIn55 :: (LocId) -> (HappyAbsSyn ) +happyIn55 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn55 #-} +happyOut55 :: (HappyAbsSyn ) -> (LocId) +happyOut55 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut55 #-} +happyIn56 :: ([Declaration]) -> (HappyAbsSyn ) +happyIn56 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn56 #-} +happyOut56 :: (HappyAbsSyn ) -> ([Declaration]) +happyOut56 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut56 #-} +happyIn57 :: ([EnumId]) -> (HappyAbsSyn ) +happyIn57 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn57 #-} +happyOut57 :: (HappyAbsSyn ) -> ([EnumId]) +happyOut57 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut57 #-} +happyIn58 :: ([Element]) -> (HappyAbsSyn ) +happyIn58 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn58 #-} +happyOut58 :: (HappyAbsSyn ) -> ([Element]) +happyOut58 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut58 #-} +happyIn59 :: ([Exp]) -> (HappyAbsSyn ) +happyIn59 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn59 #-} +happyOut59 :: (HappyAbsSyn ) -> ([Exp]) +happyOut59 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut59 #-} +happyIn60 :: ([LocId]) -> (HappyAbsSyn ) +happyIn60 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn60 #-} +happyOut60 :: (HappyAbsSyn ) -> ([LocId]) +happyOut60 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut60 #-} +happyIn61 :: ([ModId]) -> (HappyAbsSyn ) +happyIn61 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyIn61 #-} +happyOut61 :: (HappyAbsSyn ) -> ([ModId]) +happyOut61 x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOut61 #-} +happyInTok :: (Token) -> (HappyAbsSyn ) +happyInTok x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyInTok #-} +happyOutTok :: (HappyAbsSyn ) -> (Token) +happyOutTok x = Happy_GHC_Exts.unsafeCoerce# x +{-# INLINE happyOutTok #-} + + +happyActOffsets :: HappyAddr +happyActOffsets = HappyA# "\x00\x00\x71\x01\x5d\x01\x58\x01\x65\x01\x3e\x01\x00\x00\x38\x01\x00\x00\x38\x01\x57\x01\x2d\x01\x00\x00\x2d\x01\x10\x01\x00\x00\x2d\x01\x8b\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x39\x01\x39\x01\x5f\x01\x28\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x00\x00\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4d\x01\x34\x01\x13\x01\x14\x01\x49\x01\x00\x00\xc4\x05\x00\x00\x72\x00\x03\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x3f\x01\x43\x01\x31\x01\x33\x01\x37\x01\x00\x00\xb1\x00\x21\x01\x00\x00\xa4\x00\x26\x00\x6c\x00\x26\x00\x00\x00\xd8\xff\x26\x00\x00\x00\x8d\x00\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x2f\x01\x14\x00\x05\x01\xfc\xff\x11\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xf7\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x0c\x00\x00\x00\x00\x00\x03\x01\x26\x00\x03\x01\xe6\x00\x00\x00\xe1\x00\x08\x01\x07\x01\xd7\x00\x00\x00\x12\x01\xb8\x00\x00\x00\xc4\x05\xd3\x00\x11\x00\x00\x00\xd0\x00\xc8\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x0c\x00\x06\x00\x06\x00\x06\x00\x06\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xa4\x00\xc2\x00\x8d\x00\x8d\x00\x8d\x00\x8d\x00\x8d\x00\xd1\x00\xb0\x00\xb2\x00\xe5\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x00\x00\x00\x00\xda\x00\x0c\x00\xda\x00\xe0\x00\xc6\x00\xc4\x00\xc5\x00\x00\x00\x95\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x81\x00\x0c\x00\x89\x00\x6c\x00\x26\x00\x59\x00\xfc\xff\x0c\x00\x0c\x00\x00\x00\x76\x00\x00\x00\x00\x00\x00\x00\xee\xff\x84\x00\x59\x00\x59\x00\xfb\xff\x90\x00\x00\x00\x00\x00\x59\x00\x6c\x00\x00\x00\x6c\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x35\x00\x67\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# + +happyGotoOffsets :: HappyAddr +happyGotoOffsets = HappyA# "\x32\x00\x20\x00\x7b\x00\x7e\x00\x77\x00\x00\x00\x00\x00\x00\x00\x47\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x6e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7a\x00\x6b\x00\x00\x00\x69\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x02\x28\x00\x28\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\x00\x00\x00\x78\x04\x00\x00\x00\x00\xa0\x03\x7e\x05\xf9\x01\x64\x05\x00\x00\xe8\x00\x4e\x05\x00\x00\xb5\x02\x86\x02\x00\x00\x00\x00\x00\x00\x00\x00\x34\x05\x00\x00\x00\x00\x00\x00\xca\x01\x00\x00\x3d\x00\x08\x00\x00\x00\xb5\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87\x00\x00\x00\x00\x00\x00\x00\x29\x00\x02\x06\x00\x00\x00\x00\x00\x00\x1e\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2b\x00\x00\x00\x00\x00\x00\x00\x88\x00\xac\x05\x7c\x00\x4f\x06\x46\x06\x37\x06\x2e\x06\x18\x06\xee\x04\xd4\x04\xbe\x04\x8f\x04\x60\x04\x48\x04\x30\x04\x18\x04\x00\x04\xe8\x03\xd0\x03\x00\x00\x71\x03\x42\x03\x13\x03\xe4\x02\x57\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xec\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x01\x00\x00\x00\x00\x00\x00\x00\x00\xd6\x05\x3c\x00\x6c\x01\x04\x05\x00\x00\x57\x00\xc0\x05\xaa\x05\x00\x00\x00\x00\x00\x00\x00\x00\xda\xff\x9c\x01\x70\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3d\x01\x00\x00\x0e\x01\x00\x00\x00\x00\x00\x00\x00\x00\x94\x05\x18\x00\xdf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"# + +happyDefActions :: HappyAddr +happyDefActions = HappyA# "\x86\xff\xef\xff\x00\x00\x00\x00\x00\x00\x00\x00\xfa\xff\x00\x00\x80\xff\x00\x00\x00\x00\x00\x00\x80\xff\x00\x00\xdd\xff\xee\xff\x00\x00\xef\xff\x85\xff\xeb\xff\xe9\xff\xe7\xff\xe8\xff\xf4\xff\x00\x00\x00\x00\x00\x00\x00\x00\xd8\xff\xda\xff\xd9\xff\xdb\xff\xdc\xff\x00\x00\x80\xff\x00\x00\xa3\xff\xa2\xff\xa1\xff\x88\xff\x91\xff\x7f\xff\xc9\xff\xc5\xff\xc3\xff\xc1\xff\xbf\xff\xbd\xff\xbb\xff\xb2\xff\xb0\xff\xad\xff\xaa\xff\xa6\xff\xa4\xff\xa0\xff\x9c\xff\x9a\xff\x98\xff\x96\xff\x94\xff\x92\xff\x00\x00\x7c\xff\xce\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf0\xff\x00\x00\x00\x00\x8c\xff\x00\x00\x00\x00\x8e\xff\x8d\xff\x8b\xff\x8a\xff\x00\x00\xf9\xff\xf8\xff\xf7\xff\x00\x00\xf2\xff\xe6\xff\x00\x00\x00\x00\xd7\xff\xd3\xff\xed\xff\xd2\xff\xd4\xff\xd5\xff\xd6\xff\x00\x00\xcf\xff\xd1\xff\xd0\xff\xe4\xff\x00\x00\xf1\xff\xa9\xff\xc7\xff\x00\x00\xc8\xff\x00\x00\x87\xff\x00\x00\x7e\xff\x00\x00\x00\x00\xa7\xff\x00\x00\xa0\xff\xa8\xff\xbc\xff\x00\x00\x88\xff\xb1\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\xc6\xff\xc4\xff\xc2\xff\xc0\xff\xbe\xff\x00\x00\xb4\xff\xb6\xff\xb9\xff\xb8\xff\xb7\xff\xba\xff\xb5\xff\xae\xff\xaf\xff\xab\xff\xac\xff\x9d\xff\x00\x00\x9e\xff\x9b\xff\x99\xff\x97\xff\x95\xff\x93\xff\x00\x00\x00\x00\x7b\xff\x90\xff\x9f\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe5\xff\xd7\xff\x00\x00\x00\x00\x89\xff\x84\xff\xf5\xff\xea\xff\x82\xff\xef\xff\x00\x00\xe2\xff\xe3\xff\xe1\xff\x00\x00\xcc\xff\x7d\xff\x8f\xff\x00\x00\xca\xff\x00\x00\x00\x00\xb3\xff\xcb\xff\xcd\xff\x00\x00\xed\xff\x00\x00\xde\xff\xdf\xff\x83\xff\x81\xff\xec\xff\xe0\xff\xf3\xff\xa5\xff"# + +happyCheck :: HappyAddr +happyCheck = HappyA# "\xff\xff\x29\x00\x01\x00\x07\x00\x03\x00\x09\x00\x05\x00\x19\x00\x00\x00\x03\x00\x07\x00\x05\x00\x32\x00\x0c\x00\x00\x00\x14\x00\x22\x00\x05\x00\x0c\x00\x25\x00\x26\x00\x12\x00\x28\x00\x1c\x00\x0f\x00\x10\x00\x42\x00\x07\x00\x14\x00\x21\x00\x01\x00\x11\x00\x03\x00\x13\x00\x05\x00\x0b\x00\x13\x00\x24\x00\x06\x00\x16\x00\x27\x00\x0c\x00\x0a\x00\x05\x00\x3e\x00\x2c\x00\x03\x00\x2e\x00\x2f\x00\x30\x00\x2c\x00\x32\x00\x33\x00\x34\x00\x04\x00\x0e\x00\x37\x00\x38\x00\x05\x00\x3f\x00\x0b\x00\x20\x00\x38\x00\x03\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x27\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x2c\x00\x0d\x00\x2e\x00\x2f\x00\x30\x00\x42\x00\x32\x00\x33\x00\x34\x00\x2c\x00\x3f\x00\x37\x00\x38\x00\x01\x00\x00\x00\x03\x00\x2e\x00\x05\x00\x33\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x35\x00\x0c\x00\x30\x00\x0a\x00\x0b\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x12\x00\x13\x00\x2f\x00\x03\x00\x01\x00\x03\x00\x03\x00\x34\x00\x05\x00\x33\x00\x03\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x0c\x00\x24\x00\x33\x00\x09\x00\x27\x00\x03\x00\x0c\x00\x03\x00\x09\x00\x2c\x00\x07\x00\x2e\x00\x2f\x00\x30\x00\x08\x00\x32\x00\x33\x00\x34\x00\x03\x00\x03\x00\x37\x00\x38\x00\x01\x00\x15\x00\x03\x00\x15\x00\x05\x00\x27\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x2c\x00\x0c\x00\x2e\x00\x2f\x00\x30\x00\x2d\x00\x32\x00\x33\x00\x34\x00\x31\x00\x3b\x00\x37\x00\x38\x00\x29\x00\x2a\x00\x03\x00\x2e\x00\x05\x00\x2e\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x35\x00\x0c\x00\x35\x00\x3c\x00\x2b\x00\x2d\x00\x00\x00\x05\x00\x2f\x00\x31\x00\x2c\x00\x2a\x00\x2e\x00\x34\x00\x3c\x00\x06\x00\x32\x00\x33\x00\x34\x00\x0a\x00\x0b\x00\x37\x00\x38\x00\x42\x00\x12\x00\x13\x00\x0e\x00\x0f\x00\x42\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x2c\x00\x3c\x00\x2e\x00\x0a\x00\x0b\x00\x10\x00\x32\x00\x33\x00\x34\x00\x15\x00\x29\x00\x37\x00\x38\x00\x2c\x00\x18\x00\x00\x00\x01\x00\x02\x00\x03\x00\x3f\x00\x40\x00\x41\x00\x42\x00\x0d\x00\x08\x00\x04\x00\x03\x00\x03\x00\x3a\x00\x3d\x00\x1d\x00\x2d\x00\x3f\x00\x40\x00\x41\x00\x42\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\x42\x00\x2c\x00\x3c\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x2b\x00\x2b\x00\x35\x00\x42\x00\x2f\x00\x2f\x00\x06\x00\x42\x00\x13\x00\x34\x00\x34\x00\x3c\x00\x16\x00\x39\x00\x1d\x00\x1c\x00\x11\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\x42\x00\x2c\x00\x3b\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x31\x00\x13\x00\x35\x00\x23\x00\x35\x00\x36\x00\x10\x00\x15\x00\x18\x00\x3a\x00\x08\x00\x0d\x00\x04\x00\x3a\x00\x3f\x00\x3d\x00\x1d\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\x1b\x00\x2c\x00\x42\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x11\x00\x44\x00\x35\x00\x05\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x22\x00\x0c\x00\x42\x00\x44\x00\x3f\x00\x19\x00\x22\x00\x28\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\x26\x00\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\x00\x06\x00\x07\x00\x08\x00\x09\x00\x0a\x00\xff\xff\x0c\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\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\xff\xff\x2c\x00\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\x19\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\xff\xff\xff\xff\x25\x00\x26\x00\xff\xff\x28\x00\xff\xff\x15\x00\x2b\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\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\xff\xff\x2c\x00\x15\x00\x2e\x00\x44\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\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\xff\xff\x2c\x00\x15\x00\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x2b\x00\x15\x00\xff\xff\x2e\x00\x2f\x00\xff\xff\xff\xff\xff\xff\xff\xff\x34\x00\x35\x00\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\x35\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\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\x15\x00\x00\x00\x01\x00\x02\x00\x03\x00\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\x03\x00\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\x15\x00\x2e\x00\x03\x00\xff\xff\xff\xff\x02\x00\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\x2a\x00\xff\xff\x2e\x00\x03\x00\x2e\x00\x17\x00\xff\xff\xff\xff\x1a\x00\x35\x00\x1c\x00\x35\x00\x1e\x00\x1f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\x2d\x00\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\x33\x00\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x24\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\x03\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\x15\x00\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\x03\x00\xff\xff\xff\xff\x15\x00\x35\x00\xff\xff\xff\xff\xff\xff\xff\xff\x03\x00\x25\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\x15\x00\x2e\x00\x26\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\x35\x00\x15\x00\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\x00\x27\x00\x28\x00\x29\x00\x2a\x00\xff\xff\xff\xff\xff\xff\x2e\x00\xff\xff\xff\xff\x28\x00\x29\x00\x2a\x00\xff\xff\x35\x00\xff\xff\x2e\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x35\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"# + +happyTable :: HappyAddr +happyTable = HappyA# "\x00\x00\x70\x00\x42\x00\x5d\x00\x43\x00\x5e\x00\x44\x00\x09\x00\x60\x00\x43\x00\x82\x00\x44\x00\xbe\x00\x45\x00\x1a\x00\xd2\x00\x0d\x00\xa5\x00\x45\x00\x19\x00\x10\x00\x83\x00\x0b\x00\xd3\x00\xcf\x00\xd0\x00\x53\x00\x63\x00\x61\x00\x5f\x00\x42\x00\x1b\x00\x43\x00\x1c\x00\x44\x00\xd7\x00\x87\xff\x66\x00\x0d\x00\x87\xff\x47\x00\x45\x00\x0e\x00\x44\x00\xd6\x00\x48\x00\x27\x00\x49\x00\x4a\x00\x4b\x00\x48\x00\x4c\x00\x4d\x00\x4e\x00\x10\x00\xb6\x00\x4f\x00\x50\x00\x44\x00\x07\x00\xbc\x00\x46\x00\x50\x00\x6b\x00\x07\x00\x51\x00\x52\x00\x53\x00\x47\x00\x07\x00\x51\x00\x52\x00\x53\x00\x48\x00\x63\x00\x49\x00\x4a\x00\x4b\x00\x53\x00\x4c\x00\x4d\x00\x4e\x00\x48\x00\x07\x00\x4f\x00\x50\x00\x42\x00\x59\x00\x43\x00\x3f\x00\x44\x00\x53\x00\x07\x00\x51\x00\x52\x00\x53\x00\xad\x00\x45\x00\x11\x00\x80\x00\x81\x00\x07\x00\x51\x00\x52\x00\x53\x00\xc2\x00\x5b\x00\x6d\x00\x55\x00\x42\x00\x57\x00\x43\x00\xc5\x00\x44\x00\x21\x00\xb9\x00\x07\x00\x51\x00\x52\x00\x53\x00\x45\x00\x55\x00\x23\x00\x84\x00\x47\x00\x27\x00\x85\x00\x27\x00\x07\x00\x48\x00\x0b\x00\x49\x00\x4a\x00\x4b\x00\x09\x00\x4c\x00\x4d\x00\x4e\x00\xb9\x00\x6b\x00\x4f\x00\x50\x00\x42\x00\x58\x00\x43\x00\x28\x00\x44\x00\x47\x00\x07\x00\x51\x00\x52\x00\x53\x00\x48\x00\x45\x00\x49\x00\x4a\x00\x4b\x00\xba\x00\x4c\x00\x4d\x00\x4e\x00\xd3\x00\xbe\x00\x4f\x00\x50\x00\xa9\x00\x3d\x00\x43\x00\x3f\x00\x44\x00\x3f\x00\x07\x00\x51\x00\x52\x00\x53\x00\x40\x00\x45\x00\x40\x00\xc0\x00\xab\x00\xba\x00\x59\x00\x44\x00\x6d\x00\xbb\x00\x48\x00\xcf\x00\x49\x00\x6e\x00\xc8\x00\xaf\x00\x4c\x00\x4d\x00\x4e\x00\x80\x00\x81\x00\x4f\x00\x50\x00\x53\x00\x5a\x00\x5b\x00\xb8\x00\xb9\x00\x53\x00\x07\x00\x51\x00\x52\x00\x53\x00\x48\x00\xca\x00\x49\x00\x80\x00\x81\x00\x7b\x00\x4c\x00\x4d\x00\x4e\x00\x7c\x00\x7a\x00\x4f\x00\x50\x00\x48\x00\x7d\x00\x24\x00\x25\x00\x26\x00\x27\x00\x07\x00\x51\x00\x52\x00\x53\x00\x7f\x00\x7e\x00\x8e\x00\x6b\x00\x6b\x00\x8f\x00\x90\x00\x91\x00\x98\x00\x07\x00\x51\x00\x52\x00\x53\x00\x28\x00\xd6\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\x53\x00\x3e\x00\xad\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\xb0\x00\x6c\x00\x40\x00\x53\x00\x6d\x00\x6d\x00\xb0\x00\x53\x00\xb2\x00\x6e\x00\x6e\x00\xb4\x00\xb3\x00\xb5\x00\x91\x00\x60\x00\x57\x00\x28\x00\xcc\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\x53\x00\x3e\x00\xbe\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x1e\x00\x65\x00\x40\x00\x76\x00\x1f\x00\x20\x00\x7b\x00\x7c\x00\x7d\x00\x21\x00\x7e\x00\x7f\x00\x8e\x00\x8f\x00\x07\x00\x90\x00\x91\x00\x28\x00\xcd\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\x92\x00\x3e\x00\x53\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x57\x00\xff\xff\x40\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0e\x00\x23\x00\x17\x00\x53\x00\xff\xff\x07\x00\x09\x00\x0d\x00\x0b\x00\x28\x00\xc4\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\x10\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x13\x00\x14\x00\x15\x00\x16\x00\x0e\x00\x00\x00\xd4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x00\xc8\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\x00\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\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\x00\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\x28\x00\x71\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\x72\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\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\x00\x00\x3e\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\x28\x00\x00\x00\x00\x00\x92\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\x28\x00\x00\x00\x00\x00\x67\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\x28\x00\x00\x00\x00\x00\x69\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\x28\x00\x00\x00\x00\x00\x00\x00\x93\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x94\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x95\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\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\x00\x00\x68\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x09\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x00\x00\x00\x00\x19\x00\x10\x00\x00\x00\x0b\x00\x00\x00\x28\x00\x1a\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x74\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\x00\x00\x68\x00\x28\x00\x3f\x00\xf6\xff\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\xcb\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x98\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x99\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x9a\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x9b\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x9c\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x9d\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\x00\x00\x68\x00\x28\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x76\x00\x00\x00\x40\x00\x9e\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\x00\x00\x68\x00\x28\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x78\x00\x28\x00\x00\x00\x3f\x00\x6d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6e\x00\x40\x00\x00\x00\x9f\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x24\x00\x25\x00\x26\x00\x27\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\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x34\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\xa1\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa2\x00\x35\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\xc3\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x66\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x70\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x28\x00\x24\x00\x25\x00\x26\x00\x27\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x00\x36\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x27\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\xd8\x00\x37\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x28\x00\x3f\x00\x27\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\xaa\x00\x00\x00\x3f\x00\x27\x00\x3f\x00\x87\x00\x00\x00\x00\x00\x88\x00\x40\x00\x89\x00\x40\x00\x8a\x00\x8b\x00\xc1\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x8d\x00\x00\x00\x00\x00\xc6\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb5\x00\x38\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\xa3\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x28\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\x27\x00\x00\x00\x00\x00\x28\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x00\xa5\x00\x39\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x28\x00\x3f\x00\xa6\x00\x3a\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x40\x00\x28\x00\x3f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\xa7\x00\x3b\x00\x3c\x00\x3d\x00\x00\x00\x00\x00\x00\x00\x3f\x00\x00\x00\x00\x00\xa8\x00\x3c\x00\x3d\x00\x00\x00\x40\x00\x00\x00\x3f\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"# + +happyReduceArr = Happy_Data_Array.array (5, 132) [ + (5 , happyReduce_5), + (6 , happyReduce_6), + (7 , happyReduce_7), + (8 , happyReduce_8), + (9 , happyReduce_9), + (10 , happyReduce_10), + (11 , happyReduce_11), + (12 , happyReduce_12), + (13 , happyReduce_13), + (14 , happyReduce_14), + (15 , happyReduce_15), + (16 , happyReduce_16), + (17 , happyReduce_17), + (18 , happyReduce_18), + (19 , happyReduce_19), + (20 , happyReduce_20), + (21 , happyReduce_21), + (22 , happyReduce_22), + (23 , happyReduce_23), + (24 , happyReduce_24), + (25 , happyReduce_25), + (26 , happyReduce_26), + (27 , happyReduce_27), + (28 , happyReduce_28), + (29 , happyReduce_29), + (30 , happyReduce_30), + (31 , happyReduce_31), + (32 , happyReduce_32), + (33 , happyReduce_33), + (34 , happyReduce_34), + (35 , happyReduce_35), + (36 , happyReduce_36), + (37 , happyReduce_37), + (38 , happyReduce_38), + (39 , happyReduce_39), + (40 , happyReduce_40), + (41 , happyReduce_41), + (42 , happyReduce_42), + (43 , happyReduce_43), + (44 , happyReduce_44), + (45 , happyReduce_45), + (46 , happyReduce_46), + (47 , happyReduce_47), + (48 , happyReduce_48), + (49 , happyReduce_49), + (50 , happyReduce_50), + (51 , happyReduce_51), + (52 , happyReduce_52), + (53 , happyReduce_53), + (54 , happyReduce_54), + (55 , happyReduce_55), + (56 , happyReduce_56), + (57 , happyReduce_57), + (58 , happyReduce_58), + (59 , happyReduce_59), + (60 , happyReduce_60), + (61 , happyReduce_61), + (62 , happyReduce_62), + (63 , happyReduce_63), + (64 , happyReduce_64), + (65 , happyReduce_65), + (66 , happyReduce_66), + (67 , happyReduce_67), + (68 , happyReduce_68), + (69 , happyReduce_69), + (70 , happyReduce_70), + (71 , happyReduce_71), + (72 , happyReduce_72), + (73 , happyReduce_73), + (74 , happyReduce_74), + (75 , happyReduce_75), + (76 , happyReduce_76), + (77 , happyReduce_77), + (78 , happyReduce_78), + (79 , happyReduce_79), + (80 , happyReduce_80), + (81 , happyReduce_81), + (82 , happyReduce_82), + (83 , happyReduce_83), + (84 , happyReduce_84), + (85 , happyReduce_85), + (86 , happyReduce_86), + (87 , happyReduce_87), + (88 , happyReduce_88), + (89 , happyReduce_89), + (90 , happyReduce_90), + (91 , happyReduce_91), + (92 , happyReduce_92), + (93 , happyReduce_93), + (94 , happyReduce_94), + (95 , happyReduce_95), + (96 , happyReduce_96), + (97 , happyReduce_97), + (98 , happyReduce_98), + (99 , happyReduce_99), + (100 , happyReduce_100), + (101 , happyReduce_101), + (102 , happyReduce_102), + (103 , happyReduce_103), + (104 , happyReduce_104), + (105 , happyReduce_105), + (106 , happyReduce_106), + (107 , happyReduce_107), + (108 , happyReduce_108), + (109 , happyReduce_109), + (110 , happyReduce_110), + (111 , happyReduce_111), + (112 , happyReduce_112), + (113 , happyReduce_113), + (114 , happyReduce_114), + (115 , happyReduce_115), + (116 , happyReduce_116), + (117 , happyReduce_117), + (118 , happyReduce_118), + (119 , happyReduce_119), + (120 , happyReduce_120), + (121 , happyReduce_121), + (122 , happyReduce_122), + (123 , happyReduce_123), + (124 , happyReduce_124), + (125 , happyReduce_125), + (126 , happyReduce_126), + (127 , happyReduce_127), + (128 , happyReduce_128), + (129 , happyReduce_129), + (130 , happyReduce_130), + (131 , happyReduce_131), + (132 , happyReduce_132) + ] + +happy_n_terms = 69 :: Int +happy_n_nonterms = 54 :: Int + +happyReduce_5 = happySpecReduce_1 0# happyReduction_5 +happyReduction_5 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn8 + (PosInteger (mkPosToken happy_var_1) + )} + +happyReduce_6 = happySpecReduce_1 1# happyReduction_6 +happyReduction_6 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn9 + (PosDouble (mkPosToken happy_var_1) + )} + +happyReduce_7 = happySpecReduce_1 2# happyReduction_7 +happyReduction_7 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn10 + (PosString (mkPosToken happy_var_1) + )} + +happyReduce_8 = happySpecReduce_1 3# happyReduction_8 +happyReduction_8 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn11 + (PosIdent (mkPosToken happy_var_1) + )} + +happyReduce_9 = happySpecReduce_1 4# happyReduction_9 +happyReduction_9 happy_x_1 + = case happyOut56 happy_x_1 of { happy_var_1 -> + happyIn12 + (Module ((mkCatSpan happy_var_1)) (reverse happy_var_1) + )} + +happyReduce_10 = happyReduce 4# 5# happyReduction_10 +happyReduction_10 (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 happyOut11 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + case happyOut57 happy_x_4 of { happy_var_4 -> + happyIn13 + (EnumDecl ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4 + ) `HappyStk` happyRest}}}} + +happyReduce_11 = happySpecReduce_1 5# happyReduction_11 +happyReduction_11 happy_x_1 + = case happyOut20 happy_x_1 of { happy_var_1 -> + happyIn13 + (ElementDecl ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_12 = happyReduce 8# 6# happyReduction_12 +happyReduction_12 (happy_x_8 `HappyStk` + happy_x_7 `HappyStk` + happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut18 happy_x_1 of { happy_var_1 -> + case happyOut25 happy_x_2 of { happy_var_2 -> + case happyOut11 happy_x_3 of { happy_var_3 -> + case happyOut21 happy_x_4 of { happy_var_4 -> + case happyOut22 happy_x_5 of { happy_var_5 -> + case happyOut26 happy_x_6 of { happy_var_6 -> + case happyOut23 happy_x_7 of { happy_var_7 -> + case happyOut19 happy_x_8 of { happy_var_8 -> + happyIn14 + (Clafer ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkCatSpan happy_var_5) >- (mkCatSpan happy_var_6) >- (mkCatSpan happy_var_7) >- (mkCatSpan happy_var_8)) happy_var_1 happy_var_2 happy_var_3 happy_var_4 happy_var_5 happy_var_6 happy_var_7 happy_var_8 + ) `HappyStk` happyRest}}}}}}}} + +happyReduce_13 = happySpecReduce_3 7# happyReduction_13 +happyReduction_13 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut59 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + happyIn15 + (Constraint ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2) + )}}} + +happyReduce_14 = happyReduce 4# 8# happyReduction_14 +happyReduction_14 (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 happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut59 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { happy_var_4 -> + happyIn16 + (SoftConstraint ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4)) (reverse happy_var_3) + ) `HappyStk` happyRest}}}} + +happyReduce_15 = happySpecReduce_3 9# happyReduction_15 +happyReduction_15 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut59 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + happyIn17 + (Goal ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2) + )}}} + +happyReduce_16 = happySpecReduce_0 10# happyReduction_16 +happyReduction_16 = happyIn18 + (AbstractEmpty noSpan + ) + +happyReduce_17 = happySpecReduce_1 10# happyReduction_17 +happyReduction_17 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn18 + (Abstract ((mkTokenSpan happy_var_1)) + )} + +happyReduce_18 = happySpecReduce_0 11# happyReduction_18 +happyReduction_18 = happyIn19 + (ElementsEmpty noSpan + ) + +happyReduce_19 = happySpecReduce_3 11# happyReduction_19 +happyReduction_19 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut58 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + happyIn19 + (ElementsList ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3)) (reverse happy_var_2) + )}}} + +happyReduce_20 = happySpecReduce_1 12# happyReduction_20 +happyReduction_20 happy_x_1 + = case happyOut14 happy_x_1 of { happy_var_1 -> + happyIn20 + (Subclafer ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_21 = happyReduce 4# 12# happyReduction_21 +happyReduction_21 (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 happyOut29 happy_x_2 of { happy_var_2 -> + case happyOut26 happy_x_3 of { happy_var_3 -> + case happyOut19 happy_x_4 of { happy_var_4 -> + happyIn20 + (ClaferUse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_3 happy_var_4 + ) `HappyStk` happyRest}}}} + +happyReduce_22 = happySpecReduce_1 12# happyReduction_22 +happyReduction_22 happy_x_1 + = case happyOut15 happy_x_1 of { happy_var_1 -> + happyIn20 + (Subconstraint ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_23 = happySpecReduce_1 12# happyReduction_23 +happyReduction_23 happy_x_1 + = case happyOut17 happy_x_1 of { happy_var_1 -> + happyIn20 + (Subgoal ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_24 = happySpecReduce_1 12# happyReduction_24 +happyReduction_24 happy_x_1 + = case happyOut16 happy_x_1 of { happy_var_1 -> + happyIn20 + (Subsoftconstraint ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_25 = happySpecReduce_0 13# happyReduction_25 +happyReduction_25 = happyIn21 + (SuperEmpty noSpan + ) + +happyReduce_26 = happySpecReduce_2 13# happyReduction_26 +happyReduction_26 happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + happyIn21 + (SuperSome ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 + )}} + +happyReduce_27 = happySpecReduce_0 14# happyReduction_27 +happyReduction_27 = happyIn22 + (ReferenceEmpty noSpan + ) + +happyReduce_28 = happySpecReduce_2 14# happyReduction_28 +happyReduction_28 happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + happyIn22 + (ReferenceSet ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 + )}} + +happyReduce_29 = happySpecReduce_2 14# happyReduction_29 +happyReduction_29 happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut44 happy_x_2 of { happy_var_2 -> + happyIn22 + (ReferenceBag ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 + )}} + +happyReduce_30 = happySpecReduce_0 15# happyReduction_30 +happyReduction_30 = happyIn23 + (InitEmpty noSpan + ) + +happyReduce_31 = happySpecReduce_2 15# happyReduction_31 +happyReduction_31 happy_x_2 + happy_x_1 + = case happyOut24 happy_x_1 of { happy_var_1 -> + case happyOut30 happy_x_2 of { happy_var_2 -> + happyIn23 + (InitSome ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2 + )}} + +happyReduce_32 = happySpecReduce_1 16# happyReduction_32 +happyReduction_32 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn24 + (InitConstant ((mkTokenSpan happy_var_1)) + )} + +happyReduce_33 = happySpecReduce_1 16# happyReduction_33 +happyReduction_33 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn24 + (InitDefault ((mkTokenSpan happy_var_1)) + )} + +happyReduce_34 = happySpecReduce_0 17# happyReduction_34 +happyReduction_34 = happyIn25 + (GCardEmpty noSpan + ) + +happyReduce_35 = happySpecReduce_1 17# happyReduction_35 +happyReduction_35 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn25 + (GCardXor ((mkTokenSpan happy_var_1)) + )} + +happyReduce_36 = happySpecReduce_1 17# happyReduction_36 +happyReduction_36 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn25 + (GCardOr ((mkTokenSpan happy_var_1)) + )} + +happyReduce_37 = happySpecReduce_1 17# happyReduction_37 +happyReduction_37 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn25 + (GCardMux ((mkTokenSpan happy_var_1)) + )} + +happyReduce_38 = happySpecReduce_1 17# happyReduction_38 +happyReduction_38 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn25 + (GCardOpt ((mkTokenSpan happy_var_1)) + )} + +happyReduce_39 = happySpecReduce_1 17# happyReduction_39 +happyReduction_39 happy_x_1 + = case happyOut27 happy_x_1 of { happy_var_1 -> + happyIn25 + (GCardInterval ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_40 = happySpecReduce_0 18# happyReduction_40 +happyReduction_40 = happyIn26 + (CardEmpty noSpan + ) + +happyReduce_41 = happySpecReduce_1 18# happyReduction_41 +happyReduction_41 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn26 + (CardLone ((mkTokenSpan happy_var_1)) + )} + +happyReduce_42 = happySpecReduce_1 18# happyReduction_42 +happyReduction_42 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn26 + (CardSome ((mkTokenSpan happy_var_1)) + )} + +happyReduce_43 = happySpecReduce_1 18# happyReduction_43 +happyReduction_43 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn26 + (CardAny ((mkTokenSpan happy_var_1)) + )} + +happyReduce_44 = happySpecReduce_1 18# happyReduction_44 +happyReduction_44 happy_x_1 + = case happyOut8 happy_x_1 of { happy_var_1 -> + happyIn26 + (CardNum ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_45 = happySpecReduce_1 18# happyReduction_45 +happyReduction_45 happy_x_1 + = case happyOut27 happy_x_1 of { happy_var_1 -> + happyIn26 + (CardInterval ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_46 = happySpecReduce_3 19# happyReduction_46 +happyReduction_46 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut8 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut28 happy_x_3 of { happy_var_3 -> + happyIn27 + (NCard ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_47 = happySpecReduce_1 20# happyReduction_47 +happyReduction_47 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn28 + (ExIntegerAst ((mkTokenSpan happy_var_1)) + )} + +happyReduce_48 = happySpecReduce_1 20# happyReduction_48 +happyReduction_48 happy_x_1 + = case happyOut8 happy_x_1 of { happy_var_1 -> + happyIn28 + (ExIntegerNum ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_49 = happySpecReduce_1 21# happyReduction_49 +happyReduction_49 happy_x_1 + = case happyOut61 happy_x_1 of { happy_var_1 -> + happyIn29 + (Path ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_50 = happyReduce 5# 22# happyReduction_50 +happyReduction_50 (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 happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut51 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { happy_var_4 -> + case happyOut30 happy_x_5 of { happy_var_5 -> + happyIn30 + (DeclAllDisj ((mkTokenSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_3 happy_var_5 + ) `HappyStk` happyRest}}}}} + +happyReduce_51 = happyReduce 4# 22# happyReduction_51 +happyReduction_51 (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 happyOut51 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + case happyOut30 happy_x_4 of { happy_var_4 -> + happyIn30 + (DeclAll ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_2 happy_var_4 + ) `HappyStk` happyRest}}}} + +happyReduce_52 = happyReduce 5# 22# happyReduction_52 +happyReduction_52 (happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut52 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut51 happy_x_3 of { happy_var_3 -> + case happyOutTok happy_x_4 of { happy_var_4 -> + case happyOut30 happy_x_5 of { happy_var_5 -> + happyIn30 + (DeclQuantDisj ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3) >- (mkTokenSpan happy_var_4) >- (mkCatSpan happy_var_5)) happy_var_1 happy_var_3 happy_var_5 + ) `HappyStk` happyRest}}}}} + +happyReduce_53 = happyReduce 4# 22# happyReduction_53 +happyReduction_53 (happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut52 happy_x_1 of { happy_var_1 -> + case happyOut51 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + case happyOut30 happy_x_4 of { happy_var_4 -> + happyIn30 + (DeclQuant ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_2 happy_var_4 + ) `HappyStk` happyRest}}}} + +happyReduce_54 = happySpecReduce_1 22# happyReduction_54 +happyReduction_54 happy_x_1 + = case happyOut31 happy_x_1 of { happy_var_1 -> + happyIn30 + (happy_var_1 + )} + +happyReduce_55 = happySpecReduce_2 23# happyReduction_55 +happyReduction_55 happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut32 happy_x_2 of { happy_var_2 -> + happyIn31 + (EGMax ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 + )}} + +happyReduce_56 = happySpecReduce_2 23# happyReduction_56 +happyReduction_56 happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut32 happy_x_2 of { happy_var_2 -> + happyIn31 + (EGMin ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 + )}} + +happyReduce_57 = happySpecReduce_3 23# happyReduction_57 +happyReduction_57 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut31 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut32 happy_x_3 of { happy_var_3 -> + happyIn31 + (EIff ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_58 = happySpecReduce_1 23# happyReduction_58 +happyReduction_58 happy_x_1 + = case happyOut32 happy_x_1 of { happy_var_1 -> + happyIn31 + (happy_var_1 + )} + +happyReduce_59 = happySpecReduce_3 24# happyReduction_59 +happyReduction_59 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut32 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut33 happy_x_3 of { happy_var_3 -> + happyIn32 + (EImplies ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_60 = happySpecReduce_1 24# happyReduction_60 +happyReduction_60 happy_x_1 + = case happyOut33 happy_x_1 of { happy_var_1 -> + happyIn32 + (happy_var_1 + )} + +happyReduce_61 = happySpecReduce_3 25# happyReduction_61 +happyReduction_61 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut33 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut34 happy_x_3 of { happy_var_3 -> + happyIn33 + (EOr ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_62 = happySpecReduce_1 25# happyReduction_62 +happyReduction_62 happy_x_1 + = case happyOut34 happy_x_1 of { happy_var_1 -> + happyIn33 + (happy_var_1 + )} + +happyReduce_63 = happySpecReduce_3 26# happyReduction_63 +happyReduction_63 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut34 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut35 happy_x_3 of { happy_var_3 -> + happyIn34 + (EXor ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_64 = happySpecReduce_1 26# happyReduction_64 +happyReduction_64 happy_x_1 + = case happyOut35 happy_x_1 of { happy_var_1 -> + happyIn34 + (happy_var_1 + )} + +happyReduce_65 = happySpecReduce_3 27# happyReduction_65 +happyReduction_65 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut35 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut36 happy_x_3 of { happy_var_3 -> + happyIn35 + (EAnd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_66 = happySpecReduce_1 27# happyReduction_66 +happyReduction_66 happy_x_1 + = case happyOut36 happy_x_1 of { happy_var_1 -> + happyIn35 + (happy_var_1 + )} + +happyReduce_67 = happySpecReduce_2 28# happyReduction_67 +happyReduction_67 happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut37 happy_x_2 of { happy_var_2 -> + happyIn36 + (ENeg ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 + )}} + +happyReduce_68 = happySpecReduce_1 28# happyReduction_68 +happyReduction_68 happy_x_1 + = case happyOut37 happy_x_1 of { happy_var_1 -> + happyIn36 + (happy_var_1 + )} + +happyReduce_69 = happySpecReduce_3 29# happyReduction_69 +happyReduction_69 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut38 happy_x_3 of { happy_var_3 -> + happyIn37 + (ELt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_70 = happySpecReduce_3 29# happyReduction_70 +happyReduction_70 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut38 happy_x_3 of { happy_var_3 -> + happyIn37 + (EGt ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_71 = happySpecReduce_3 29# happyReduction_71 +happyReduction_71 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut38 happy_x_3 of { happy_var_3 -> + happyIn37 + (EEq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_72 = happySpecReduce_3 29# happyReduction_72 +happyReduction_72 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut38 happy_x_3 of { happy_var_3 -> + happyIn37 + (ELte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_73 = happySpecReduce_3 29# happyReduction_73 +happyReduction_73 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut38 happy_x_3 of { happy_var_3 -> + happyIn37 + (EGte ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_74 = happySpecReduce_3 29# happyReduction_74 +happyReduction_74 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut38 happy_x_3 of { happy_var_3 -> + happyIn37 + (ENeq ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_75 = happySpecReduce_3 29# happyReduction_75 +happyReduction_75 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut38 happy_x_3 of { happy_var_3 -> + happyIn37 + (EIn ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_76 = happyReduce 4# 29# happyReduction_76 +happyReduction_76 (happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOut37 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + case happyOut38 happy_x_4 of { happy_var_4 -> + happyIn37 + (ENin ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4)) happy_var_1 happy_var_4 + ) `HappyStk` happyRest}}}} + +happyReduce_77 = happySpecReduce_1 29# happyReduction_77 +happyReduction_77 happy_x_1 + = case happyOut38 happy_x_1 of { happy_var_1 -> + happyIn37 + (happy_var_1 + )} + +happyReduce_78 = happySpecReduce_2 30# happyReduction_78 +happyReduction_78 happy_x_2 + happy_x_1 + = case happyOut52 happy_x_1 of { happy_var_1 -> + case happyOut42 happy_x_2 of { happy_var_2 -> + happyIn38 + (QuantExp ((mkCatSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_1 happy_var_2 + )}} + +happyReduce_79 = happySpecReduce_1 30# happyReduction_79 +happyReduction_79 happy_x_1 + = case happyOut39 happy_x_1 of { happy_var_1 -> + happyIn38 + (happy_var_1 + )} + +happyReduce_80 = happySpecReduce_3 31# happyReduction_80 +happyReduction_80 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut39 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut40 happy_x_3 of { happy_var_3 -> + happyIn39 + (EAdd ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_81 = happySpecReduce_3 31# happyReduction_81 +happyReduction_81 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut39 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut40 happy_x_3 of { happy_var_3 -> + happyIn39 + (ESub ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_82 = happySpecReduce_1 31# happyReduction_82 +happyReduction_82 happy_x_1 + = case happyOut40 happy_x_1 of { happy_var_1 -> + happyIn39 + (happy_var_1 + )} + +happyReduce_83 = happySpecReduce_3 32# happyReduction_83 +happyReduction_83 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut40 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut41 happy_x_3 of { happy_var_3 -> + happyIn40 + (EMul ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_84 = happySpecReduce_3 32# happyReduction_84 +happyReduction_84 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut40 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut41 happy_x_3 of { happy_var_3 -> + happyIn40 + (EDiv ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_85 = happySpecReduce_1 32# happyReduction_85 +happyReduction_85 happy_x_1 + = case happyOut41 happy_x_1 of { happy_var_1 -> + happyIn40 + (happy_var_1 + )} + +happyReduce_86 = happySpecReduce_2 33# happyReduction_86 +happyReduction_86 happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut42 happy_x_2 of { happy_var_2 -> + happyIn41 + (ESumSetExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 + )}} + +happyReduce_87 = happySpecReduce_2 33# happyReduction_87 +happyReduction_87 happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut42 happy_x_2 of { happy_var_2 -> + happyIn41 + (ECSetExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 + )}} + +happyReduce_88 = happySpecReduce_2 33# happyReduction_88 +happyReduction_88 happy_x_2 + happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut42 happy_x_2 of { happy_var_2 -> + happyIn41 + (EMinExp ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2)) happy_var_2 + )}} + +happyReduce_89 = happySpecReduce_1 33# happyReduction_89 +happyReduction_89 happy_x_1 + = case happyOut42 happy_x_1 of { happy_var_1 -> + happyIn41 + (happy_var_1 + )} + +happyReduce_90 = happyReduce 6# 34# happyReduction_90 +happyReduction_90 (happy_x_6 `HappyStk` + happy_x_5 `HappyStk` + happy_x_4 `HappyStk` + happy_x_3 `HappyStk` + happy_x_2 `HappyStk` + happy_x_1 `HappyStk` + happyRest) + = case happyOutTok happy_x_1 of { happy_var_1 -> + case happyOut42 happy_x_2 of { happy_var_2 -> + case happyOutTok happy_x_3 of { happy_var_3 -> + case happyOut42 happy_x_4 of { happy_var_4 -> + case happyOutTok happy_x_5 of { happy_var_5 -> + case happyOut43 happy_x_6 of { happy_var_6 -> + happyIn42 + (EImpliesElse ((mkTokenSpan happy_var_1) >- (mkCatSpan happy_var_2) >- (mkTokenSpan happy_var_3) >- (mkCatSpan happy_var_4) >- (mkTokenSpan happy_var_5) >- (mkCatSpan happy_var_6)) happy_var_2 happy_var_4 happy_var_6 + ) `HappyStk` happyRest}}}}}} + +happyReduce_91 = happySpecReduce_1 34# happyReduction_91 +happyReduction_91 happy_x_1 + = case happyOut43 happy_x_1 of { happy_var_1 -> + happyIn42 + (happy_var_1 + )} + +happyReduce_92 = happySpecReduce_1 35# happyReduction_92 +happyReduction_92 happy_x_1 + = case happyOut8 happy_x_1 of { happy_var_1 -> + happyIn43 + (EInt ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_93 = happySpecReduce_1 35# happyReduction_93 +happyReduction_93 happy_x_1 + = case happyOut9 happy_x_1 of { happy_var_1 -> + happyIn43 + (EDouble ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_94 = happySpecReduce_1 35# happyReduction_94 +happyReduction_94 happy_x_1 + = case happyOut10 happy_x_1 of { happy_var_1 -> + happyIn43 + (EStr ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_95 = happySpecReduce_1 35# happyReduction_95 +happyReduction_95 happy_x_1 + = case happyOut44 happy_x_1 of { happy_var_1 -> + happyIn43 + (ESetExp ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_96 = happySpecReduce_3 35# happyReduction_96 +happyReduction_96 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut30 happy_x_2 of { happy_var_2 -> + happyIn43 + (happy_var_2 + )} + +happyReduce_97 = happySpecReduce_3 36# happyReduction_97 +happyReduction_97 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut45 happy_x_3 of { happy_var_3 -> + happyIn44 + (Union ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_98 = happySpecReduce_3 36# happyReduction_98 +happyReduction_98 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut44 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut45 happy_x_3 of { happy_var_3 -> + happyIn44 + (UnionCom ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_99 = happySpecReduce_1 36# happyReduction_99 +happyReduction_99 happy_x_1 + = case happyOut45 happy_x_1 of { happy_var_1 -> + happyIn44 + (happy_var_1 + )} + +happyReduce_100 = happySpecReduce_3 37# happyReduction_100 +happyReduction_100 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut45 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut46 happy_x_3 of { happy_var_3 -> + happyIn45 + (Difference ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_101 = happySpecReduce_1 37# happyReduction_101 +happyReduction_101 happy_x_1 + = case happyOut46 happy_x_1 of { happy_var_1 -> + happyIn45 + (happy_var_1 + )} + +happyReduce_102 = happySpecReduce_3 38# happyReduction_102 +happyReduction_102 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut46 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut47 happy_x_3 of { happy_var_3 -> + happyIn46 + (Intersection ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_103 = happySpecReduce_1 38# happyReduction_103 +happyReduction_103 happy_x_1 + = case happyOut47 happy_x_1 of { happy_var_1 -> + happyIn46 + (happy_var_1 + )} + +happyReduce_104 = happySpecReduce_3 39# happyReduction_104 +happyReduction_104 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut47 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut48 happy_x_3 of { happy_var_3 -> + happyIn47 + (Domain ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_105 = happySpecReduce_1 39# happyReduction_105 +happyReduction_105 happy_x_1 + = case happyOut48 happy_x_1 of { happy_var_1 -> + happyIn47 + (happy_var_1 + )} + +happyReduce_106 = happySpecReduce_3 40# happyReduction_106 +happyReduction_106 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut48 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut49 happy_x_3 of { happy_var_3 -> + happyIn48 + (Range ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_107 = happySpecReduce_1 40# happyReduction_107 +happyReduction_107 happy_x_1 + = case happyOut49 happy_x_1 of { happy_var_1 -> + happyIn48 + (happy_var_1 + )} + +happyReduce_108 = happySpecReduce_3 41# happyReduction_108 +happyReduction_108 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut49 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut50 happy_x_3 of { happy_var_3 -> + happyIn49 + (Join ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_109 = happySpecReduce_1 41# happyReduction_109 +happyReduction_109 happy_x_1 + = case happyOut50 happy_x_1 of { happy_var_1 -> + happyIn49 + (happy_var_1 + )} + +happyReduce_110 = happySpecReduce_1 42# happyReduction_110 +happyReduction_110 happy_x_1 + = case happyOut29 happy_x_1 of { happy_var_1 -> + happyIn50 + (ClaferId ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_111 = happySpecReduce_3 42# happyReduction_111 +happyReduction_111 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut44 happy_x_2 of { happy_var_2 -> + happyIn50 + (happy_var_2 + )} + +happyReduce_112 = happySpecReduce_3 43# happyReduction_112 +happyReduction_112 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut60 happy_x_1 of { happy_var_1 -> + case happyOutTok happy_x_2 of { happy_var_2 -> + case happyOut44 happy_x_3 of { happy_var_3 -> + happyIn51 + (Decl ((mkCatSpan happy_var_1) >- (mkTokenSpan happy_var_2) >- (mkCatSpan happy_var_3)) happy_var_1 happy_var_3 + )}}} + +happyReduce_113 = happySpecReduce_1 44# happyReduction_113 +happyReduction_113 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn52 + (QuantNo ((mkTokenSpan happy_var_1)) + )} + +happyReduce_114 = happySpecReduce_1 44# happyReduction_114 +happyReduction_114 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn52 + (QuantNot ((mkTokenSpan happy_var_1)) + )} + +happyReduce_115 = happySpecReduce_1 44# happyReduction_115 +happyReduction_115 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn52 + (QuantLone ((mkTokenSpan happy_var_1)) + )} + +happyReduce_116 = happySpecReduce_1 44# happyReduction_116 +happyReduction_116 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn52 + (QuantOne ((mkTokenSpan happy_var_1)) + )} + +happyReduce_117 = happySpecReduce_1 44# happyReduction_117 +happyReduction_117 happy_x_1 + = case happyOutTok happy_x_1 of { happy_var_1 -> + happyIn52 + (QuantSome ((mkTokenSpan happy_var_1)) + )} + +happyReduce_118 = happySpecReduce_1 45# happyReduction_118 +happyReduction_118 happy_x_1 + = case happyOut11 happy_x_1 of { happy_var_1 -> + happyIn53 + (EnumIdIdent ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_119 = happySpecReduce_1 46# happyReduction_119 +happyReduction_119 happy_x_1 + = case happyOut11 happy_x_1 of { happy_var_1 -> + happyIn54 + (ModIdIdent ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_120 = happySpecReduce_1 47# happyReduction_120 +happyReduction_120 happy_x_1 + = case happyOut11 happy_x_1 of { happy_var_1 -> + happyIn55 + (LocIdIdent ((mkCatSpan happy_var_1)) happy_var_1 + )} + +happyReduce_121 = happySpecReduce_0 48# happyReduction_121 +happyReduction_121 = happyIn56 + ([] + ) + +happyReduce_122 = happySpecReduce_2 48# happyReduction_122 +happyReduction_122 happy_x_2 + happy_x_1 + = case happyOut56 happy_x_1 of { happy_var_1 -> + case happyOut13 happy_x_2 of { happy_var_2 -> + happyIn56 + (flip (:) happy_var_1 happy_var_2 + )}} + +happyReduce_123 = happySpecReduce_1 49# happyReduction_123 +happyReduction_123 happy_x_1 + = case happyOut53 happy_x_1 of { happy_var_1 -> + happyIn57 + ((:[]) happy_var_1 + )} + +happyReduce_124 = happySpecReduce_3 49# happyReduction_124 +happyReduction_124 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut53 happy_x_1 of { happy_var_1 -> + case happyOut57 happy_x_3 of { happy_var_3 -> + happyIn57 + ((:) happy_var_1 happy_var_3 + )}} + +happyReduce_125 = happySpecReduce_0 50# happyReduction_125 +happyReduction_125 = happyIn58 + ([] + ) + +happyReduce_126 = happySpecReduce_2 50# happyReduction_126 +happyReduction_126 happy_x_2 + happy_x_1 + = case happyOut58 happy_x_1 of { happy_var_1 -> + case happyOut20 happy_x_2 of { happy_var_2 -> + happyIn58 + (flip (:) happy_var_1 happy_var_2 + )}} + +happyReduce_127 = happySpecReduce_0 51# happyReduction_127 +happyReduction_127 = happyIn59 + ([] + ) + +happyReduce_128 = happySpecReduce_2 51# happyReduction_128 +happyReduction_128 happy_x_2 + happy_x_1 + = case happyOut59 happy_x_1 of { happy_var_1 -> + case happyOut30 happy_x_2 of { happy_var_2 -> + happyIn59 + (flip (:) happy_var_1 happy_var_2 + )}} + +happyReduce_129 = happySpecReduce_1 52# happyReduction_129 +happyReduction_129 happy_x_1 + = case happyOut55 happy_x_1 of { happy_var_1 -> + happyIn60 + ((:[]) happy_var_1 + )} + +happyReduce_130 = happySpecReduce_3 52# happyReduction_130 +happyReduction_130 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut55 happy_x_1 of { happy_var_1 -> + case happyOut60 happy_x_3 of { happy_var_3 -> + happyIn60 + ((:) happy_var_1 happy_var_3 + )}} + +happyReduce_131 = happySpecReduce_1 53# happyReduction_131 +happyReduction_131 happy_x_1 + = case happyOut54 happy_x_1 of { happy_var_1 -> + happyIn61 + ((:[]) happy_var_1 + )} + +happyReduce_132 = happySpecReduce_3 53# happyReduction_132 +happyReduction_132 happy_x_3 + happy_x_2 + happy_x_1 + = case happyOut54 happy_x_1 of { happy_var_1 -> + case happyOut61 happy_x_3 of { happy_var_3 -> + happyIn61 + ((:) happy_var_1 happy_var_3 + )}} + +happyNewToken action sts stk [] = + happyDoAction 68# notHappyAtAll action sts stk [] + +happyNewToken action sts stk (tk:tks) = + let cont i = happyDoAction i tk action sts stk tks in + case tk of { + PT _ (TS _ 1) -> cont 1#; + PT _ (TS _ 2) -> cont 2#; + PT _ (TS _ 3) -> cont 3#; + PT _ (TS _ 4) -> cont 4#; + PT _ (TS _ 5) -> cont 5#; + PT _ (TS _ 6) -> cont 6#; + PT _ (TS _ 7) -> cont 7#; + PT _ (TS _ 8) -> cont 8#; + PT _ (TS _ 9) -> cont 9#; + PT _ (TS _ 10) -> cont 10#; + PT _ (TS _ 11) -> cont 11#; + PT _ (TS _ 12) -> cont 12#; + PT _ (TS _ 13) -> cont 13#; + PT _ (TS _ 14) -> cont 14#; + PT _ (TS _ 15) -> cont 15#; + PT _ (TS _ 16) -> cont 16#; + PT _ (TS _ 17) -> cont 17#; + PT _ (TS _ 18) -> cont 18#; + PT _ (TS _ 19) -> cont 19#; + PT _ (TS _ 20) -> cont 20#; + PT _ (TS _ 21) -> cont 21#; + PT _ (TS _ 22) -> cont 22#; + PT _ (TS _ 23) -> cont 23#; + PT _ (TS _ 24) -> cont 24#; + PT _ (TS _ 25) -> cont 25#; + PT _ (TS _ 26) -> cont 26#; + PT _ (TS _ 27) -> cont 27#; + PT _ (TS _ 28) -> cont 28#; + PT _ (TS _ 29) -> cont 29#; + PT _ (TS _ 30) -> cont 30#; + PT _ (TS _ 31) -> cont 31#; + PT _ (TS _ 32) -> cont 32#; + PT _ (TS _ 33) -> cont 33#; + PT _ (TS _ 34) -> cont 34#; + PT _ (TS _ 35) -> cont 35#; + PT _ (TS _ 36) -> cont 36#; + PT _ (TS _ 37) -> cont 37#; + PT _ (TS _ 38) -> cont 38#; + PT _ (TS _ 39) -> cont 39#; + PT _ (TS _ 40) -> cont 40#; + PT _ (TS _ 41) -> cont 41#; + PT _ (TS _ 42) -> cont 42#; + PT _ (TS _ 43) -> cont 43#; + PT _ (TS _ 44) -> cont 44#; + PT _ (TS _ 45) -> cont 45#; + PT _ (TS _ 46) -> cont 46#; + PT _ (TS _ 47) -> cont 47#; + PT _ (TS _ 48) -> cont 48#; + PT _ (TS _ 49) -> cont 49#; + PT _ (TS _ 50) -> cont 50#; + PT _ (TS _ 51) -> cont 51#; + PT _ (TS _ 52) -> cont 52#; + PT _ (TS _ 53) -> cont 53#; + PT _ (TS _ 54) -> cont 54#; + PT _ (TS _ 55) -> cont 55#; + PT _ (TS _ 56) -> cont 56#; + PT _ (TS _ 57) -> cont 57#; + PT _ (TS _ 58) -> cont 58#; + PT _ (TS _ 59) -> cont 59#; + PT _ (TS _ 60) -> cont 60#; + PT _ (TS _ 61) -> cont 61#; + PT _ (TS _ 62) -> cont 62#; + PT _ (T_PosInteger _) -> cont 63#; + PT _ (T_PosDouble _) -> cont 64#; + PT _ (T_PosString _) -> cont 65#; + PT _ (T_PosIdent _) -> cont 66#; + _ -> cont 67#; + _ -> happyError' (tk:tks) + } + +happyError_ 68# tk tks = happyError' tks +happyError_ _ tk tks = happyError' (tk:tks) + +happyThen :: () => Err a -> (a -> Err b) -> Err b +happyThen = (thenM) +happyReturn :: () => a -> Err a +happyReturn = (returnM) +happyThen1 m k tks = (thenM) m (\a -> k a tks) +happyReturn1 :: () => a -> b -> Err a +happyReturn1 = \a tks -> (returnM) a +happyError' :: () => [(Token)] -> Err a +happyError' = happyError + +pModule tks = happySomeParser where + happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut12 x)) + +pClafer tks = happySomeParser where + happySomeParser = happyThen (happyParse 1# tks) (\x -> happyReturn (happyOut14 x)) + +pConstraint tks = happySomeParser where + happySomeParser = happyThen (happyParse 2# tks) (\x -> happyReturn (happyOut15 x)) + +pSoftConstraint tks = happySomeParser where + happySomeParser = happyThen (happyParse 3# tks) (\x -> happyReturn (happyOut16 x)) + +pGoal tks = happySomeParser where + happySomeParser = happyThen (happyParse 4# tks) (\x -> happyReturn (happyOut17 x)) happySeq = happyDontSeq
src-cmd/clafer.hs view
@@ -23,189 +23,29 @@ module Main where import Prelude hiding (writeFile, readFile, print, putStrLn) -import qualified Data.Map as Map -import qualified Data.List as List -import Data.List.Split -import Data.Maybe -import Control.Monad.State + import System.IO -import System.Process -import System.Exit import System.Timeout -import System.FilePath (dropExtension,takeBaseName) -import System.Process (readProcessWithExitCode) +import System.Process (system) -import Paths_clafer import Language.Clafer -import Language.ClaferT -import Language.Clafer.Css import Language.Clafer.ClaferArgs -import Language.Clafer.JSONMetaData -import Language.Clafer.QNameUID -import Language.Clafer.Intermediate.Intclafer -import Language.Clafer.Generator.Html (highlightErrors) -import Language.Clafer.Generator.Graph (genSimpleGraph) -putStrV :: VerbosityL -> String -> IO () -putStrV v s = if v > 1 then putStrLn s else return () - -run :: VerbosityL -> ClaferArgs -> InputModel -> IO () -run _ args' input = - do - result <- runClaferT args' $ - do - addFragments $ fragments input - parse - compile - fs <- save args' - when (validate args') $ forM_ fs (liftIO . runValidate args' ) - if Html `elem` (mode args') - then htmlCatch result args' input - else return () - result `cth` handleErrs - where - cth (Left err) f = f err - cth (Right r) _ = return r - addFragments [] = return () - addFragments (x:xs) = addModuleFragment x >> addFragments xs - fragments model = map unlines $ fragments' $ lines model - fragments' [] = [] - fragments' ("//# FRAGMENT":xs) = fragments' xs - fragments' model = takeWhile (/= "//# FRAGMENT") model : fragments' (dropWhile (/= "//# FRAGMENT") model) --- htmlCatch :: Either ClaferErr CompilerResult -> ClaferArgs -> String -> IO(CompilerResult) - htmlCatch (Right r) _ _ = return r - htmlCatch (Left err) args'' model = - do let f = (dropExtension $ file args'') ++ ".html" - let result = (if (self_contained args'') then header ++ "<style>" ++ css ++ "</style>" ++ "</head>\n<body>\n<pre>\n" else "") ++ highlightErrors model err ++ - (if (self_contained args'') then "\n</pre>\n</html>" else "") - liftIO $ if console_output args'' then putStrLn result else writeFile f result - - handleErrs = mapM_ handleErr - - handleErr (ClaferErr mesg) = - do - putStrLn "\nError...\n" - putStrLn mesg - exitFailure - -- We only use one fragment. Fragment id and position is not useful to us. We - -- only care about the position relative to - handleErr (ParseErr ErrPos{modelPos = Pos l c} mesg) = - do - putStrLn $ "\nParse failed at line " ++ show l ++ " column " ++ show c ++ "..." - putStrLn mesg - exitFailure - handleErr (SemanticErr ErrPos{modelPos = Pos l c} mesg) = - do - putStrLn $ "\nCompile error at line " ++ show l ++ " column " ++ show c ++ "..." - putStrLn mesg - exitFailure - -save :: MonadIO m => ClaferArgs -> ClaferT m [ String ] -save args'= - do - resultsMap <- generate - let results = snd $ List.unzip $ Map.toList resultsMap - -- print stats only once - when (not $ no_stats args') $ liftIO $ printStats results - -- save the outputs - (iModule, _, _) <- getIr - forM results $ saveResult iModule resultsMap - where - -- saveResult :: MonadIO m => CompilerResult -> IModule -> (Map.Map ClaferMode CompilerResult) -> ClaferT m String - saveResult iModule' resultsMap' result@CompilerResult { extension } = do - result' <- if (add_graph args') && (Html `elem` (mode args') && ("dot" `List.isSuffixOf` (extension))) - then do - ast' <- getAst - (_, graph, _) <- liftIO $ readProcessWithExitCode "dot" ["-Tsvg"] $ genSimpleGraph ast' iModule' (takeBaseName $ file args') (show_references args') - return $ summary graph result - else return result - let f = dropExtension $ file args' - let f' = f ++ "." ++ extension - liftIO $ if console_output args' then putStrLn (outputCode result') else writeFile f' (outputCode result') - liftIO $ when (alloy_mapping args') $ writeFile (f ++ ".map") $ show (mappingToAlloy result') - let - qNameMaps :: QNameMaps - qNameMaps = deriveQNameMaps iModule' - liftIO $ when (meta_data args') $ writeFile (f ++ ".cfr-map") $ generateJSONnameUIDMap qNameMaps - liftIO $ when (meta_data args' && inScopeModes) $ writeFile (f ++ ".cfr-scope") $ generateJSONScopes qNameMaps $ getScopesList resultsMap' - return f' - saveResult _ _ NoCompilerResult { reason } = do - liftIO $ putStrLn reason - return "" - printStats :: [CompilerResult] -> IO () - printStats [] = putStrLn "No compiler output." - printStats (r:rs) = case r of - CompilerResult { statistics } -> putStrLn statistics - (NoCompilerResult _) -> printStats rs - - inScopeModes :: Bool - inScopeModes = - Alloy `elem` mode args' || - Alloy42 `elem` mode args' || - Choco `elem` mode args' - - getScopesList :: (Map.Map ClaferMode CompilerResult) -> [(UID, Integer)] - getScopesList resultsMap = - let - alloyResult = Map.lookup Alloy resultsMap - alloy42Result = Map.lookup Alloy42 resultsMap - chocoResult = Map.lookup Choco resultsMap - in - if (isNothing alloyResult) - then if (isNothing alloy42Result) - then if (isNothing chocoResult) - then [] - else scopesList $ fromJust chocoResult - else scopesList $ fromJust alloy42Result - else scopesList $ fromJust alloyResult - -summary :: String -> CompilerResult -> CompilerResult -summary graph result = result{outputCode=unlines $ summary' graph ("<pre>" ++ statistics result ++ "</pre>") (lines $ outputCode result)} - -summary' :: String -> String -> [String] -> [String] -summary' _ _ [] = [] -summary' graph stats ("<!-- # SUMMARY /-->":xs) = graph:stats:summary' graph stats xs -summary' graph stats ("<!-- # STATS /-->":xs) = stats:summary' graph stats xs -summary' graph stats ("<!-- # GRAPH /-->":xs) = graph:summary' graph stats xs -summary' graph stats ("<!-- # CVLGRAPH /-->":xs) = graph:summary' graph stats xs -summary' graph stats (x:xs) = x:summary' graph stats xs - -conPutStrLn :: ClaferArgs -> String -> IO () -conPutStrLn args' s = when (not $ console_output args') $ putStrLn s - -runValidate :: ClaferArgs -> String -> IO () -runValidate args' fo = do - let path = (tooldir args') ++ "/" - liftIO $ putStrLn ("Validating '" ++ fo ++"'") - let modes = mode args' - when (Xml `elem` modes && "xml" `List.isSuffixOf` fo) $ do - writeFile "ClaferIR.xsd" claferIRXSD - voidf $ system $ "java -classpath " ++ path ++ " XsdCheck ClaferIR.xsd " ++ fo - when (Alloy `elem` modes && "als41" `List.isSuffixOf` fo) $ do - voidf $ system $ validateAlloy path "4" ++ fo - when (Alloy42 `elem` modes && "als" `List.isSuffixOf` fo) $ do - voidf $ system $ validateAlloy path "4.2" ++ fo - when (Clafer `elem` modes && "des.cfr" `List.isSuffixOf` fo) $ do - voidf $ system $ "../dist/build/clafer/clafer -s -m=clafer " ++ fo - -validateAlloy :: String -> String -> String -validateAlloy path version = "java -cp " ++ path ++ "alloy" ++ version ++ ".jar edu.mit.csail.sdg.alloy4whole.ExampleUsingTheCompiler " - main :: IO () main = do (args', model) <- mainArgs let timeInSec = (timeout_analysis args') * 10^(6::Integer) if timeInSec > 0 - then timeout timeInSec $ start 2 args' model - else Just `liftM` start 2 args' model + then timeout timeInSec $ start args' model + else Just `fmap` start args' model return () -start :: VerbosityL -> ClaferArgs -> InputModel-> IO () -start v args' model = if schema args' +start :: ClaferArgs -> InputModel-> IO () +start args' model = if schema args' then putStrLn claferIRXSD else if ecore2clafer args' then runEcore2Clafer (file args') $ (tooldir args') - else run v args' model + else runCompiler Nothing args' model runEcore2Clafer :: FilePath -> FilePath -> IO () runEcore2Clafer ecoreFile toolPath
+ src/GetURL.hs view
@@ -0,0 +1,24 @@+-- (c) Simon Marlow 2011, see the file LICENSE for copying terms. + +-- Simple wrapper around HTTP, allowing proxy use + +module GetURL (getURL) where + +import Network.HTTP +import Network.Browser +import Network.URI + +getURL :: String -> IO String +getURL url = do + Network.Browser.browse $ do + setCheckForProxy True + setDebugLog Nothing + setOutHandler (const (return ())) + (_, rsp) <- request (getRequest' (escapeURIString isUnescapedInURI url)) + return (rspBody rsp) + where + getRequest' :: String -> Request String + getRequest' urlString = + case parseURI urlString of + Nothing -> error ("getRequest: Not a valid URL - " ++ urlString) + Just u -> mkRequest GET u
src/Language/Clafer.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable, NamedFieldPuns #-} {- Copyright (C) 2012-2014 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca> @@ -63,9 +64,11 @@ Use "catchErrs" to catch the errors. -} -module Language.Clafer (addModuleFragment, +module Language.Clafer (runCompiler, + addModuleFragment, compile, parse, + desugar, generate, generateHtml, generateFragments, @@ -76,7 +79,6 @@ putEnv, CompilerResult(..), claferIRXSD, - VerbosityL, InputModel, Token, Module, @@ -100,10 +102,13 @@ import qualified Data.Map as Map import Data.Ord import Control.Monad +import Control.Monad.State import Control.Lens.Plated -import System.FilePath (takeBaseName) +import System.Exit +import System.FilePath (dropExtension,takeBaseName) +import System.Process (readProcessWithExitCode, system) -import Language.ClaferT +import Language.ClaferT import Language.Clafer.Common import Language.Clafer.Front.ErrM import Language.Clafer.ClaferArgs hiding (Clafer) @@ -113,7 +118,7 @@ import Language.Clafer.Front.Lexclafer import Language.Clafer.Front.Parclafer import Language.Clafer.Front.Printclafer -import Language.Clafer.Front.Absclafer +import Language.Clafer.Front.Absclafer import Language.Clafer.Front.LayoutResolver import Language.Clafer.Intermediate.Tracing import Language.Clafer.Intermediate.Intclafer @@ -125,16 +130,172 @@ import Language.Clafer.Optimizer.Optimizer import Language.Clafer.Generator.Alloy import Language.Clafer.Generator.Choco +import Language.Clafer.Generator.Concat import Language.Clafer.Generator.Xml import Language.Clafer.Generator.Python import Language.Clafer.Generator.Schema import Language.Clafer.Generator.Stats import Language.Clafer.Generator.Html import Language.Clafer.Generator.Graph +import Language.Clafer.JSONMetaData +import Language.Clafer.QNameUID -type VerbosityL = Int type InputModel = String +-- | Run the Clafer compiler. +-- mURL = Nothing means compile the top-level module +-- mURL = Just url means compile an imported module from the given url +runCompiler :: Maybe URL -> ClaferArgs -> InputModel -> IO () +runCompiler mURL args' inputModel = + do + result <- runClaferT args' $ + do + forM_ (fragments inputModel) addModuleFragment + parse + iModule <- desugar mURL + {- need to runCompiler on imports + liftIO $ do + forM_ (_mModules iModule) $ \url -> do + -- use the same args just change the file name + importedModel <- retrieveModelFromURL url + runCompiler (Just url) (args' { file = getFileName url }) importedModel + -} + compile iModule + fs <- save args' + when (validate args') $ forM_ fs (liftIO . runValidate args' ) + if Html `elem` (mode args') + then htmlCatch result args' inputModel + else return () + result `cth` handleErrs + where + cth (Left err) f = f err + cth (Right r) _ = return r + fragments model = map unlines $ fragments' $ lines model + fragments' [] = [] + fragments' ("//# FRAGMENT":xs) = fragments' xs + fragments' model = takeWhile (/= "//# FRAGMENT") model : fragments' (dropWhile (/= "//# FRAGMENT") model) +-- htmlCatch :: Either ClaferErr CompilerResult -> ClaferArgs -> String -> IO(CompilerResult) + htmlCatch (Right r) _ _ = return r + htmlCatch (Left err) args'' model = + do let f = (dropExtension $ file args'') ++ ".html" + let result = (if (self_contained args'') + then Css.header ++ "<style>" ++ Css.css ++ "</style>" ++ "</head>\n<body>\n<pre>\n" + else "") + ++ highlightErrors model err ++ + (if (self_contained args'') + then "\n</pre>\n</html>" + else "") + liftIO $ if console_output args'' then putStrLn result else writeFile f result + + handleErrs = mapM_ handleErr + + handleErr (ClaferErr mesg) = + do + putStrLn "\nError...\n" + putStrLn mesg + exitFailure + -- We only use one fragment. Fragment id and position is not useful to us. We + -- only care about the position relative to + handleErr (ParseErr ErrPos{modelPos = Pos l c} mesg) = + do + putStrLn $ "\nParse failed at line " ++ show l ++ " column " ++ show c ++ "..." + putStrLn mesg + exitFailure + handleErr (SemanticErr ErrPos{modelPos = Pos l c} mesg) = + do + putStrLn $ "\nCompile error at line " ++ show l ++ " column " ++ show c ++ "..." + putStrLn mesg + exitFailure + +save :: MonadIO m => ClaferArgs -> ClaferT m [ String ] +save args'= + do + resultsMap <- generate + let results = snd $ unzip $ Map.toList resultsMap + -- print stats only once + when (not $ no_stats args') $ liftIO $ printStats results + -- save the outputs + (iModule, _, _) <- getIr + forM results $ saveResult iModule resultsMap + where + -- saveResult :: MonadIO m => CompilerResult -> IModule -> (Map.Map ClaferMode CompilerResult) -> ClaferT m String + saveResult iModule' resultsMap' result@CompilerResult { extension } = do + result' <- if (add_graph args') && (Html `elem` (mode args') && ("dot" `isSuffixOf` (extension))) + then do + ast' <- getAst + (_, graph, _) <- liftIO $ readProcessWithExitCode "dot" ["-Tsvg"] $ genSimpleGraph ast' iModule' (takeBaseName $ file args') (show_references args') + return $ summary graph result + else return result + let f = dropExtension $ file args' + let f' = f ++ "." ++ extension + liftIO $ if console_output args' then putStrLn (outputCode result') else writeFile f' (outputCode result') + liftIO $ when (alloy_mapping args') $ writeFile (f ++ ".map") $ show (mappingToAlloy result') + let + qNameMaps :: QNameMaps + qNameMaps = deriveQNameMaps iModule' + liftIO $ when (meta_data args') $ writeFile (f ++ ".cfr-map") $ generateJSONnameUIDMap qNameMaps + liftIO $ when (meta_data args' && inScopeModes) $ writeFile (f ++ ".cfr-scope") $ generateJSONScopes qNameMaps $ getScopesList resultsMap' + return f' + saveResult _ _ NoCompilerResult { reason } = do + liftIO $ putStrLn reason + return "" + printStats :: [CompilerResult] -> IO () + printStats [] = putStrLn "No compiler output." + printStats (r:rs) = case r of + CompilerResult { statistics } -> putStrLn statistics + (NoCompilerResult _) -> printStats rs + + inScopeModes :: Bool + inScopeModes = + Alloy `elem` mode args' || + Alloy42 `elem` mode args' || + Choco `elem` mode args' + + getScopesList :: (Map.Map ClaferMode CompilerResult) -> [(UID, Integer)] + getScopesList resultsMap = + let + alloyResult = Map.lookup Alloy resultsMap + alloy42Result = Map.lookup Alloy42 resultsMap + chocoResult = Map.lookup Choco resultsMap + in + if (isNothing alloyResult) + then if (isNothing alloy42Result) + then if (isNothing chocoResult) + then [] + else scopesList $ fromJust chocoResult + else scopesList $ fromJust alloy42Result + else scopesList $ fromJust alloyResult + +summary :: String -> CompilerResult -> CompilerResult +summary graph result = result{outputCode=unlines $ summary' graph ("<pre>" ++ statistics result ++ "</pre>") (lines $ outputCode result)} + +summary' :: String -> String -> [String] -> [String] +summary' _ _ [] = [] +summary' graph stats ("<!-- # SUMMARY /-->":xs) = graph:stats:summary' graph stats xs +summary' graph stats ("<!-- # STATS /-->":xs) = stats:summary' graph stats xs +summary' graph stats ("<!-- # GRAPH /-->":xs) = graph:summary' graph stats xs +summary' graph stats ("<!-- # CVLGRAPH /-->":xs) = graph:summary' graph stats xs +summary' graph stats (x:xs) = x:summary' graph stats xs + +runValidate :: ClaferArgs -> String -> IO () +runValidate args' fo = do + let path = (tooldir args') ++ "/" + liftIO $ putStrLn ("Validating '" ++ fo ++"'") + let modes = mode args' + when (Xml `elem` modes && "xml" `isSuffixOf` fo) $ do + writeFile "ClaferIR.xsd" claferIRXSD + voidf $ system $ "java -classpath " ++ path ++ " XsdCheck ClaferIR.xsd " ++ fo + when (Alloy `elem` modes && "als41" `isSuffixOf` fo) $ do + voidf $ system $ validateAlloy path "4" ++ fo + when (Alloy42 `elem` modes && "als" `isSuffixOf` fo) $ do + voidf $ system $ validateAlloy path "4.2" ++ fo + when (Mode.Clafer `elem` modes && "des.cfr" `isSuffixOf` fo) $ do + voidf $ system $ "../dist/build/clafer/clafer -s -m=clafer " ++ fo + +validateAlloy :: String -> String -> String +validateAlloy path version = "java -cp " ++ path ++ "alloy" ++ version ++ ".jar edu.mit.csail.sdg.alloy4whole.ExampleUsingTheCompiler " + + -- | Add a new fragment to the model. Fragments should be added in order. addModuleFragment :: Monad m => InputModel -> ClaferT m () addModuleFragment i = @@ -162,7 +323,7 @@ "" -> [] ('\n' : r) -> lines' r x -> error $ "linesing " ++ x -- How can it be nonempty and not start with a newline after the break? Should never happen. - + -- | Converts the Err monads (created by the BNFC parser generator) to ClaferT liftParseErrs :: Monad m => [Err a] -> ClaferT m [a] liftParseErrs e = @@ -178,7 +339,7 @@ -- Bad maps to ParseErr return $ Left $ ParseErr (ErrFragPos frgId p) s --- | Converts one Err. liftParseErrs is better if you want to report multiple errors. +-- | Converts one Err. liftParseErrs is better if you want to report multiple errors. -- | This method will only report one before ceasing execution. liftParseErr :: Monad m => Err a -> ClaferT m a liftParseErr e = head `liftM` liftParseErrs [e] @@ -219,34 +380,35 @@ completeAst <- (parseFrag $ args env) completeModel liftParseErr completeAst - let env' = env{ cAst = Just ast, astModuleTrace = traceAstModule ast } - putEnv env' + putEnv env{ cAst = Just ast, astModuleTrace = traceAstModule ast } where parseFrag :: (Monad m) => ClaferArgs -> String -> ClaferT m (Err Module) parseFrag args' = (>>= (return . pModule)) . - (if not + (if not ((new_layout args') || (no_layout args')) - then - resolveLayout - else - return) + then + resolveLayout + else + return) . myLexer . (if (not $ no_layout args') && (new_layout args') - then - resLayout - else + then + resLayout + else id) --- | Compiles the AST into IR. -compile :: Monad m => ClaferT m () -compile = - do +desugar :: Monad m => Maybe URL -> ClaferT m IModule +desugar mURL = do + ast' <- getAst + return $ desugarModule mURL ast' + +-- | Compiles the AST into IR. +compile :: Monad m => IModule -> ClaferT m () +compile desugaredMod = do env <- getEnv - ast' <- getAst - let desugaredMod = desugar ast' let clafersWithKeyWords = foldMapIR isKeyWord desugaredMod when (""/=clafersWithKeyWords) $ throwErr (ClaferErr $ ("The model contains clafers with keywords as names in the following places:\n"++) $ clafersWithKeyWords :: CErr Span) ir <- analyze (args env) desugaredMod @@ -254,13 +416,13 @@ let spanList = foldMapIR gt1 imodule when ((afm $ args env) && spanList/="") $ throwErr (ClaferErr $ ("The model is not an attributed feature model.\nThe following places contain cardinality larger than 1:\n"++) $ spanList :: CErr Span) - putEnv $ env{ cIr = Just ir, irModuleTrace = traceIrModule imodule } + putEnv $ env{ cIr = Just ir } where isKeyWord :: Ir -> String - isKeyWord (IRClafer IClafer{_cinPos = (Span (Pos l c) _) ,_ident=i}) = if (i `elem` keyWords) then ("Line " ++ show l ++ " column " ++ show c ++ "\n") else "" + isKeyWord (IRClafer IClafer{_cinPos = (Span (Pos l c) _) ,_ident=i}) = if (i `elem` keywordIdents) then ("Line " ++ show l ++ " column " ++ show c ++ "\n") else "" isKeyWord _ = "" gt1 :: Ir -> String - gt1 (IRClafer (IClafer (Span (Pos l c) _) False _ _ _ _ (Just (_, m)) _ _)) = if (m > 1 || m < 0) then ("Line " ++ show l ++ " column " ++ show c ++ "\n") else "" + gt1 (IRClafer (IClafer (Span (Pos l c) _) False _ _ _ _ _ _ (Just (_, m)) _ _)) = if (m > 1 || m < 0) then ("Line " ++ show l ++ " column " ++ show c ++ "\n") else "" gt1 _ = "" -- | Splits the IR into their fragments, and generates the output for each fragment. @@ -272,15 +434,15 @@ env <- getEnv (iModule, _, _) <- getIr fragElems <- fragment (sortBy (comparing rnge) $ _mDecls iModule) (frags env) - + -- Assumes output mode is Alloy for now - + return $ map (generateFragment $ args env) fragElems where rnge (IEClafer IClafer{_cinPos = p}) = p rnge IEConstraint{_cpexp = PExp{_inPos = p}} = p rnge IEGoal{_cpexp = PExp{_inPos = p}} = p - + -- Groups IElements by their fragments. -- elems must be sorted by range. fragment :: (Monad m) => [IElement] -> [Pos] -> ClaferT m [[IElement]] @@ -290,7 +452,7 @@ where (curFrag, restFrags) = span (`beforePos` frag) elems fragment _ [] = throwErr $ (ClaferErr $ "Unexpected fragment." :: CErr Span) -- Should not happen. Bug. - + beforePos ele p = case rnge ele of Span _ e -> e <= p @@ -299,9 +461,9 @@ flatten $ cconcat $ map (genDeclaration args') frag -- | Splits the AST into their fragments, and generates the output for each fragment. -generateHtml :: ClaferEnv -> Module -> String -generateHtml env ast' = - let Module _ decls' = ast'; +generateHtml :: ClaferEnv -> String +generateHtml env = + let (Just (Module _ decls')) = cAst env; cargs = args env; irMap = irModuleTrace env; comments = if add_comments cargs then getComments $ unlines $ modelFrags env else []; @@ -330,7 +492,7 @@ noReals :: IModule -> Bool noReals iModule = reals == [] - where + where iexps :: [ IExp ] iexps = universeOn biplate iModule reals = filter isIDouble iexps @@ -344,27 +506,27 @@ env <- getEnv ast' <- getAst (iModule, genv, au) <- getIr - let + let hasNoReals = noReals iModule cargs = args env modes = mode cargs stats = showStats au $ statsModule iModule scopes = getScopeStrategy (scope_strategy cargs) iModule - return $ Map.fromList ( + return $ Map.fromList ( -- result for Alloy (if (Alloy `elem` modes) then if (hasNoReals) - then - let + then + let (imod,strMap) = astrModule iModule alloyCode = genModule cargs{mode = [Alloy]} (imod, genv) scopes - addCommentStats = if no_stats cargs then const else addStats - in - [ (Alloy, - CompilerResult { - extension = "als41", - outputCode = addCommentStats (fst alloyCode) stats, + addCommentStats = if no_stats cargs then const else addStats + in + [ (Alloy, + CompilerResult { + extension = "als41", + outputCode = addCommentStats (fst alloyCode) stats, statistics = stats, claferEnv = env, mappingToAlloy = fromMaybe [] (Just $ snd alloyCode), @@ -372,27 +534,27 @@ scopesList = scopes }) ] - else [ (Alloy, - NoCompilerResult { - reason = "Alloy output unavailable because the model contains real numbers." + else [ (Alloy, + NoCompilerResult { + reason = "Alloy output unavailable because the model contains real numbers." }) ] else [] - ) + ) ++ -- result for Alloy42 (if (Alloy42 `elem` modes) then if (hasNoReals) then - let + let (imod,strMap) = astrModule iModule alloyCode = genModule cargs{mode = [Alloy42]} (imod, genv) scopes - addCommentStats = if no_stats cargs then const else addStats - in - [ (Alloy42, - CompilerResult { - extension = "als", - outputCode = addCommentStats (fst alloyCode) stats, + addCommentStats = if no_stats cargs then const else addStats + in + [ (Alloy42, + CompilerResult { + extension = "als", + outputCode = addCommentStats (fst alloyCode) stats, statistics = stats, claferEnv = env, mappingToAlloy = fromMaybe [] (Just $ snd alloyCode), @@ -400,19 +562,19 @@ scopesList = scopes }) ] - else [ (Alloy, - NoCompilerResult { - reason = "Alloy output unavailable because the model contains real numbers." + else [ (Alloy, + NoCompilerResult { + reason = "Alloy output unavailable because the model contains real numbers." }) ] else [] - ) - -- result for XML + ) + -- result for XML ++ (if (Xml `elem` modes) then [ (Xml, - CompilerResult { - extension = "xml", - outputCode = genXmlModule iModule, + CompilerResult { + extension = "xml", + outputCode = genXmlModule iModule, statistics = stats, claferEnv = env, mappingToAlloy = [], @@ -424,9 +586,9 @@ -- result for Clafer ++ (if (Mode.Clafer `elem` modes) then [ (Mode.Clafer, - CompilerResult { - extension = "des.cfr", - outputCode = printTree $ sugarModule iModule, + CompilerResult { + extension = "des.cfr", + outputCode = printTree $ sugarModule iModule, statistics = stats, claferEnv = env, mappingToAlloy = [], @@ -435,12 +597,12 @@ }) ] else [] ) - -- result for Html + -- result for Html ++ (if (Html `elem` modes) then [ (Html, - CompilerResult { - extension = "html", - outputCode = generateHtml env ast', + CompilerResult { + extension = "html", + outputCode = generateHtml env, statistics = stats, claferEnv = env, mappingToAlloy = [], @@ -451,9 +613,9 @@ ) ++ (if (Graph `elem` modes) then [ (Graph, - CompilerResult { - extension = "dot", - outputCode = genSimpleGraph ast' iModule (takeBaseName $ file cargs) (show_references cargs), + CompilerResult { + extension = "dot", + outputCode = genSimpleGraph ast' iModule (takeBaseName $ file cargs) (show_references cargs), statistics = stats, claferEnv = env, mappingToAlloy = [], @@ -464,9 +626,9 @@ ) ++ (if (CVLGraph `elem` modes) then [ (CVLGraph, - CompilerResult { - extension = "cvl.dot", - outputCode = genCVLGraph ast' iModule (takeBaseName $ file cargs), + CompilerResult { + extension = "cvl.dot", + outputCode = genCVLGraph ast' iModule (takeBaseName $ file cargs), statistics = stats, claferEnv = env, mappingToAlloy = [], @@ -475,11 +637,11 @@ }) ] else [] ) - -- result for Python + -- result for Python ++ (if (Python `elem` modes) - then [ (Python, - CompilerResult { - extension = "py", + then [ (Python, + CompilerResult { + extension = "py", outputCode = genPythonModule iModule, statistics = stats, claferEnv = env, @@ -489,15 +651,15 @@ }) ] else [] ) - -- result for Choco + -- result for Choco ++ (if (Choco `elem` modes) - then let + then let imod = iModule in - [ (Choco, - CompilerResult { - extension = "js", - outputCode = genCModule cargs (imod, genv) scopes, + [ (Choco, + CompilerResult { + extension = "js", + outputCode = genCModule cargs (imod, genv) scopes, statistics = stats, claferEnv = env, mappingToAlloy = [], @@ -506,37 +668,34 @@ }) ] else [] )) - + -- | Result of generation for a given mode data CompilerResult = CompilerResult { -- | output file extension - extension :: String, + extension :: String, -- | output text - outputCode :: String, + outputCode :: String, statistics :: String, -- | the final environment of the compiler claferEnv :: ClaferEnv, -- | Maps source constraint spans in Alloy to the spans in the IR - mappingToAlloy :: [(Span, IrTrace)], + mappingToAlloy :: [(Span, IrTrace)], -- | Map back from Ints used to represent Strings stringMap :: (Map.Map Int String), -- | scopes generated by scope inference scopesList :: [(UID, Integer)] - } + } | NoCompilerResult { reason :: String } deriving Show -desugar :: Module -> IModule -desugar iModule = desugarModule iModule - liftError :: (Monad m, Language.ClaferT.Throwable t) => Either t a -> ClaferT m a liftError = either throwErr return analyze :: Monad m => ClaferArgs -> IModule -> ClaferT m (IModule, GEnv, Bool) analyze args' iModule = do liftError $ findDupModule args' iModule - let + let au = allUnique iModule let args'' = args'{skip_resolver = au && (skip_resolver args')} (rTree, genv) <- liftError $ resolveModule args'' iModule @@ -548,9 +707,9 @@ showStats :: Bool -> Stats -> String showStats au (Stats na nr nc nconst ngoals sgl) = - unlines [ "All clafers: " ++ (show (na + nr + nc)) ++ " | Abstract: " ++ (show na) ++ " | Concrete: " ++ (show nc) ++ " | References: " ++ (show nr) + unlines [ "All clafers: " ++ (show (na + nc)) ++ " | Abstract: " ++ (show na) ++ " | Concrete: " ++ (show nc) ++ " | References: " ++ (show nr) , "Constraints: " ++ show nconst - , "Goals: " ++ show ngoals + , "Goals: " ++ show ngoals , "Global scope: " ++ showInterval sgl , "Can skip resolver: " ++ if au then "yes" else "no" ] @@ -561,7 +720,3 @@ -- | The XML Schema of the IR claferIRXSD :: String claferIRXSD = Language.Clafer.Generator.Schema.xsd - --- | reserved keywords -keyWords :: [String] -keyWords = ["ref","parent","abstract", "else", "in", "no", "opt", "xor", "all", "enum", "lone", "not", "or", "disj", "extends", "mux", "one", "some"]
src/Language/Clafer/ClaferArgs.hs view
@@ -35,6 +35,8 @@ import Paths_clafer (version) import Data.Version (showVersion) +import GetURL + -- | Type of output to be generated at the end of compilation data ClaferMode = Alloy42 | Alloy | Xml | Clafer | Html | Graph | CVLGraph | Python | Choco deriving (Eq, Show, Ord, Data, Typeable) @@ -105,24 +107,24 @@ } &= summary ("Clafer " ++ showVersion Paths_clafer.version) &= program "clafer" mergeArgs :: ClaferArgs -> ClaferArgs -> ClaferArgs -mergeArgs a1 a2 = ClaferArgs (mode a1) (coMergeArg) - (mergeArg flatten_inheritance) (mergeArg timeout_analysis) - (mergeArg no_layout) (mergeArg new_layout) - (mergeArg check_duplicates) (mergeArg skip_resolver) +mergeArgs a1 a2 = ClaferArgs (mode a1) (coMergeArg) + (mergeArg flatten_inheritance) (mergeArg timeout_analysis) + (mergeArg no_layout) (mergeArg new_layout) + (mergeArg check_duplicates) (mergeArg skip_resolver) (mergeArg keep_unused) (mergeArg no_stats) (mergeArg schema) - (mergeArg validate) (mergeArg noalloyruncommand) (toolMergeArg) - (mergeArg alloy_mapping) (mergeArg self_contained) - (mergeArg add_graph) (mergeArg show_references) - (mergeArg add_comments) (mergeArg ecore2clafer) - (mergeArg scope_strategy) (mergeArg afm) (mergeArg skip_goals) + (mergeArg validate) (mergeArg noalloyruncommand) (toolMergeArg) + (mergeArg alloy_mapping) (mergeArg self_contained) + (mergeArg add_graph) (mergeArg show_references) + (mergeArg add_comments) (mergeArg ecore2clafer) + (mergeArg scope_strategy) (mergeArg afm) (mergeArg skip_goals) (mergeArg meta_data) (mergeArg file) where coMergeArg :: Bool - coMergeArg = if (r1 /= False) then r1 else + coMergeArg = if (r1 /= False) then r1 else if (r2 /= False) then r2 else (null $ file a1) where r1 = console_output a1;r2 = console_output a2 toolMergeArg :: String - toolMergeArg = if (r1 /= "") then r1 else + toolMergeArg = if (r1 /= "") then r1 else if (r2 /= "") then r2 else "/tools" where r1 = tooldir a1;r2 = tooldir a2 mergeArg :: (Default a, Eq a) => (ClaferArgs -> a) -> a @@ -130,22 +132,29 @@ mainArgs :: IO (ClaferArgs, String) mainArgs = do - args' <- cmdArgs clafer - model <- case file args' of - "" -> hGetContents stdin - f -> readFile f + args' <- cmdArgs clafer + model <- retrieveModelFromURL $ file args' let args'' = argsWithOPTIONS args' model -- Alloy42 should be the default mode but only if nothing else was specified - -- cannot use [ Alloy42 ] as the default in the definition of `clafer :: ClaferArgs` since + -- cannot use [ Alloy42 ] as the default in the definition of `clafer :: ClaferArgs` since -- Alloy42 will always be a mode in addition to the other specified modes (it will become mandatory) let args''' = if null $ mode args'' then args''{mode = [ Alloy42 ]} else args'' return $ (args''', model) +retrieveModelFromURL :: String -> IO String +retrieveModelFromURL url = do + case url of + "" -> hGetContents stdin -- this is the pre-module system behavior + ('f':'i':'l':'e':':':'/':'/':n) -> readFile n + ('h':'t':'t':'p':':':'/':'/':_) -> getURL url + ('f':'t':'p':':':'/':'/':_) -> getURL url + n -> readFile n -- this is the pre-module system behavior + argsWithOPTIONS :: ClaferArgs -> String -> ClaferArgs argsWithOPTIONS args' model = - let + let firstLine = case lines model of [] -> "" (s:_) -> s
src/Language/Clafer/Comments.hs view
@@ -70,14 +70,14 @@ readLine :: String -> Pos -> [(Span, String)] readLine [] _ = [] -readLine xs start@(Pos row col) = let comment = takeWhile (/= '\n') xs in +readLine xs start@(Pos row col) = let comment = takeWhile (/= '\n') xs in ((Span start (Pos row (col + toInteger (length comment)))), comment): getComments' (drop (length comment + 1) xs) (row + 1) 1 -readBlock :: String -> Pos -> [(Span, String)] +readBlock :: String -> Pos -> [(Span, String)] readBlock xs start@(Pos row col) = let (end@(Pos row' col'), comment, rest) = readBlock' xs row col id in - ((Span start end), comment):getComments' rest row' col' + ((Span start end), comment):getComments' rest row' col' readBlock' :: String -> Integer -> Integer -> (String -> String) -> (Pos, String,String)
src/Language/Clafer/Common.hs view
@@ -22,11 +22,16 @@ -} module Language.Clafer.Common where -import Data.Tree -import Data.Maybe -import Data.Char -import Data.List +import Control.Applicative ((<$>)) +import Control.Lens (universeOn) +import Data.Char +import Data.Data.Lens (biplate) +import Data.List import qualified Data.Map as Map +import Data.Maybe +import Data.StringMap (StringMap) +import qualified Data.StringMap as SMap +import Data.Tree import Language.Clafer.Front.Absclafer import Language.Clafer.Intermediate.Intclafer @@ -35,9 +40,8 @@ -- basic functions shared by desugarer, analyzer and code generator type Result = String -transIdent :: PosIdent -> Result -transIdent x = case x of - PosIdent str -> snd str +transIdent :: PosIdent -> String +transIdent (PosIdent (_, str)) = str mkIdent :: String -> PosIdent mkIdent str = PosIdent ((0, 0), str) @@ -47,29 +51,35 @@ type Ident = PosIdent -getSuper :: IClafer -> String -getSuper = getSuperId._supers._super +-- | Returns only [] or [_] +getSuper :: IClafer -> [String] +getSuper claf = case getSuperId <$> _super claf of + Nothing -> [] + Just "clafer" -> error "Bug: The identifier 'clafer' should never be returned as super type" + Just x -> [x] -getSuperNoArr :: IClafer -> String +-- | Returns only [] or [_] +getReference :: IClafer -> [String] +getReference c = case getSuperId <$> _ref <$> _reference c of + Nothing -> [] + Just x -> [x] -getSuperNoArr clafer - | _isOverlapping $ _super clafer = "clafer" - | otherwise = getSuper clafer +-- | Returns only [] or [_] or [_, _] +getSuperAndReference :: IClafer -> [String] +getSuperAndReference c = (getSuper c) ++ (getReference c) -getSuperId :: [PExp] -> String -getSuperId = _sident . Language.Clafer.Intermediate.Intclafer._exp . head +getSuperId :: PExp -> String +getSuperId (PExp _ _ _ (IClaferId{ _sident = s})) = s +getSuperId pexp' = error $ "Bug: getSuperId called not on '[PExp (IClaferId)]' but instead on '" ++ show pexp' ++ "'" isEqClaferId :: String -> IClafer -> Bool -isEqClaferId = flip $ (==)._uid +isEqClaferId uid' claf' = _uid claf' == uid' idToPExp :: String -> Span -> String -> String -> Bool -> PExp -idToPExp pid' pos modids id' isTop' = PExp (Just $ TClafer [id']) pid' pos (IClaferId modids id' isTop') - -mkLClaferId :: String -> Bool -> IExp -mkLClaferId = IClaferId "" +idToPExp pid' pos modids id' isTop' = PExp (Just $ TClafer [id']) pid' pos (IClaferId modids id' isTop' Nothing) -mkPLClaferId :: String -> Bool -> PExp -mkPLClaferId id' isTop' = pExpDefPidPos $ mkLClaferId id' isTop' +mkPLClaferId :: CName -> Bool -> ClaferBinding -> PExp +mkPLClaferId id' isTop' bind' = pExpDefPidPos $ IClaferId "" id' isTop' bind' pExpDefPidPos :: IExp -> PExp pExpDefPidPos = pExpDefPid noSpan @@ -81,22 +91,26 @@ pExpDef = PExp Nothing isParent :: PExp -> Bool -isParent (PExp _ _ _ (IClaferId _ id' _)) = id' == parent +isParent (PExp _ _ _ (IClaferId _ id' _ _)) = id' == parentIdent isParent _ = False isClaferName :: PExp -> Bool -isClaferName (PExp _ _ _ (IClaferId _ id' _)) = - id' `notElem` ([this, parent, children, ref] ++ primitiveTypes) +isClaferName (PExp _ _ _ (IClaferId _ id' _ _)) = + id' `notElem` (specialNames ++ primitiveTypes) isClaferName _ = False isClaferName' :: PExp -> Bool -isClaferName' (PExp _ _ _ (IClaferId _ _ _)) = True +isClaferName' (PExp _ _ _ (IClaferId _ _ _ _)) = True isClaferName' _ = False getClaferName :: PExp -> String -getClaferName (PExp _ _ _ (IClaferId _ id' _)) = id' +getClaferName (PExp _ _ _ (IClaferId _ id' _ _)) = id' getClaferName _ = "" +isTopLevel :: IClafer -> Bool +isTopLevel IClafer{_parentUID=puid} = puid == rootIdent -- for concrete clafers + || puid == baseClafer -- for abstract clafers + -- ----------------------------------------------------------------------------- -- conversions elemToClafer :: IElement -> Maybe IClafer @@ -110,7 +124,7 @@ -- ----------------------------------------------------------------------------- -- finds hierarchy and transforms each element mapHierarchy :: (IClafer -> b) - -> (IClafer -> String) + -> (IClafer -> [String]) -> [IClafer] -> IClafer -> [b] @@ -119,20 +133,32 @@ -- returns inheritance hierarchy of a clafer -findHierarchy :: (IClafer -> String) +findHierarchy :: (IClafer -> [String]) -> [IClafer] -> IClafer -> [IClafer] -findHierarchy sFun clafers clafer - | sFun clafer == "clafer" = [clafer] - | otherwise = if clafer `elem` superClafers - then error $ "Inheritance hierarchy contains a cycle: line " ++ (show $ _cinPos clafer) - else clafer : superClafers +findHierarchy sFun clafers clafer = case sFun clafer of + [] -> [clafer] -- no super and no reference + supersOrRefs -> let + superOrRefClafers = (concatMap findSuper supersOrRefs) + in + clafer : superOrRefClafers ++ concatMap (findHierarchy sFun clafers) superOrRefClafers where - superClafers = unfoldr (\c -> find (isEqClaferId $ sFun c) clafers >>= - Just . (apply id)) clafer + findSuper superUid = filter (\c -> _uid c == superUid) clafers -- ----------------------------------------------------------------------------- +-- map construction functions + +createUidIClaferMap :: IModule -> StringMap IClafer +createUidIClaferMap iModule = foldl' (\accumMap' claf -> SMap.insert (_uid claf) claf accumMap') SMap.empty allClafers + where + allClafers :: [ IClafer ] + allClafers = universeOn biplate iModule + +findIClafer :: StringMap IClafer -> UID -> Maybe IClafer +findIClafer uidIClaferMap uid' = SMap.lookup uid' uidIClaferMap + +-- ----------------------------------------------------------------------------- -- generic functions apply :: forall t t1. (t -> t1) -> t -> (t, t1) @@ -290,7 +316,7 @@ -- ternary operators iIfThenElse :: String -iIfThenElse = "=>else" +iIfThenElse = "ifthenelse" mkIFunExp :: String -> [IExp] -> IExp mkIFunExp _ (x:[]) = x @@ -303,24 +329,33 @@ -- ----------------------------------------------------------------------------- -- Constants -this :: String -this = "this" +rootIdent :: String +rootIdent = "root" -parent :: String -parent = "parent" +rootUID :: String +rootUID = "root" -children :: String -children = "children" +thisIdent :: String +thisIdent = "this" -ref :: String -ref = "ref" +parentIdent :: String +parentIdent = "parent" +refIdent :: String +refIdent = "ref" + +childrenIdent :: String +childrenIdent = "children" + specialNames :: [String] -specialNames = [this, parent, children, ref] +specialNames = [thisIdent, parentIdent, refIdent, rootIdent, childrenIdent] -strType :: String -strType = "string" +isSpecial :: String -> Bool +isSpecial = flip elem specialNames +stringType :: String +stringType = "string" + intType :: String intType = "int" @@ -330,6 +365,9 @@ realType :: String realType = "real" +booleanType :: String +booleanType = "boolean" + baseClafer :: String baseClafer = "clafer" @@ -337,11 +375,24 @@ modSep = "\\" primitiveTypes :: [String] -primitiveTypes = [strType, intType, integerType, realType] +primitiveTypes = [stringType, intType, integerType, realType] isPrimitive :: String -> Bool isPrimitive = flip elem primitiveTypes +-- | reserved keywords which cannot be used as clafer identifiers +keywordIdents :: [String] +keywordIdents = + baseClafer : + specialNames ++ + primitiveTypes ++ + [ iGMax, iGMin, iSumSet ] ++ -- unary operators + [ iXor, iIn ] ++ -- binary operators + [ "if", "then", "else" ] ++ -- ternary operators + [ "no", "not", "some", "one", "all", "disj" ] ++ -- quantifiers + [ "opt", "mux", "or", "lone" ] ++ -- group cardinalities + [ "abstract", "enum" ] -- keywords + data GEnv = GEnv { identCountMap :: Map.Map String Int, expCount :: Int, @@ -352,4 +403,8 @@ voidf :: Monad m => m t -> m () voidf f = do _ <- f - return ()+ return () + +safeTail :: [a] -> [a] +safeTail [] = [] +safeTail (_:xs) = xs
src/Language/Clafer/Css.hs view
@@ -25,7 +25,7 @@ header = "<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\">\n" css :: String -css = unlines [ +css = unlines [ ".identifier{}", ".keyword{font-weight:bold}", ".reference{}",
src/Language/Clafer/Front/Absclafer.hs view
@@ -44,7 +44,7 @@ deriving (Eq,Ord,Show,Read,Data,Typeable,Generic) data Clafer = - Clafer Span Abstract GCard PosIdent Super Card Init Elements + Clafer Span Abstract GCard PosIdent Super Reference Card Init Elements deriving (Eq,Ord,Show,Read,Data,Typeable,Generic) data Constraint = @@ -79,13 +79,13 @@ data Super = SuperEmpty Span - | SuperSome Span SuperHow SetExp + | SuperSome Span SetExp deriving (Eq,Ord,Show,Read,Data,Typeable,Generic) -data SuperHow = - SuperColon Span - | SuperArrow Span - | SuperMArrow Span +data Reference = + ReferenceEmpty Span + | ReferenceSet Span SetExp + | ReferenceBag Span SetExp deriving (Eq,Ord,Show,Read,Data,Typeable,Generic) data Init = @@ -94,8 +94,8 @@ deriving (Eq,Ord,Show,Read,Data,Typeable,Generic) data InitHow = - InitHow_1 Span - | InitHow_2 Span + InitConstant Span + | InitDefault Span deriving (Eq,Ord,Show,Read,Data,Typeable,Generic) data GCard = @@ -208,7 +208,7 @@ getSpan ( ElementDecl s _ ) = s instance Spannable Clafer where - getSpan ( Clafer s _ _ _ _ _ _ _ ) = s + getSpan ( Clafer s _ _ _ _ _ _ _ _ ) = s instance Spannable Constraint where getSpan ( Constraint s _ ) = s @@ -236,20 +236,20 @@ instance Spannable Super where getSpan ( SuperEmpty s ) = s - getSpan ( SuperSome s _ _ ) = s + getSpan ( SuperSome s _ ) = s -instance Spannable SuperHow where - getSpan ( SuperColon s ) = s - getSpan ( SuperArrow s ) = s - getSpan ( SuperMArrow s ) = s +instance Spannable Reference where + getSpan ( ReferenceEmpty s ) = s + getSpan ( ReferenceSet s _ ) = s + getSpan ( ReferenceBag s _ ) = s instance Spannable Init where getSpan ( InitEmpty s ) = s getSpan ( InitSome s _ _ ) = s instance Spannable InitHow where - getSpan ( InitHow_1 s ) = s - getSpan ( InitHow_2 s ) = s + getSpan ( InitConstant s ) = s + getSpan ( InitDefault s ) = s instance Spannable GCard where getSpan ( GCardEmpty s ) = s
src/Language/Clafer/Front/LayoutResolver.hs view
@@ -234,7 +234,7 @@ t = tokenLookup s resLayout :: String -> String -resLayout input' = +resLayout input' = reverse $ output $ execState resolveLayout' $ LayEnv 0 [] input'' [] 0 where input'' = unlines $ filter (/= "") $ lines input' @@ -293,7 +293,7 @@ emitIndent :: MonadState LayEnv m => Int -> m () emitIndent n = do - lev <- gets level + lev <- gets level when (n > lev) $ do ctr <- gets brCtr when (ctr < 1) $ do @@ -322,7 +322,7 @@ return c revertLayout :: String -> String -revertLayout input' = unlines $ revertLayout' (lines input') 0 +revertLayout input' = unlines $ revertLayout' (lines input') 0 revertLayout' :: [String] -> Int -> [String] revertLayout' [] _ = [] @@ -331,4 +331,4 @@ where i' = i + 2 revertLayout' (('}':xs):xss) i = (replicate i' ' ' ++ xs):revertLayout' xss i' where i' = i - 2 -revertLayout' (xs:xss) i = (replicate i ' ' ++ xs):revertLayout' xss i+revertLayout' (xs:xss) i = (replicate i ' ' ++ xs):revertLayout' xss i
src/Language/Clafer/Front/Lexclafer.x view
@@ -20,7 +20,7 @@ $u = [\0-\255] -- universal: any character @rsyms = -- symbols and non-identifier-like reserved words - \= | \[ | \] | \( | \) | \< \< | \> \> | \{ | \} | \` | \: | \- \> | \- \> \> | \: \= | \? | \+ | \* | \. \. | \| | \< \= \> | \= \> | \| \| | \& \& | \! | \< | \> | \< \= | \> \= | \! \= | \- | \/ | \# | \+ \+ | \, | \- \- | \& | \< \: | \: \> | \. | \; | \\ + \= | \[ | \] | \< \< | \> \> | \{ | \} | \` | \: | \- \> | \- \> \> | \: \= | \? | \+ | \* | \. \. | \| | \< \= \> | \= \> | \| \| | \& \& | \! | \< | \> | \< \= | \> \= | \! \= | \- | \/ | \# | \+ \+ | \, | \- \- | \* \* | \< \: | \: \> | \. | \; | \\ | \( | \) :- "//" [.]* ; -- Toss single line comments @@ -98,7 +98,7 @@ | s > a = treeFind right | s == a = t -resWords = b ">=" 31 (b "." 16 (b "*" 8 (b "&" 4 (b "!=" 2 (b "!" 1 N N) (b "#" 3 N N)) (b "(" 6 (b "&&" 5 N N) (b ")" 7 N N))) (b "-" 12 (b "++" 10 (b "+" 9 N N) (b "," 11 N N)) (b "->" 14 (b "--" 13 N N) (b "->>" 15 N N)))) (b "<:" 24 (b ":=" 20 (b "/" 18 (b ".." 17 N N) (b ":" 19 N N)) (b ";" 22 (b ":>" 21 N N) (b "<" 23 N N))) (b "=" 28 (b "<=" 26 (b "<<" 25 N N) (b "<=>" 27 N N)) (b ">" 30 (b "=>" 29 N N) N)))) (b "min" 47 (b "all" 39 (b "\\" 35 (b "?" 33 (b ">>" 32 N N) (b "[" 34 N N)) (b "`" 37 (b "]" 36 N N) (b "abstract" 38 N N))) (b "if" 43 (b "else" 41 (b "disj" 40 N N) (b "enum" 42 N N)) (b "lone" 45 (b "in" 44 N N) (b "max" 46 N N)))) (b "sum" 55 (b "one" 51 (b "no" 49 (b "mux" 48 N N) (b "not" 50 N N)) (b "or" 53 (b "opt" 52 N N) (b "some" 54 N N))) (b "|" 59 (b "xor" 57 (b "then" 56 N N) (b "{" 58 N N)) (b "}" 61 (b "||" 60 N N) N)))) +resWords = b ">>" 32 (b "." 16 (b "**" 8 (b "&&" 4 (b "!=" 2 (b "!" 1 N N) (b "#" 3 N N)) (b ")" 6 (b "(" 5 N N) (b "*" 7 N N))) (b "-" 12 (b "++" 10 (b "+" 9 N N) (b "," 11 N N)) (b "->" 14 (b "--" 13 N N) (b "->>" 15 N N)))) (b "<:" 24 (b ":=" 20 (b "/" 18 (b ".." 17 N N) (b ":" 19 N N)) (b ";" 22 (b ":>" 21 N N) (b "<" 23 N N))) (b "=" 28 (b "<=" 26 (b "<<" 25 N N) (b "<=>" 27 N N)) (b ">" 30 (b "=>" 29 N N) (b ">=" 31 N N))))) (b "min" 48 (b "assert" 40 (b "]" 36 (b "[" 34 (b "?" 33 N N) (b "\\" 35 N N)) (b "abstract" 38 (b "`" 37 N N) (b "all" 39 N N))) (b "if" 44 (b "else" 42 (b "disj" 41 N N) (b "enum" 43 N N)) (b "lone" 46 (b "in" 45 N N) (b "max" 47 N N)))) (b "sum" 56 (b "one" 52 (b "no" 50 (b "mux" 49 N N) (b "not" 51 N N)) (b "or" 54 (b "opt" 53 N N) (b "some" 55 N N))) (b "|" 60 (b "xor" 58 (b "then" 57 N N) (b "{" 59 N N)) (b "}" 62 (b "||" 61 N N) N)))) where b s n = let bs = id s in B bs (TS bs n) @@ -159,7 +159,7 @@ alexInputPrevChar :: AlexInput -> Char alexInputPrevChar (p, c, bs, s) = c --- | Encode a Haskell String to a list of Word8 values, in UTF8 format. + -- | Encode a Haskell String to a list of Word8 values, in UTF8 format. utf8Encode :: Char -> [Word8] utf8Encode = map fromIntegral . go . ord where
src/Language/Clafer/Front/Parclafer.y view
@@ -9,6 +9,10 @@ } %name pModule Module +%name pClafer Clafer +%name pConstraint Constraint +%name pSoftConstraint SoftConstraint +%name pGoal Goal -- no lexer declaration %monad { Err } { thenM } { returnM } @@ -18,11 +22,11 @@ '!' { PT _ (TS _ 1) } '!=' { PT _ (TS _ 2) } '#' { PT _ (TS _ 3) } - '&' { PT _ (TS _ 4) } - '&&' { PT _ (TS _ 5) } - '(' { PT _ (TS _ 6) } - ')' { PT _ (TS _ 7) } - '*' { PT _ (TS _ 8) } + '&&' { PT _ (TS _ 4) } + '(' { PT _ (TS _ 5) } + ')' { PT _ (TS _ 6) } + '*' { PT _ (TS _ 7) } + '**' { PT _ (TS _ 8) } '+' { PT _ (TS _ 9) } '++' { PT _ (TS _ 10) } ',' { PT _ (TS _ 11) } @@ -54,28 +58,29 @@ '`' { PT _ (TS _ 37) } 'abstract' { PT _ (TS _ 38) } 'all' { PT _ (TS _ 39) } - 'disj' { PT _ (TS _ 40) } - 'else' { PT _ (TS _ 41) } - 'enum' { PT _ (TS _ 42) } - 'if' { PT _ (TS _ 43) } - 'in' { PT _ (TS _ 44) } - 'lone' { PT _ (TS _ 45) } - 'max' { PT _ (TS _ 46) } - 'min' { PT _ (TS _ 47) } - 'mux' { PT _ (TS _ 48) } - 'no' { PT _ (TS _ 49) } - 'not' { PT _ (TS _ 50) } - 'one' { PT _ (TS _ 51) } - 'opt' { PT _ (TS _ 52) } - 'or' { PT _ (TS _ 53) } - 'some' { PT _ (TS _ 54) } - 'sum' { PT _ (TS _ 55) } - 'then' { PT _ (TS _ 56) } - 'xor' { PT _ (TS _ 57) } - '{' { PT _ (TS _ 58) } - '|' { PT _ (TS _ 59) } - '||' { PT _ (TS _ 60) } - '}' { PT _ (TS _ 61) } + 'assert' { PT _ (TS _ 40) } + 'disj' { PT _ (TS _ 41) } + 'else' { PT _ (TS _ 42) } + 'enum' { PT _ (TS _ 43) } + 'if' { PT _ (TS _ 44) } + 'in' { PT _ (TS _ 45) } + 'lone' { PT _ (TS _ 46) } + 'max' { PT _ (TS _ 47) } + 'min' { PT _ (TS _ 48) } + 'mux' { PT _ (TS _ 49) } + 'no' { PT _ (TS _ 50) } + 'not' { PT _ (TS _ 51) } + 'one' { PT _ (TS _ 52) } + 'opt' { PT _ (TS _ 53) } + 'or' { PT _ (TS _ 54) } + 'some' { PT _ (TS _ 55) } + 'sum' { PT _ (TS _ 56) } + 'then' { PT _ (TS _ 57) } + 'xor' { PT _ (TS _ 58) } + '{' { PT _ (TS _ 59) } + '|' { PT _ (TS _ 60) } + '||' { PT _ (TS _ 61) } + '}' { PT _ (TS _ 62) } L_PosInteger { PT _ (T_PosInteger _) } L_PosDouble { PT _ (T_PosDouble _) } @@ -101,7 +106,7 @@ Clafer :: { Clafer } -Clafer : Abstract GCard PosIdent Super Card Init Elements { Clafer ((mkCatSpan $1) >- (mkCatSpan $2) >- (mkCatSpan $3) >- (mkCatSpan $4) >- (mkCatSpan $5) >- (mkCatSpan $6) >- (mkCatSpan $7)) $1 $2 $3 $4 $5 $6 $7 } +Clafer : Abstract GCard PosIdent Super Reference Card Init Elements { Clafer ((mkCatSpan $1) >- (mkCatSpan $2) >- (mkCatSpan $3) >- (mkCatSpan $4) >- (mkCatSpan $5) >- (mkCatSpan $6) >- (mkCatSpan $7) >- (mkCatSpan $8)) $1 $2 $3 $4 $5 $6 $7 $8 } Constraint :: { Constraint } @@ -109,7 +114,7 @@ SoftConstraint :: { SoftConstraint } -SoftConstraint : '(' ListExp ')' { SoftConstraint ((mkTokenSpan $1) >- (mkCatSpan $2) >- (mkTokenSpan $3)) (reverse $2) } +SoftConstraint : 'assert' '[' ListExp ']' { SoftConstraint ((mkTokenSpan $1) >- (mkTokenSpan $2) >- (mkCatSpan $3) >- (mkTokenSpan $4)) (reverse $3) } Goal :: { Goal } @@ -136,13 +141,13 @@ Super :: { Super } Super : {- empty -} { SuperEmpty noSpan } - | SuperHow SetExp { SuperSome ((mkCatSpan $1) >- (mkCatSpan $2)) $1 $2 } + | ':' SetExp { SuperSome ((mkTokenSpan $1) >- (mkCatSpan $2)) $2 } -SuperHow :: { SuperHow } -SuperHow : ':' { SuperColon ((mkTokenSpan $1)) } - | '->' { SuperArrow ((mkTokenSpan $1)) } - | '->>' { SuperMArrow ((mkTokenSpan $1)) } +Reference :: { Reference } +Reference : {- empty -} { ReferenceEmpty noSpan } + | '->' SetExp { ReferenceSet ((mkTokenSpan $1) >- (mkCatSpan $2)) $2 } + | '->>' SetExp { ReferenceBag ((mkTokenSpan $1) >- (mkCatSpan $2)) $2 } Init :: { Init } @@ -151,8 +156,8 @@ InitHow :: { InitHow } -InitHow : '=' { InitHow_1 ((mkTokenSpan $1)) } - | ':=' { InitHow_2 ((mkTokenSpan $1)) } +InitHow : '=' { InitConstant ((mkTokenSpan $1)) } + | ':=' { InitDefault ((mkTokenSpan $1)) } GCard :: { GCard } @@ -287,7 +292,7 @@ SetExp2 :: { SetExp } -SetExp2 : SetExp2 '&' SetExp3 { Intersection ((mkCatSpan $1) >- (mkTokenSpan $2) >- (mkCatSpan $3)) $1 $3 } +SetExp2 : SetExp2 '**' SetExp3 { Intersection ((mkCatSpan $1) >- (mkTokenSpan $2) >- (mkCatSpan $3)) $1 $3 } | SetExp3 { $1 }
src/Language/Clafer/Front/Printclafer.hs view
@@ -3,9 +3,9 @@ -- pretty-printer generated by the BNF converter -import Prelude hiding (exp, init) import Language.Clafer.Front.Absclafer import Data.Char +import Prelude hiding (exp, init) -- the top-level printing method @@ -113,7 +113,7 @@ instance Print Clafer where prt i e = case e of - Clafer _ abstract gcard posident super card init elements -> prPrec i 0 (concatD [prt 0 abstract , prt 0 gcard , prt 0 posident , prt 0 super , prt 0 card , prt 0 init , prt 0 elements]) + Clafer _ abstract gcard posident super reference card init elements -> prPrec i 0 (concatD [prt 0 abstract , prt 0 gcard , prt 0 posident , prt 0 super , prt 0 reference , prt 0 card , prt 0 init , prt 0 elements]) instance Print Constraint where @@ -123,7 +123,7 @@ instance Print SoftConstraint where prt i e = case e of - SoftConstraint _ exps -> prPrec i 0 (concatD [doc (showString "(") , prt 0 exps , doc (showString ")")]) + SoftConstraint _ exps -> prPrec i 0 (concatD [doc (showString "assert") , doc (showString "[") , prt 0 exps , doc (showString "]")]) instance Print Goal where @@ -158,14 +158,14 @@ instance Print Super where prt i e = case e of SuperEmpty _ -> prPrec i 0 (concatD []) - SuperSome _ superhow setexp -> prPrec i 0 (concatD [prt 0 superhow , prt 0 setexp]) + SuperSome _ setexp -> prPrec i 0 (concatD [doc (showString ":") , prt 0 setexp]) -instance Print SuperHow where +instance Print Reference where prt i e = case e of - SuperColon _ -> prPrec i 0 (concatD [doc (showString ":")]) - SuperArrow _ -> prPrec i 0 (concatD [doc (showString "->")]) - SuperMArrow _ -> prPrec i 0 (concatD [doc (showString "->>")]) + ReferenceEmpty _ -> prPrec i 0 (concatD []) + ReferenceSet _ setexp -> prPrec i 0 (concatD [doc (showString "->") , prt 0 setexp]) + ReferenceBag _ setexp -> prPrec i 0 (concatD [doc (showString "->>") , prt 0 setexp]) instance Print Init where @@ -176,8 +176,8 @@ instance Print InitHow where prt i e = case e of - InitHow_1 _ -> prPrec i 0 (concatD [doc (showString "=")]) - InitHow_2 _ -> prPrec i 0 (concatD [doc (showString ":=")]) + InitConstant _ -> prPrec i 0 (concatD [doc (showString "=")]) + InitDefault _ -> prPrec i 0 (concatD [doc (showString ":=")]) instance Print GCard where @@ -261,7 +261,7 @@ Union _ setexp0 setexp -> prPrec i 0 (concatD [prt 0 setexp0 , doc (showString "++") , prt 1 setexp]) UnionCom _ setexp0 setexp -> prPrec i 0 (concatD [prt 0 setexp0 , doc (showString ",") , prt 1 setexp]) Difference _ setexp0 setexp -> prPrec i 1 (concatD [prt 1 setexp0 , doc (showString "--") , prt 2 setexp]) - Intersection _ setexp0 setexp -> prPrec i 2 (concatD [prt 2 setexp0 , doc (showString "&") , prt 3 setexp]) + Intersection _ setexp0 setexp -> prPrec i 2 (concatD [prt 2 setexp0 , doc (showString "**") , prt 3 setexp]) Domain _ setexp0 setexp -> prPrec i 3 (concatD [prt 3 setexp0 , doc (showString "<:") , prt 4 setexp]) Range _ setexp0 setexp -> prPrec i 4 (concatD [prt 4 setexp0 , doc (showString ":>") , prt 5 setexp]) Join _ setexp0 setexp -> prPrec i 5 (concatD [prt 5 setexp0 , doc (showString ".") , prt 6 setexp])
src/Language/Clafer/Generator/Alloy.hs view
@@ -23,6 +23,7 @@ -- | Generates Alloy4.1 or 4.2 code for a Clafer model module Language.Clafer.Generator.Alloy where +import Control.Applicative ((<$>)) import Control.Lens hiding (elements, mapping) import Control.Monad.State import Data.List @@ -31,88 +32,35 @@ import Language.Clafer.Common import Language.Clafer.ClaferArgs import Language.Clafer.Front.Absclafer +import Language.Clafer.Generator.Concat import Language.Clafer.Intermediate.Intclafer hiding (exp) --- import qualified Language.Clafer.Intermediate.Intclafer as I (exp) --- | representation of strings in chunks (for line/column numbering) -data Concat = CString String | Concat { - srcPos :: IrTrace, - nodes :: [Concat] - } deriving (Eq, Show) -type Position = ((LineNo, ColNo), (LineNo, ColNo)) - -data IrTrace = - IrPExp {pUid::String} | - LowerCard {pUid::String, isGroup::Bool} | - UpperCard {pUid::String, isGroup::Bool} | - ExactCard {pUid::String, isGroup::Bool} | - NoTrace - deriving (Eq, Show) - -mkConcat :: IrTrace -> String -> Concat -mkConcat pos str = Concat pos [CString str] - -iscPrimitive :: Concat -> Bool -iscPrimitive x = isPrimitive $ flatten x - -flatten :: Concat -> String -flatten (CString x) = x -flatten (Concat _ nodes') = nodes' >>= flatten - -(+++) :: Concat -> Concat -> Concat -(+++) (CString x) (CString y) = CString $ x ++ y -(+++) (CString "") y@Concat{} = y -(+++) x y@(Concat src ys) - | src == NoTrace = Concat NoTrace $ x : ys - | otherwise = Concat NoTrace $ [x, y] -(+++) x@Concat{} (CString "") = x -(+++) x@(Concat src xs) y - | src == NoTrace = Concat NoTrace $ xs ++ [y] - | otherwise = Concat NoTrace $ [x, y] - -cconcat :: [Concat] -> Concat -cconcat = foldr (+++) (CString "") - -cintercalate :: Concat -> [Concat] -> Concat -cintercalate xs xss = cconcat (intersperse xs xss) - -filterNull :: [Concat] -> [Concat] -filterNull = filter (not.isNull) - -isNull :: Concat -> Bool -isNull (CString "") = True -isNull (Concat _ []) = True -isNull _ = False - -cunlines :: [Concat] -> Concat -cunlines xs = cconcat $ map (+++ (CString "\n")) xs - -- | Alloy code generation --- 07th Mayo 2012 Rafael Olaechea +-- 07th Mayo 2012 Rafael Olaechea -- Added Logic to print a goal block in case there is at least one goal. genModule :: ClaferArgs -> (IModule, GEnv) -> [(UID, Integer)] -> (Result, [(Span, IrTrace)]) genModule claferargs (imodule, _) scopes = (flatten output, filter ((/= NoTrace) . snd) $ mapLineCol output) where - output = header claferargs scopes +++ (cconcat $ map (genDeclaration claferargs) (_mDecls imodule)) +++ - if ((not $ skip_goals claferargs) && length goals_list > 0) then - CString "objectives o_global {\n" +++ (cintercalate (CString ",\n") goals_list) +++ CString "\n}" - else - CString "" - where + output = header claferargs scopes +++ (cconcat $ map (genDeclaration claferargs) (_mDecls imodule)) +++ + if ((not $ skip_goals claferargs) && length goals_list > 0) then + CString "objectives o_global {\n" +++ (cintercalate (CString ",\n") goals_list) +++ CString "\n}" + else + CString "" + where goals_list = filterNull (map (genDeclarationGoalsOnly claferargs) (_mDecls imodule)) header :: ClaferArgs -> [(UID, Integer)] -> Concat header args scopes = CString $ unlines [ "open util/integer" , "pred show {}" - , if (validate args) || (noalloyruncommand args) - then "" + , if (validate args) || (noalloyruncommand args) + then "" else "run show for 1" ++ genScopes scopes , ""] where genScopes [] = "" genScopes scopes' = " but " ++ intercalate ", " (map genScope scopes') - + genScope :: (UID, Integer) -> String genScope (uid', scope) = show scope ++ " " ++ uid' @@ -123,33 +71,34 @@ genDeclarationGoalsOnly claferargs x = case x of IEClafer _ -> CString "" IEConstraint _ _ -> CString "" - IEGoal _ (PExp _ _ _ innerexp) -> case innerexp of - IFunExp op' exps' -> if op' == iGMax || op' == iGMin then - mkMetric op' $ genPExp claferargs [] (head exps') - else + IEGoal _ (PExp _ _ _ innerexp) -> case innerexp of + IFunExp op' exps' -> if op' == iGMax || op' == iGMin then + mkMetric op' $ genPExp claferargs [] (head exps') + else error "unary operator distinct from (min/max) at the topmost level of a goal element" _ -> error "no unary operator (min/max) at the topmost level of a goal element." -- 07th Mayo 2012 Rafael Olaechea --- Removed goal from this function as they will now all be collected into a single block. +-- Removed goal from this function as they will now all be collected into a single block. genDeclaration :: ClaferArgs -> IElement -> Concat genDeclaration claferargs x = case x of - IEClafer clafer' -> genClafer claferargs [] clafer' + IEClafer clafer' -> (genClafer claferargs [] clafer') +++ (mkFact $ cconcat $ genSetUniquenessConstraint clafer') IEConstraint _ pexp -> mkFact $ genPExp claferargs [] pexp - IEGoal _ (PExp _ _ _ innerexp) -> case innerexp of - IFunExp op' _ -> if op' == iGMax || op' == iGMin then + IEGoal _ (PExp _ _ _ innerexp) -> case innerexp of + IFunExp op' _ -> if op' == iGMax || op' == iGMin then CString "" - else + else error "unary operator distinct from (min/max) at the topmost level of a goal element" _ -> error "no unary operator (min/max) at the topmost level of a goal element." mkFact :: Concat -> Concat -mkFact xs = cconcat [CString "fact ", mkSet xs, CString "\n"] +mkFact x@(CString "") = x +mkFact xs = cconcat [CString "fact ", mkSet xs, CString "\n"] mkMetric :: String -> Concat -> Concat mkMetric goalopname xs = cconcat [ if goalopname == iGMax then CString "maximize" else CString "minimize", CString " ", xs, CString " "] -mkSet :: Concat -> Concat +mkSet :: Concat -> Concat mkSet xs = cconcat [CString "{ ", xs, CString " }"] showSet :: Concat -> [Concat] -> Concat @@ -165,13 +114,18 @@ -- optimization: top level cardinalities -- optimization: if only boolean parents, then set card is known genClafer :: ClaferArgs -> [String] -> IClafer -> Concat -genClafer claferargs resPath oClafer = (cunlines $ filterNull - [ cardFact +++ claferDecl clafer' - ((showSet (CString "\n, ") $ genRelations claferargs clafer') +++ - (optShowSet $ filterNull $ genConstraints claferargs resPath clafer')) - ]) +++ CString "\n" +++ children' +genClafer claferargs resPath clafer' + = (cunlines $ filterNull + [ cardFact + +++ claferDecl clafer' ( + (showSet (CString "\n, ") $ genRelations claferargs clafer') + +++ (optShowSet $ filterNull $ genConstraints claferargs resPath clafer') + ) + ] + ) + +++ CString "\n" + +++ children' where - clafer' = transPrimitive oClafer children' = cconcat $ filterNull $ map (genClafer claferargs ((_uid clafer') : resPath)) $ getSubclafers $ _elements clafer' @@ -182,22 +136,17 @@ c -> mkFact c | otherwise = CString "" -transPrimitive :: IClafer -> IClafer -transPrimitive = super %~ toOverlapping - where - toOverlapping x@(ISuper _ [PExp _ _ _ (IClaferId _ id' _)]) - | isPrimitive id' = x{_isOverlapping = True} - | otherwise = x - toOverlapping x = x - claferDecl :: IClafer -> Concat -> Concat -claferDecl c rest = cconcat [genOptCard c, - CString $ genAbstract $ _isAbstract c, CString "sig ", - Concat NoTrace [CString $ _uid c, genExtends $ _super c, CString "\n", rest]] +claferDecl c rest = cconcat + [ genOptCard c + , CString $ genAbstract $ _isAbstract c + , CString "sig " + , Concat NoTrace [CString $ _uid c, genExtends $ _super c, CString "\n", rest] + ] where genAbstract isAbs = if isAbs then "abstract " else "" - genExtends (ISuper False [PExp _ _ _ (IClaferId _ "clafer" _)]) = CString "" - genExtends (ISuper False [PExp _ _ _ (IClaferId _ i _)]) = CString " " +++ Concat NoTrace [CString $ "extends " ++ i] + genExtends Nothing = CString "" + genExtends (Just (PExp _ _ _ (IClaferId _ i _ _))) = CString " " +++ Concat NoTrace [CString $ "extends " ++ i] -- todo: handle multiple inheritance genExtends _ = CString "" @@ -207,8 +156,8 @@ | otherwise = CString "" where glCard' = genIntervalCrude $ _glCard c - + -- ----------------------------------------------------------------------------- -- overlapping inheritance is a new clafer with val (unlike only relation) -- relations: overlapping inheritance (val rel), children @@ -217,12 +166,12 @@ genRelations :: ClaferArgs -> IClafer -> [Concat] genRelations claferargs c = maybeToList r ++ (map mkRel $ getSubclafers $ _elements c) where - r = if _isOverlapping $ _super c + r = if isJust $ _reference c then Just $ Concat NoTrace [CString $ genRel (if (noalloyruncommand claferargs) then (_uid c ++ "_ref") else "ref") - c {_card = Just (1, 1)} $ - flatten $ refType claferargs c] - else + c {_card = Just (1, 1)} $ + flatten $ refType claferargs c] + else Nothing mkRel c' = Concat NoTrace [CString $ genRel (genRelName $ _uid c') c' $ _uid c'] @@ -238,7 +187,7 @@ genAlloyRel name card' rType = concat [name, " : ", card', " ", rType] refType :: ClaferArgs -> IClafer -> Concat -refType claferargs c = cintercalate (CString " + ") $ map ((genType claferargs).getTarget) $ _supers $ _super c +refType claferargs c = fromMaybe (CString "") $ fmap ((genType claferargs).getTarget) $ _ref <$> _reference c getTarget :: PExp -> PExp @@ -247,27 +196,51 @@ _ -> x genType :: ClaferArgs -> PExp -> Concat -genType claferargs x@(PExp _ _ _ y@(IClaferId _ _ _)) = genPExp claferargs [] +genType claferargs x@(PExp _ _ _ y@(IClaferId _ _ _ _)) = genPExp claferargs [] x{_exp = y{_isTop = True}} genType m x = genPExp m [] x -- ----------------------------------------------------------------------------- -- constraints --- user constraints + parent + group constraints + reference +-- parent + group constraints + reference + user constraints -- a = NUMBER do all x : a | x = NUMBER (otherwise alloy sums a set) genConstraints :: ClaferArgs -> [String] -> IClafer -> [Concat] -genConstraints cargs resPath c = (genParentConst resPath c) : - (genGroupConst c) : genPathConst cargs (if (noalloyruncommand cargs) then (_uid c ++ "_ref") else "ref") resPath c : constraints +genConstraints cargs resPath c + = (genParentConst resPath c) + : (genGroupConst c) + : genPathConst cargs (if (noalloyruncommand cargs) then (_uid c ++ "_ref") else "ref") resPath c + : constraints where - constraints = map genConst $ _elements c + constraints = concat $ map genConst $ _elements c genConst x = case x of - IEConstraint _ pexp -> genPExp cargs ((_uid c) : resPath) pexp + IEConstraint _ pexp -> [ genPExp cargs ((_uid c) : resPath) pexp ] IEClafer c' -> - if genCardCrude (_card c') `elem` ["one", "lone", "some"] - then CString "" else mkCard ({- do not use the genRelName as the constraint name -} _uid c') False (genRelName $ _uid c') $ fromJust (_card c') + (if genCardCrude (_card c') `elem` ["one", "lone", "some"] + then CString "" + else mkCard ({- do not use the genRelName as the constraint name -} _uid c') False (genRelName $ _uid c') $ fromJust (_card c') + ) : genSetUniquenessConstraint c' IEGoal _ _ -> error "getConst function from Alloy generator was given a Goal, this function should only be given a Constrain or Clafer" -- This should never happen + +genSetUniquenessConstraint :: IClafer -> [Concat] +genSetUniquenessConstraint c = + (case _reference c of + Just (IReference True _) -> + (case _card c of + Just (lb, ub) -> if (lb > 1 || ub > 1 || ub == -1) + then [ CString $ ( + (case isTopLevel c of + False -> "all disj x, y : this.@" ++ (genRelName $ _uid c) + True -> " all disj x, y : " ++ (_uid c))) + ++ " | (x.@ref) != (y.@ref) " + ] + else [] + _ -> []) + _ -> [] + ) + + -- optimization: if only boolean features then the parent is unique genParentConst :: [String] -> IClafer -> Concat genParentConst [] _ = CString "" @@ -306,21 +279,19 @@ -- generates expression for references that point to expressions (not single clafers) genPathConst :: ClaferArgs -> String -> [String] -> IClafer -> Concat genPathConst claferargs name resPath c - | isRefPath c = cconcat [CString name, CString " = ", - cintercalate (CString " + ") $ - map ((brArg id).(genPExp claferargs resPath)) $ - _supers $ _super c] + | isRefPath (c ^. reference) = cconcat [CString name, CString " = ", + fromMaybe (error "genPathConst: impossible.") $ + fmap ((brArg id).(genPExp claferargs resPath)) $ + _ref <$> _reference c] | otherwise = CString "" -isRefPath :: IClafer -> Bool -isRefPath c = (c ^. super . isOverlapping) && - ((length s > 1) || (not $ isSimplePath s)) - where - s = _supers $ _super c +isRefPath :: Maybe IReference -> Bool +isRefPath Nothing = False +isRefPath (Just IReference{_ref=s}) = not $ isSimplePath s -isSimplePath :: [PExp] -> Bool -isSimplePath [PExp _ _ _ (IClaferId _ _ _)] = True -isSimplePath [PExp _ _ _ (IFunExp op' _)] = op' == iUnion +isSimplePath :: PExp -> Bool +isSimplePath (PExp _ _ _ (IClaferId _ _ _ _)) = True +isSimplePath (PExp _ _ _ (IFunExp op' _)) = op' == iUnion isSimplePath _ = False -- ----------------------------------------------------------------------------- @@ -355,7 +326,9 @@ (Nothing, Just c2) -> c2 (Nothing, Nothing) -> undefined where - s1 = if n == 0 then Nothing else Just $ cardLowerConcat constraintName group' [CString $ concat [show n, " <= #", element']] + s1 = if n == 0 + then Nothing + else Just $ cardLowerConcat constraintName group' [CString $ concat [show n, " <= #", element']] s2 = do result <- genExInteger element' x exinteger @@ -395,8 +368,8 @@ where optBar [] = "" optBar _ = " | " - IClaferId _ "ref" _ -> CString "@ref" - IClaferId _ sid istop -> CString $ + IClaferId _ "ref" _ _ -> CString "@ref" + IClaferId _ sid istop _ -> CString $ if head sid == '~' then sid else if isNothing iType' then sid' else case fromJust $ iType' of TInteger -> vsident @@ -406,7 +379,7 @@ where sid' = (if istop then "" else '@' : genRelName "") ++ sid -- 29/March/2012 Rafael Olaechea: ref is now prepended with clafer name to be able to refer to it from partial instances. - -- 30/March/2012 Rafael Olaechea added referredClaferUniqeuid to fix problems when having this.x > number (e.g test/positive/i10.cfr ) + -- 30/March/2012 Rafael Olaechea added referredClaferUniqeuid to fix problems when having this.x > number (e.g test/positive/i10.cfr ) vsident = if (noalloyruncommand claferargs) then sid' ++ ".@" ++ referredClaferUniqeuid ++ "_ref" else sid' ++ ".@ref" where referredClaferUniqeuid = if sid == "this" then (head resPath) else sid IFunExp _ _ -> case exp'' of @@ -429,16 +402,16 @@ transformExp x@(IFunExp op' exps'@(e1:e2:_)) | op' == iXor = IFunExp iNot [PExp (Just TBoolean) "" noSpan (IFunExp iIff exps')] | op' == iJoin && isClaferName' e1 && isClaferName' e2 && - getClaferName e1 == this && head (getClaferName e2) == '~' = + getClaferName e1 == thisIdent && head (getClaferName e2) == '~' = IFunExp op' [e1{_iType = Just $ TClafer []}, e2] | otherwise = x transformExp x = x genIFunExp :: String -> ClaferArgs -> [String] -> IExp -> Concat -genIFunExp pid' claferargs resPath (IFunExp op' exps') = - if (op' == iSumSet) - then genIFunExp pid' claferargs resPath (IFunExp iSumSet' [(removeright (head exps')), (getRight $ head exps')]) - else if (op' == iSumSet') +genIFunExp pid' claferargs resPath (IFunExp op' exps') = + if (op' == iSumSet) + then genIFunExp pid' claferargs resPath (IFunExp iSumSet' [(removeright (head exps')), (getRight $ head exps')]) + else if (op' == iSumSet') then Concat (IrPExp pid') $ intl exps'' (map CString $ genOp (Alloy42 `elem` (mode claferargs)) iSumSet) else Concat (IrPExp pid') $ intl exps'' (map CString $ genOp (Alloy42 `elem` (mode claferargs)) op') where @@ -454,17 +427,17 @@ optBrArg claferargs resPath x = brFun (genPExp' claferargs resPath) x where brFun = case x of - PExp _ _ _ (IClaferId _ _ _) -> ($) + PExp _ _ _ (IClaferId _ _ _ _) -> ($) PExp _ _ _ (IInt _) -> ($) _ -> brArg - + interleave :: [Concat] -> [Concat] -> [Concat] interleave [] [] = [] interleave (x:xs) [] = x:xs interleave [] (x:xs) = x:xs interleave (x:xs) ys = x : interleave ys xs -brArg :: (a -> Concat) -> a -> Concat +brArg :: (a -> Concat) -> a -> Concat brArg f arg = cconcat [CString "(", f arg, CString ")"] -- isAlloy42 @@ -494,19 +467,19 @@ adjustPExp :: [String] -> PExp -> PExp adjustPExp resPath (PExp t pid' pos x) = PExp t pid' pos $ adjustIExp resPath x -adjustIExp :: [String] -> IExp -> IExp +adjustIExp :: [String] -> IExp -> IExp adjustIExp resPath x = case x of IDeclPExp q d pexp -> IDeclPExp q d $ adjustPExp resPath pexp IFunExp op' exps' -> adjNav $ IFunExp op' $ map adjExps exps' where (adjNav, adjExps) = if op' == iJoin then (aNav, id) else (id, adjustPExp resPath) - IClaferId _ _ _ -> aNav x + IClaferId _ _ _ _ -> aNav x _ -> x where aNav = fst.(adjustNav resPath) -adjustNav :: [String] -> IExp -> (IExp, [String]) +adjustNav :: [String] -> IExp -> (IExp, [String]) adjustNav resPath x@(IFunExp op' (pexp0:pexp:_)) | op' == iJoin = (IFunExp iJoin [pexp0{_exp = iexp0}, @@ -515,8 +488,8 @@ where (iexp0, path) = adjustNav resPath (_exp pexp0) (iexp, path') = adjustNav path (_exp pexp) -adjustNav resPath x@(IClaferId _ id' _) - | id' == parent = (x{_sident = "~@" ++ (genRelName $ head resPath)}, tail resPath) +adjustNav resPath x@(IClaferId _ id' _ _) + | id' == parentIdent = (x{_sident = "~@" ++ (genRelName $ head resPath)}, tail resPath) | otherwise = (x, resPath) adjustNav _ _ = error "Function adjustNav Expect a IFunExp or IClaferID as one of it's argument but it was given a differnt IExp" --This should never happen @@ -550,7 +523,7 @@ mapLineCol :: Concat -> [(Span, IrTrace)] mapLineCol code = mapping $ execState (mapLineCol' code) (AlloyEnv (firstLine, firstCol) []) -addCode :: MonadState AlloyEnv m => String -> m () +addCode :: MonadState AlloyEnv m => String -> m () addCode str = modify (\s -> s {lineCol = lineno (lineCol s) str}) mapLineCol' :: MonadState AlloyEnv m => Concat -> m () @@ -571,7 +544,7 @@ - (((#((this.@r_c2_Finger).@r_c3_Pinky)).add[(#((this.@r_c2_Finger).@r_c4_Index))]).add[(#((this.@r_c2_Finger).@r_c5_Middle))]) = 0 - But the actual constraint in the API is - #((this.@r_c2_Finger).@r_c3_Pinky)).add[(#((this.@r_c2_Finger).@r_c4_Index))]).add[(#((this.@r_c2_Finger).@r_c5_Middle))]) = 0 - - + - - Seems unintuitive since the brackets are now unbalanced but that's how they work in Alloy. The next - few lines of code is counting the beginning and ending parenthesis's and subtracting them from the - positions in the map file. @@ -603,7 +576,7 @@ firstLine = 1 :: LineNo removeright :: PExp -> PExp -removeright (PExp _ _ _ (IFunExp _ (x : (PExp _ _ _ (IClaferId _ _ _)) : _))) = x +removeright (PExp _ _ _ (IFunExp _ (x : (PExp _ _ _ (IClaferId _ _ _ _)) : _))) = x removeright (PExp t id' pos (IFunExp o (x1:x2:xs))) = (PExp t id' pos (IFunExp o (x1:(removeright x2):xs))) removeright (PExp _ _ _ _) = error "Function removeright from the AlloyGenerator expects a PExp with a IFunExp inside, was given something else" --This should never happen
src/Language/Clafer/Generator/Choco.hs view
@@ -30,8 +30,8 @@ ++ (genGoal =<< _mDecls) where root :: IClafer - root = IClafer noSpan False Nothing "root" "root" (ISuper False [PExp Nothing "" noSpan $ IClaferId "clafer" "clafer" True]) (Just (1, 1)) (0, 0) _mDecls - + root = IClafer noSpan False Nothing rootIdent rootIdent "" Nothing Nothing (Just (1, 1)) (0, 0) _mDecls + toplevelClafers = mapMaybe iclafer _mDecls -- The sort is so that we encounter sub clafers before super clafers when abstract clafers extend other abstract clafers abstractClafers = sortBy (comparing $ length . supersOf . _uid) $ filter _isAbstract toplevelClafers @@ -39,183 +39,112 @@ clafers = snd <$> parentChildMap claferUids = _uid <$> clafers concreteClafers = filter isNotAbstract clafers --- minusRoot = filter ((/= "root") . uid) - + claferWithUid u = fromMaybe (error $ "claferWithUid: \"" ++ u ++ "\" is not a clafer") $ find ((== u) . _uid) clafers - - prims = ["int", "integer", "string", "real"] - + -- All abstract clafers u inherits supersOf :: String -> [String] supersOf u = case superOf u of Just su -> su : supersOf su Nothing -> [] - --- superHierarchyOf u = u : supersOf u - + superOf u = case _super $ claferWithUid u of - ISuper False [PExp{_exp = IClaferId{_sident}}] - | _sident == "clafer" -> Nothing - | _sident `elem` prims -> Nothing - | otherwise -> Just _sident + Just (PExp{_exp = IClaferId{_sident}}) + | _sident == baseClafer -> Nothing + | isPrimitive _sident -> Nothing + | otherwise -> Just _sident _ -> Nothing -{- superWithRef u = - case mapMaybe refOf $ supersOf u of - r : _ -> r - _ -> u ++ " does not inherit a ref" -} - - refOf u = - case _super $ claferWithUid u of - ISuper True [PExp{_exp = IClaferId{_sident}}] -> Just _sident - ISuper False [PExp{_exp = IClaferId{_sident}}] - | _sident == "int" -> Just "integer" - | _sident `elem` prims -> Just _sident +{- refOf u = + case _reference $ claferWithUid u of + Just (IReference{_ref=PExp{_exp = IClaferId{_sident}}}) + | _sident == "int" -> Just "integer" + | isPrimitive _sident -> Just _sident | otherwise -> Nothing _ -> Nothing - - -- All clafers that inherit u -{- subOf :: String -> [String] - subOf u = [uid | IClafer{_uid} <- clafers, Just u == superOf uid] - subClaferOf :: String -> [IClafer] - subClaferOf = map claferWithUid . subOf - - subOffsets :: [(String, String, Integer)] - subOffsets = [(uid, sub, off) | IClafer{_uid} <- clafers, let subs = subOf uid, (sub, off) <- zip subs $ offsets subs] - - subOffsetOf :: String -> Integer - subOffsetOf sub = trd3 $ fromMaybe (error $ "subOffsetOf: " ++ sub) $ find ((== sub) . snd3) subOffsets - - offsets :: [String] -> [Integer] - offsets = scanl (flip $ (+) . scopeOf) 0 --} - +-} parentOf u = fst $ fromMaybe (error $ "parentOf: \"" ++ u ++ "\" is not a clafer") $ find ((== u) . _uid . snd) parentChildMap -{- parentClaferOf = claferWithUid . parentOf - -- Direct childrens - childrenOf = map uid . childrenClaferOf - childrenClaferOf u = [c | (p, c) <- parentChildMap, p == u] - - -- Indirect childrens - indirectChildrenOf u = childrenOf =<< supersOf u - indirectChildrenClaferOf u = childrenClaferOf =<< supersOf u - - isBounded :: Interval -> Bool - isBounded (0, -1) = False - isBounded _ = True --} + genCard :: Interval -> Maybe String genCard (0, -1) = Nothing genCard (low, -1) = return $ show low genCard (low, high) = return $ show low ++ ", " ++ show high - - + + genScopes :: Result genScopes = (if null scopeMap then "" else "scope({" ++ intercalate ", " scopeMap ++ "});\n") ++ "defaultScope(1);\n" - ++ "intRange(-" ++ show (2 ^ (bitwidth - 1)) ++ ", " ++ show (2 ^ (bitwidth - 1) - 1) ++ ");\n" + ++ "intRange(-" ++ show largestPositiveInt ++ ", " ++ show (largestPositiveInt - 1) ++ ");\n" ++ "stringLength(" ++ show longestString ++ ");\n" where + largestPositiveInt :: Integer + largestPositiveInt = 2 ^ (bitwidth - 1) scopeMap = [uid' ++ ":" ++ show scope | (uid', scope) <- scopes, uid' /= "int"] - - exps' :: [IExp] - exps' = universeOn biplate imodule + exprs :: [IExp] + exprs = universeOn biplate imodule stringLength :: IExp -> Maybe Int stringLength (IStr string) = Just $ length string stringLength _ = Nothing longestString :: Int - longestString = maximum $ 16 : mapMaybe stringLength exps' - + longestString = maximum $ 16 : mapMaybe stringLength exprs + genConcreteClafer :: IClafer -> Result genConcreteClafer IClafer{_uid, _card = Just _card, _gcard = Just (IGCard _ _gcard)} = _uid ++ " = " ++ constructor ++ "(\"" ++ _uid ++ "\")" ++ prop "withCard" (genCard _card) ++ prop "withGroupCard" (genCard _gcard) ++ prop "extending" (superOf _uid) ++ ";\n" where - constructor = + constructor = case parentOf _uid of "root" -> "Clafer" puid -> puid ++ ".addChild" - genConcreteClafer (IClafer _ _ Nothing _ _ _ _ _ _) = error "Choco.getConcreteClafer undefined" - genConcreteClafer (IClafer _ _ (Just (IGCard _ _)) _ _ _ Nothing _ _) = error "Choco.getConcreteClafer undefined" + genConcreteClafer (IClafer _ _ Nothing _ _ _ _ _ _ _ _) = error "Choco.getConcreteClafer undefined" + genConcreteClafer (IClafer _ _ (Just (IGCard _ _)) _ _ _ _ _ Nothing _ _) = error "Choco.getConcreteClafer undefined" prop name value = case value of Just value' -> "." ++ name ++ "(" ++ value' ++ ")" Nothing -> "" - - + + genRefClafer :: IClafer -> Result - genRefClafer IClafer{_uid} = - case (refOf _uid, _uid `elem` uniqueRefs) of - (Just target, True) -> _uid ++ ".refToUnique(" ++ genTarget target ++ ");\n" - (Just target, False) -> _uid ++ ".refTo(" ++ genTarget target ++ ");\n" - _ -> "" + genRefClafer c@IClafer{_uid, _reference, _card} = + case (getReference c, _reference, _card) of + ([target], Just (IReference True _), Just (lb, ub)) -> if (lb > 1 || ub > 1 || lb == -1 || ub == -1) + then _uid ++ ".refToUnique(" ++ genTarget target ++ ");\n" + else _uid ++ ".refTo(" ++ genTarget target ++ ");\n" + ([target], Just (IReference _ _), _) -> _uid ++ ".refTo(" ++ genTarget target ++ ");\n" + _ -> "" where genTarget "integer" = "Int" + genTarget "int" = "Int" genTarget target = target - + genAbstractClafer :: IClafer -> Result genAbstractClafer IClafer{_uid, _card = Just _} = - _uid ++ " = Abstract(\"" ++ _uid ++ "\")" ++ prop "extending" (superOf _uid) ++ ";\n" + _uid ++ " = Abstract(\"" ++ _uid ++ "\")" ++ prop "extending" (superOf _uid) ++ ";\n" genAbstractClafer IClafer{_uid, _card = Nothing} = - _uid ++ " = Abstract(\"" ++ _uid ++ "\")" ++ prop "extending" (superOf _uid) ++ ";\n" + _uid ++ " = Abstract(\"" ++ _uid ++ "\")" ++ prop "extending" (superOf _uid) ++ ";\n" - -- Is a uniqueness constraint? If so, return the name of unique clafer - isUniqueConstraint :: IExp -> Maybe String - isUniqueConstraint (IDeclPExp IAll [IDecl True [x, y] PExp{_exp = IClaferId{_sident}}] - PExp{_exp = IFunExp "!=" [ - PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = xident}}, PExp{_exp = IClaferId{_sident = "ref"}}]}, - PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = yident}}, PExp{_exp = IClaferId{_sident = "ref"}}]}]}) - | x == xident && y == yident = return _sident - | otherwise = mzero - isUniqueConstraint (IDeclPExp IAll [IDecl True [x, y] PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = "this"}}, PExp{_exp = IClaferId{_sident}}]}] - PExp{_exp = IFunExp "!=" [ - PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = xident}}, PExp{_exp = IClaferId{_sident = "ref"}}]}, - PExp{_exp = IFunExp "." [PExp{_exp = IClaferId{_sident = yident}}, PExp{_exp = IClaferId{_sident = "ref"}}]}]}) - | x == xident && y == yident = return _sident - | otherwise = mzero - isUniqueConstraint _ = mzero - - uniqueRefs :: [String] - uniqueRefs = mapMaybe isUniqueConstraint $ map _exp $ mapMaybe iconstraint $ _mDecls ++ (clafers >>= _elements) - + genTopConstraint :: IElement -> Result - genTopConstraint (IEConstraint _ pexp) - | isNothing $ isUniqueConstraint $ _exp pexp = "Constraint(" ++ genConstraintPExp pexp ++ ");\n" - | otherwise = "" + genTopConstraint (IEConstraint _ pexp) = "Constraint(" ++ genConstraintPExp pexp ++ ");\n" genTopConstraint _ = "" - + genConstraint :: IClafer -> Result genConstraint IClafer{_uid, _elements} = unlines [_uid ++ ".addConstraint(" ++ genConstraintPExp c ++ ");" - | c <- filter (isNothing . isUniqueConstraint . _exp) $ mapMaybe iconstraint _elements] - + | c <- mapMaybe iconstraint _elements] + genGoal :: IElement -> Result genGoal (IEGoal _ PExp{_exp = IFunExp{_op="max", _exps=[expr]}}) = "max(" ++ genConstraintPExp expr ++ ");\n" genGoal (IEGoal _ PExp{_exp = IFunExp{_op="min", _exps=[expr]}}) = "min(" ++ genConstraintPExp expr ++ ");\n" genGoal (IEGoal _ _) = error $ "Unknown objective" genGoal _ = "" - -{- nameOfType TInteger = "integer" - nameOfType (TClafer [t]) = t - - namesOfType TInteger = ["integer"] - namesOfType (TClafer ts) = ts - getCard uid = - case card $ claferWithUid uid of - Just (low, -1) -> (low, scope) - Just (low, high) -> (low, high) - where - scope = scopeOf uid - - (l1, h1) <*> (l2, h2) = (l1 * l2, h1 * h2) - scopeCap scope (l, h) = (min scope l, min scope h) --} rewrite :: PExp -> PExp -- Rearrange right joins to left joins. rewrite p1@PExp{_iType = Just _, _exp = IFunExp "." [p2, p3@PExp{_exp = IFunExp "." _}]} = @@ -227,10 +156,10 @@ -- in the backend will treat the pre-rewritten expression the same. p1{_exp = IInt (-i)} rewrite p = p - + genConstraintPExp :: PExp -> String genConstraintPExp = genConstraintExp . _exp . rewrite - + genConstraintExp :: IExp -> String genConstraintExp (IDeclPExp quant' [] body') = mapQuant quant' ++ "(" ++ genConstraintPExp body' ++ ")" @@ -239,9 +168,9 @@ where genDecl (IDecl isDisj' locals body'') = (if isDisj' then "disjDecl" else "decl") ++ "([" ++ intercalate ", " (map genLocal locals) ++ "], " ++ genConstraintPExp body'' ++ ")" - genLocal local = + genLocal local = local ++ " = local(\"" ++ local ++ "\")" - + genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident = "ref"}}]) = "joinRef(" ++ genConstraintPExp e1 ++ ")" genConstraintExp (IFunExp "." [e1, PExp{_exp = IClaferId{_sident = "parent"}}]) = @@ -271,13 +200,13 @@ genConstraintExp (IInt val) = "constant(" ++ show val ++ ")" genConstraintExp (IStr val) = "constant(" ++ show val ++ ")" genConstraintExp (IDouble val) = "constant(" ++ show val ++ ")" - + mapQuant INo = "none" mapQuant ISome = "some" mapQuant IAll = "all" mapQuant IOne = "one" mapQuant ILone = "lone" - + mapFunc "!" = "not" mapFunc "#" = "card" mapFunc "<=>" = "ifOnlyIf" @@ -298,16 +227,16 @@ mapFunc "/" = "div" mapFunc "++" = "union" mapFunc "--" = "diff" - mapFunc "&" = "inter" - mapFunc "=>else" = "ifThenElse" + mapFunc "**" = "inter" + mapFunc "ifthenelse" = "ifThenElse" mapFunc op' = error $ "Choco: Unknown op: " ++ op' - + {- sidentOf u = ident $ claferWithUid u scopeOf "integer" = undefined scopeOf "int" = undefined scopeOf i = fromMaybe 1 $ lookup i scopes -} bitwidth = fromMaybe 4 $ lookup "int" scopes :: Integer - + -- isQuant PExp{_exp = IDeclPExp{}} = True -- isQuant _ = False
+ src/Language/Clafer/Generator/Concat.hs view
@@ -0,0 +1,84 @@+{- + Copyright (C) 2012-2013 Kacper Bak <http://gsd.uwaterloo.ca> + + 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: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + 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. +-} +module Language.Clafer.Generator.Concat where + +import Data.List +import Language.Clafer.Common +import Language.Clafer.Intermediate.Intclafer hiding (exp) + +-- | representation of strings in chunks (for line/column numbering) +data Concat = CString String | Concat { + srcPos :: IrTrace, + nodes :: [Concat] + } deriving (Eq, Show) +type Position = ((LineNo, ColNo), (LineNo, ColNo)) + +data IrTrace = + IrPExp {pUid::String} | + LowerCard {pUid::String, isGroup::Bool} | + UpperCard {pUid::String, isGroup::Bool} | + ExactCard {pUid::String, isGroup::Bool} | + NoTrace + deriving (Eq, Show) + +mkConcat :: IrTrace -> String -> Concat +mkConcat pos str = Concat pos [CString str] + +mapToCStr :: [String] -> [Concat] +mapToCStr xs = map CString xs + +iscPrimitive :: Concat -> Bool +iscPrimitive x = isPrimitive $ flatten x + +flatten :: Concat -> String +flatten (CString x) = x +flatten (Concat _ nodes') = nodes' >>= flatten + +infixr 5 +++ +(+++) :: Concat -> Concat -> Concat +(+++) (CString x) (CString y) = CString $ x ++ y +(+++) (CString "") y@Concat{} = y +(+++) x y@(Concat src ys) + | src == NoTrace = Concat NoTrace $ x : ys + | otherwise = Concat NoTrace $ [x, y] +(+++) x@Concat{} (CString "") = x +(+++) x@(Concat src xs) y + | src == NoTrace = Concat NoTrace $ xs ++ [y] + | otherwise = Concat NoTrace $ [x, y] + +cconcat :: [Concat] -> Concat +cconcat = foldr (+++) (CString "") + +cintercalate :: Concat -> [Concat] -> Concat +cintercalate xs xss = cconcat (intersperse xs xss) + +filterNull :: [Concat] -> [Concat] +filterNull = filter (not.isNull) + +isNull :: Concat -> Bool +isNull (CString "") = True +isNull (Concat _ []) = True +isNull _ = False + +cunlines :: [Concat] -> Concat +cunlines xs = cconcat $ map (+++ (CString "\n")) xs +
src/Language/Clafer/Generator/Graph.hs view
@@ -27,6 +27,7 @@ import Language.Clafer.Intermediate.Tracing import Language.Clafer.Intermediate.Intclafer import Language.Clafer.Generator.Html(genTooltip) +import Control.Applicative ((<$>)) import qualified Data.Map as Map import Data.Maybe import Prelude hiding (exp) @@ -37,12 +38,12 @@ where b = graphSimpleModule m (traceIrModule ir) showRefs -- | Generate a graph in CVL variability abstraction notation -genCVLGraph :: Module -> IModule -> String -> String +genCVLGraph :: Module -> IModule -> String -> String genCVLGraph m ir name = cleanOutput $ "digraph \"" ++ name ++ "\"\n{\nrankdir=BT;\nranksep=0.1;\nnodesep=0.1;\nnode [shape=box margin=\"0.025,0.025\"];\nedge [arrowhead=none];\n" ++ b ++ "}" where b = graphCVLModule m $ traceIrModule ir -- Simplified Notation Printer -- ---toplevel: (Top_level (Boolean), Maybe Topmost parent, Maybe immediate parent) +--toplevel: (Top_level (Boolean), Maybe Topmost parent, Maybe immediate parent) graphSimpleModule :: Module -> Map.Map Span [Ir] -> Bool -> String graphSimpleModule (Module _ []) _ _ = "" graphSimpleModule (Module s (x:xs)) irMap showRefs = graphSimpleDeclaration x (True, Nothing, Nothing) irMap showRefs ++ graphSimpleModule (Module s xs) irMap showRefs @@ -76,36 +77,122 @@ -> (Bool, Maybe String, Maybe String) -> Map.Map Span [Ir] -> Bool - -> String -graphSimpleClafer (Clafer s abstract gCard id' super' crd init' es) topLevel irMap showRefs - | fst3 topLevel == True = let {tooltip = genTooltip (Module s [ElementDecl s (Subclafer s (Clafer s abstract gCard id' super' crd init' es))]) irMap; - uid' = getDivId s irMap} in - "\"" ++ uid' ++ "\" [label=\"" ++ (head $ lines tooltip) ++ "\" URL=\"#" ++ uid' ++ "\" tooltip=\"" ++ htmlNewlines tooltip ++ "\"];\n" - ++ graphSimpleSuper super' (True, Just uid', Just uid') irMap showRefs ++ graphSimpleElements es (False, Just uid', Just uid') irMap showRefs - | otherwise = let (PosIdent (_,ident')) = id' in - graphSimpleSuper super' (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs ++ graphSimpleElements es (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs + -> String +-- top-level abstract and concrete +graphSimpleClafer (Clafer s abstract gCard id' super' reference' crd init' es) (True, _, _) irMap showRefs = + let + tooltip = genTooltip (Module s [ElementDecl s (Subclafer s (Clafer s abstract gCard id' super' reference' crd init' es))]) irMap + uid' = getDivId s irMap + in + "\"" ++ + uid' ++ + "\" [label=\"" ++ + (head $ lines tooltip) ++ + "\" URL=\"#" ++ + uid' ++ + "\" tooltip=\"" ++ + htmlChars tooltip ++ + "\"];\n" ++ + graphSimpleSuper super' (True, Just uid', Just uid') irMap showRefs ++ + graphSimpleReference reference' (True, Just uid', Just uid') irMap showRefs ++ + graphSimpleElements es (False, Just uid', Just uid') irMap showRefs +-- nested abstract +graphSimpleClafer (Clafer s abstract@(Abstract _) gCard id' super' reference' crd init' es) (False, _, _) irMap showRefs = + let + tooltip = genTooltip (Module s [ElementDecl s (Subclafer s (Clafer s abstract gCard id' super' reference' crd init' es))]) irMap + uid' = getDivId s irMap + in + "\"" ++ + uid' ++ + "\" [label=\"" ++ + (head $ lines tooltip) ++ + "\" URL=\"#" ++ + uid' ++ + "\" tooltip=\"" ++ + htmlChars tooltip ++ + "\"];\n" ++ + graphSimpleSuper super' (False, Just uid', Just uid') irMap showRefs ++ + graphSimpleReference reference' (False, Just uid', Just uid') irMap showRefs ++ + graphSimpleElements es (False, Just uid', Just uid') irMap showRefs +-- nested concrete +graphSimpleClafer (Clafer _ _ _ id' super' reference' _ _ es) topLevel irMap showRefs = + let + (PosIdent (_,ident')) = id' + in + graphSimpleSuper super' (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs ++ + graphSimpleReference reference' (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs ++ + graphSimpleElements es (fst3 topLevel, snd3 topLevel, Just ident') irMap showRefs graphSimpleSuper :: Super -> (Bool, Maybe String, Maybe String) -> Map.Map Span [Ir] -> Bool -> String -graphSimpleSuper (SuperEmpty _) _ _ _ = "" -graphSimpleSuper (SuperSome _ superHow setExp) topLevel irMap showRefs = let {parent [] = "error"; - parent (uid'@('c':xs):xss) = if '_' `elem` xs then uid' else parent xss; - parent (_:xss) = parent xss; - super' = parent $ graphSimpleSetExp setExp topLevel irMap} in - if super' == "error" then "" else "\"" ++ fromJust (snd3 topLevel) ++ "\" -> \"" ++ parent (graphSimpleSetExp setExp topLevel irMap) ++ "\"" ++ graphSimpleSuperHow superHow topLevel irMap showRefs -graphSimpleSuperHow :: SuperHow -> (Bool, Maybe String, Maybe String) -> Map.Map Span [Ir] -> Bool -> String -graphSimpleSuperHow (SuperColon _) topLevel _ _ = " [" ++ if fst3 topLevel == True - then "arrowhead=onormal constraint=true weight=100];\n" - else "arrowhead=vee arrowtail=diamond dir=both style=solid weight=10 color=gray arrowsize=0.6 minlen=2 penwidth=0.5 constraint=true];\n" -graphSimpleSuperHow (SuperArrow _) topLevel _ showRefs = " [arrowhead=vee arrowsize=0.6 penwidth=0.5 constraint=true weight=10 color=" ++ refColour showRefs ++ " fontcolor=" ++ refColour showRefs ++ (if fst3 topLevel == True then "" else " label=" ++ (fromJust $ trd3 topLevel)) ++ "];\n" -graphSimpleSuperHow (SuperMArrow _) topLevel _ showRefs = " [arrowhead=veevee arrowsize=0.6 minlen=1.5 penwidth=0.5 constraint=true weight=10 color=" ++ refColour showRefs ++ " fontcolor=" ++ refColour showRefs ++ (if fst3 topLevel == True then "" else " label=" ++ (fromJust $ trd3 topLevel)) ++ "];\n" +parent :: [String] -> String +parent [] = "error" +parent (uid'@('c':xs):xss) = if '_' `elem` xs then uid' else parent xss +parent (_:xss) = parent xss -refColour :: Bool -> String -refColour True = "lightgray" +graphSimpleSuper (SuperEmpty _) _ _ _ = "" +graphSimpleSuper (SuperSome _ setExp) topLevel irMap _ = + let + super' = parent $ graphSimpleSetExp setExp topLevel irMap + in + if super' == "error" + then "" + else "\"" ++ + fromJust (snd3 topLevel) ++ + "\" -> \"" ++ + parent (graphSimpleSetExp setExp topLevel irMap) ++ + "\"" ++ + " [" ++ if fst3 topLevel == True + then "arrowhead=onormal constraint=true weight=100];\n" + else "arrowhead=vee arrowtail=diamond dir=both style=solid weight=10 color=gray arrowsize=0.6 minlen=2 penwidth=0.5 constraint=true];\n" + +graphSimpleReference :: Reference -> (Bool, Maybe String, Maybe String) -> Map.Map Span [Ir] -> Bool -> String +graphSimpleReference (ReferenceEmpty _) _ _ _ = "" +graphSimpleReference (ReferenceSet _ setExp) topLevel irMap showRefs = + case graphSimpleSetExp setExp topLevel irMap of + ["integer"] -> "" + ["int"] -> "" + ["real"] -> "" + ["string"] -> "" + [target] -> + "\"" ++ + fromJust (snd3 topLevel) ++ + "\" -> \"" ++ + target ++ + "\"" ++ + " [arrowhead=vee arrowsize=0.6 penwidth=0.5 constraint=true weight=10 color=" ++ + refColour showRefs ++ + " fontcolor=" ++ + refColour showRefs ++ + (if fst3 topLevel == True then "" else " label=" ++ + (fromJust $ trd3 topLevel)) ++ + "];\n" + _ -> "" +graphSimpleReference (ReferenceBag _ setExp) topLevel irMap showRefs = + case graphSimpleSetExp setExp topLevel irMap of + ["integer"] -> "" + ["int"] -> "" + ["real"] -> "" + ["string"] -> "" + [target] -> + ("\"" ++ + fromJust (snd3 topLevel) ++ + "\" -> \"" ++ + target ++ + "\"" ++ + " [arrowhead=veevee arrowsize=0.6 minlen=1.5 penwidth=0.5 constraint=true weight=10 color=" ++ + refColour showRefs ++ + " fontcolor=" ++ + refColour showRefs ++ + (if fst3 topLevel == True then "" else " label=" ++ + (fromJust $ trd3 topLevel)) ++ "];\n") + _ -> "" +refColour :: Bool -> String +refColour True = "lightgray" refColour False = "transparent" graphSimpleName :: Name -> (Bool, Maybe String, Maybe String) -> Map.Map Span [Ir] -> String @@ -152,44 +239,45 @@ graphCVLModule (Module s (x:xs)) irMap = graphCVLDeclaration x Nothing irMap ++ graphCVLModule (Module s xs) irMap graphCVLDeclaration :: Declaration -> Maybe String -> Map.Map Span [Ir] -> String -graphCVLDeclaration (ElementDecl _ element) parent irMap = graphCVLElement element parent irMap +graphCVLDeclaration (ElementDecl _ element) parent' irMap = graphCVLElement element parent' irMap graphCVLDeclaration _ _ _ = "" graphCVLElement :: Element -> Maybe String -> Map.Map Span [Ir] -> String -graphCVLElement (Subclafer _ clafer) parent irMap = graphCVLClafer clafer parent irMap ---graphCVLElement (ClaferUse _ name _ _) parent irMap = if parent == Nothing then "" else "?" ++ " -> " ++ graphCVLName name parent irMap ++ " [arrowhead = onormal style = dashed constraint = false];\n" -graphCVLElement (ClaferUse s _ _ _) parent irMap = if parent == Nothing then "" else "?" ++ " -> " ++ getUseId s irMap ++ " [arrowhead = onormal style = dashed constraint = false];\n" -graphCVLElement (Subconstraint _ constraint) parent irMap = graphCVLConstraint constraint parent irMap -graphCVLElement (Subgoal _ constraint) parent irMap = graphCVLGoal constraint parent irMap -graphCVLElement (Subsoftconstraint _ constraint) parent irMap = graphCVLSoftConstraint constraint parent irMap +graphCVLElement (Subclafer _ clafer) parent' irMap = graphCVLClafer clafer parent' irMap +--graphCVLElement (ClaferUse _ name _ _) parent' irMap = if parent' == Nothing then "" else "?" ++ " -> " ++ graphCVLName name parent' irMap ++ " [arrowhead = onormal style = dashed constraint = false];\n" +graphCVLElement (ClaferUse s _ _ _) parent' irMap = if parent' == Nothing then "" else "?" ++ " -> " ++ getUseId s irMap ++ " [arrowhead = onormal style = dashed constraint = false];\n" +graphCVLElement (Subconstraint _ constraint) parent' irMap = graphCVLConstraint constraint parent' irMap +graphCVLElement (Subgoal _ constraint) parent' irMap = graphCVLGoal constraint parent' irMap +graphCVLElement (Subsoftconstraint _ constraint) parent' irMap = graphCVLSoftConstraint constraint parent' irMap graphCVLElements :: Elements -> Maybe String -> Map.Map Span [Ir] -> String graphCVLElements (ElementsEmpty _) _ _ = "" -graphCVLElements (ElementsList _ es) parent irMap = concatMap (\x -> graphCVLElement x parent irMap ++ "\n") es +graphCVLElements (ElementsList _ es) parent' irMap = concatMap (\x -> graphCVLElement x parent' irMap ++ "\n") es graphCVLClafer :: Clafer -> Maybe String -> Map.Map Span [Ir] -> String -graphCVLClafer (Clafer s _ gCard _ super' crd _ es) parent irMap +graphCVLClafer (Clafer s _ gCard _ super' reference' crd _ es) parent' irMap = let {{-tooltip = genTooltip (Module [ElementDecl (Subclafer (Clafer abstract gCard id' super' crd init' es))]) irMap;-} uid' = getDivId s irMap; - gcrd = graphCVLGCard gCard parent irMap; - super'' = graphCVLSuper super' parent irMap} in - "\"" ++ uid' ++ "\" [URL=\"#" ++ uid' ++ "\" label=\"" ++ dropUid uid' ++ super'' ++ (if choiceCard crd then "\" style=rounded" else " [" ++ graphCVLCard crd parent irMap ++ "]\"") + gcrd = graphCVLGCard gCard parent' irMap; + super'' = graphCVLSuper super' parent' irMap; + reference'' = graphCVLReference reference' parent' irMap} in + "\"" ++ uid' ++ "\" [URL=\"#" ++ uid' ++ "\" label=\"" ++ dropUid uid' ++ super'' ++ reference'' ++ (if choiceCard crd then "\" style=rounded" else " [" ++ graphCVLCard crd parent' irMap ++ "]\"") ++ (if super'' == "" then "" else " shape=oval") ++ "];\n" ++ (if gcrd == "" then "" else "g" ++ uid' ++ " [label=\"" ++ gcrd ++ "\" fontsize=10 shape=triangle];\ng" ++ uid' ++ " -> " ++ uid' ++ " [weight=10];\n") - ++ (if parent==Nothing then "" else uid' ++ " -> " ++ fromJust parent ++ (if lowerCard crd == "0" then " [style=dashed]" else "") ++ ";\n") + ++ (if parent'==Nothing then "" else uid' ++ " -> " ++ fromJust parent' ++ (if lowerCard crd == "0" then " [style=dashed]" else "") ++ ";\n") ++ graphCVLElements es (if gcrd == "" then (Just uid') else (Just $ "g" ++ uid')) irMap graphCVLSuper :: Super -> Maybe String -> Map.Map Span [Ir] -> String graphCVLSuper (SuperEmpty _) _ _ = "" -graphCVLSuper (SuperSome _ superHow setExp) parent irMap = graphCVLSuperHow superHow ++ concat (graphCVLSetExp setExp parent irMap) +graphCVLSuper (SuperSome _ setExp) parent' irMap = ":" ++ concat (graphCVLSetExp setExp parent' irMap) -graphCVLSuperHow :: SuperHow -> String -graphCVLSuperHow (SuperColon _) = ":" -graphCVLSuperHow (SuperArrow _) = "->" -graphCVLSuperHow (SuperMArrow _) = "->>" +graphCVLReference :: Reference -> Maybe String -> Map.Map Span [Ir] -> String +graphCVLReference (ReferenceEmpty _) _ _ = "" +graphCVLReference (ReferenceSet _ setExp) parent' irMap = "->" ++ concat (graphCVLSetExp setExp parent' irMap) +graphCVLReference (ReferenceBag _ setExp) parent' irMap = "->>" ++ concat (graphCVLSetExp setExp parent' irMap) graphCVLName :: Name -> Maybe String -> Map.Map Span [Ir] -> String -graphCVLName (Path _ modids) parent irMap = unwords $ map (\x -> graphCVLModId x parent irMap) modids +graphCVLName (Path _ modids) parent' irMap = unwords $ map (\x -> graphCVLModId x parent' irMap) modids graphCVLModId :: ModId -> Maybe String -> Map.Map Span [Ir] -> String graphCVLModId (ModIdIdent _ posident) _ irMap = graphCVLPosIdent posident irMap @@ -198,22 +286,22 @@ graphCVLPosIdent (PosIdent (pos, id')) irMap = getUid (PosIdent (pos, id')) irMap graphCVLConstraint :: Constraint -> Maybe String -> Map.Map Span [Ir] -> String -graphCVLConstraint (Constraint s exps') parent irMap = let body' = htmlNewlines $ genTooltip (Module s [ElementDecl s (Subconstraint s (Constraint s exps'))]) irMap; +graphCVLConstraint (Constraint s exps') parent' irMap = let body' = htmlChars $ genTooltip (Module s [ElementDecl s (Subconstraint s (Constraint s exps'))]) irMap; uid' = "\"" ++ getExpId s irMap ++ "\"" in uid' ++ " [label=\"" ++ body' ++ "\" shape=parallelogram];\n" ++ - if parent == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent ++ "\";\n" + if parent' == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent' ++ "\";\n" graphCVLSoftConstraint :: SoftConstraint -> Maybe String -> Map.Map Span [Ir] -> String -graphCVLSoftConstraint (SoftConstraint s exps') parent irMap = let body' = htmlNewlines $ genTooltip (Module s [ElementDecl s (Subsoftconstraint s (SoftConstraint s exps'))]) irMap; +graphCVLSoftConstraint (SoftConstraint s exps') parent' irMap = let body' = htmlChars $ genTooltip (Module s [ElementDecl s (Subsoftconstraint s (SoftConstraint s exps'))]) irMap; uid' = "\"" ++ getExpId s irMap ++ "\"" in uid' ++ " [label=\"" ++ body' ++ "\" shape=parallelogram];\n" ++ - if parent == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent ++ "\";\n" + if parent' == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent' ++ "\";\n" graphCVLGoal :: Goal -> Maybe String -> Map.Map Span [Ir] -> String -graphCVLGoal (Goal s exps') parent irMap = let body' = htmlNewlines $ genTooltip (Module s [ElementDecl s (Subgoal s (Goal s exps'))]) irMap; +graphCVLGoal (Goal s exps') parent' irMap = let body' = htmlChars $ genTooltip (Module s [ElementDecl s (Subgoal s (Goal s exps'))]) irMap; uid' = "\"" ++ getExpId s irMap ++ "\"" in uid' ++ " [label=\"" ++ body' ++ "\" shape=parallelogram];\n" ++ - if parent == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent ++ "\";\n" + if parent' == Nothing then "" else uid' ++ " -> \"" ++ fromJust parent' ++ "\";\n" graphCVLCard :: Card -> Maybe String -> Map.Map Span [Ir] -> String graphCVLCard (CardEmpty _) _ _ = "1..1" @@ -221,17 +309,17 @@ graphCVLCard (CardSome _) _ _ = "1..*" graphCVLCard (CardAny _) _ _ = "0..*" graphCVLCard (CardNum _ (PosInteger (_, n))) _ _ = n ++ ".." ++ n -graphCVLCard (CardInterval _ ncard) parent irMap = graphCVLNCard ncard parent irMap +graphCVLCard (CardInterval _ ncard) parent' irMap = graphCVLNCard ncard parent' irMap -graphCVLNCard :: NCard -> Maybe String -> Map.Map Span [Ir] -> String -graphCVLNCard (NCard _ (PosInteger (_, num)) exInteger) parent irMap = num ++ ".." ++ graphCVLExInteger exInteger parent irMap +graphCVLNCard :: NCard -> Maybe String -> Map.Map Span [Ir] -> String +graphCVLNCard (NCard _ (PosInteger (_, num)) exInteger) parent' irMap = num ++ ".." ++ graphCVLExInteger exInteger parent' irMap graphCVLExInteger :: ExInteger -> Maybe String -> Map.Map Span [Ir] -> String graphCVLExInteger (ExIntegerAst _) _ _ = "*" graphCVLExInteger (ExIntegerNum _ (PosInteger(_, num))) _ _ = num graphCVLGCard :: GCard -> Maybe String -> Map.Map Span [Ir] -> String -graphCVLGCard (GCardInterval _ ncard) parent irMap = graphCVLNCard ncard parent irMap +graphCVLGCard (GCardInterval _ ncard) parent' irMap = graphCVLNCard ncard parent' irMap graphCVLGCard (GCardEmpty _) _ _ = "" graphCVLGCard (GCardXor _) _ _ = "1..1" graphCVLGCard (GCardOr _) _ _ = "1..*" @@ -249,14 +337,14 @@ graphCVLAbstract _ _ _ = ""-} graphCVLSetExp :: SetExp -> Maybe String -> Map.Map Span [Ir] -> [String] -graphCVLSetExp (ClaferId _ name) parent irMap = [graphCVLName name parent irMap] -graphCVLSetExp (Union _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap -graphCVLSetExp (UnionCom _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap -graphCVLSetExp (Difference _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap -graphCVLSetExp (Intersection _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap -graphCVLSetExp (Domain _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap -graphCVLSetExp (Range _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap -graphCVLSetExp (Join _ set1 set2) parent irMap = graphCVLSetExp set1 parent irMap ++ graphCVLSetExp set2 parent irMap +graphCVLSetExp (ClaferId _ name) parent' irMap = [graphCVLName name parent' irMap] +graphCVLSetExp (Union _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap +graphCVLSetExp (UnionCom _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap +graphCVLSetExp (Difference _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap +graphCVLSetExp (Intersection _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap +graphCVLSetExp (Domain _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap +graphCVLSetExp (Range _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap +graphCVLSetExp (Join _ set1 set2) parent' irMap = graphCVLSetExp set1 parent' irMap ++ graphCVLSetExp set2 parent' irMap {-graphCVLEnumId (EnumIdIdent posident) _ irMap = graphCVLPosIdent posident irMap graphCVLEnumId (PosEnumIdIdent _ posident) parent irMap = graphCVLEnumId (EnumIdIdent posident) parent irMap-} @@ -289,13 +377,13 @@ findUid id' $ getIdentPExp pexp where {getIdentPExp (PExp _ _ _ exp') = getIdentIExp exp'; getIdentIExp (IFunExp _ exps') = concatMap getIdentPExp exps'; - getIdentIExp (IClaferId _ id'' _) = [id'']; + getIdentIExp (IClaferId _ id'' _ _) = [id'']; getIdentIExp (IDeclPExp _ _ pexp) = getIdentPExp pexp; getIdentIExp _ = []; findUid name (x:xs) = if name == dropUid x then x else findUid name xs; findUid name [] = name} -getDivId :: Span -> Map.Map Span [Ir] -> String +getDivId :: Span -> Map.Map Span [Ir] -> String getDivId s irMap = if Map.lookup s irMap == Nothing then "Uid not Found" else let IRClafer iClaf = head $ fromJust $ Map.lookup s irMap in @@ -310,8 +398,10 @@ getUseId :: Span -> Map.Map Span [Ir] -> String getUseId s irMap = if Map.lookup s irMap == Nothing then "Uid not Found" - else let IRClafer iClaf = head $ fromJust $ Map.lookup s irMap in - _sident $ _exp $ head $ _supers $ _super iClaf + else let + IRClafer iClaf = head $ fromJust $ Map.lookup s irMap + in + fromMaybe "" $ _sident <$> _exp <$> _super iClaf getExpId :: Span -> Map.Map Span [Ir] -> String getExpId s irMap = if Map.lookup s irMap == Nothing @@ -321,10 +411,12 @@ {-while :: Bool -> [IExp] -> [IExp] while bool exp' = if bool then exp' else []-} -htmlNewlines :: String -> String -htmlNewlines "" = "" -htmlNewlines ('\n':xs) = " " ++ htmlNewlines xs -htmlNewlines (x:xs) = x:htmlNewlines xs +htmlChars :: String -> String +htmlChars "" = "" +htmlChars ('\n':xs) = " " ++ htmlChars xs +htmlChars ('-':'>':'>':xs) = "->>" ++ htmlChars xs +htmlChars ('-':'>':xs) = "->" ++ htmlChars xs +htmlChars (x:xs) = x:htmlChars xs cleanOutput :: String -> String cleanOutput "" = ""
src/Language/Clafer/Generator/Html.hs view
@@ -41,6 +41,8 @@ import Language.Clafer.Front.LayoutResolver(revertLayout) import Language.Clafer.Intermediate.Tracing import Language.Clafer.Intermediate.Intclafer + +import Control.Applicative ((<$>)) import Data.List (intersperse,genericSplitAt) import qualified Data.Map as Map import Data.Maybe @@ -69,7 +71,7 @@ | row == row' = case take 3 comment of '/':'/':'#':[] -> (cs,"<!-- " ++ trim' (drop 2 comment) ++ " /-->\n") '/':'/':_:[] -> if col' == 1 - then (cs, printStandaloneComment comment ++ "\n") + then (cs, printStandaloneComment comment ++ "\n") else (cs, printInlineComment comment ++ "\n") '/':'*':_:[] -> (cs, printStandaloneComment comment ++ "\n") _ -> (cs, "Improper form of comment.")-- Should not happen. Bug. @@ -83,7 +85,7 @@ -- | Generate the model as HTML document genHtml :: Module -> IModule -> String genHtml x ir = cleanOutput $ revertLayout $ printModule x (traceIrModule ir) True --- | Generate the model as plain text +-- | Generate the model as plain text -- | This is used by the graph generator for tooltips genText :: Module -> IModule -> String genText x ir = cleanOutput $ revertLayout $ printModule x (traceIrModule ir) False @@ -95,13 +97,13 @@ printModule (Module s (x:xs)) irMap html = (printDeclaration x 0 irMap html []) ++ printModule (Module s xs) irMap html printDeclaration :: Declaration -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String -printDeclaration (EnumDecl s posIdent enumIds) indent irMap html comments = +printDeclaration (EnumDecl s posIdent enumIds) indent irMap html comments = preComments ++ printIndentId 0 html ++ - (while html "<span class=\"keyword\">") ++ "enum" ++ (while html "</span>") ++ - " " ++ - (printPosIdent posIdent (Just uid') html) ++ - " = " ++ + (while html "<span class=\"keyword\">") ++ "enum" ++ (while html "</span>") ++ + " " ++ + (printPosIdent posIdent (Just uid') html) ++ + " = " ++ (concat $ intersperse " | " (map (\x -> printEnumId x indent irMap html comments) enumIds)) ++ comment ++ printIndentEnd html @@ -114,50 +116,50 @@ printElement :: Element -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String printElement (Subclafer _ clafer) indent irMap html comments = printClafer clafer indent irMap html comments -printElement (ClaferUse s name crd es) indent irMap html comments = - preComments ++ +printElement (ClaferUse s name crd es) indent irMap html comments = + preComments ++ printIndentId indent html ++ - "`" ++ (while html ("<a href=\"#" ++ superId ++ "\"><span class=\"reference\">")) ++ + "`" ++ (while html ("<a href=\"#" ++ superId ++ "\"><span class=\"reference\">")) ++ printName name indent irMap False [] --trick the printer into only printing the name - ++ (while html "</span></a>") ++ - printCard crd ++ - comment ++ - printIndentEnd html ++ + ++ (while html "</span></a>") ++ + printCard crd ++ + comment ++ + printIndentEnd html ++ printElements es indent irMap html comments'' where (_, superId) = getUseId s irMap; (comments', preComments) = printPreComment s comments; - (comments'', comment) = printComment s comments' + (comments'', comment) = printComment s comments' -printElement (Subgoal s goal) indent irMap html comments = - preComments ++ +printElement (Subgoal s goal) indent irMap html comments = + preComments ++ printIndent 0 html ++ printGoal goal indent irMap html comments'' ++ - comment ++ + comment ++ printIndentEnd html where - (comments', preComments) = printPreComment s comments; - (comments'', comment) = printComment s comments' + (comments', preComments) = printPreComment s comments; + (comments'', comment) = printComment s comments' printElement (Subconstraint s constraint) indent irMap html comments = preComments ++ - printIndent indent html ++ + printIndent indent html ++ printConstraint constraint indent irMap html comments'' ++ comment ++ - printIndentEnd html + printIndentEnd html where (comments', preComments) = printPreComment s comments; - (comments'', comment) = printComment s comments' + (comments'', comment) = printComment s comments' printElement (Subsoftconstraint s constraint) indent irMap html comments = - preComments ++ - printIndent indent html ++ + preComments ++ + printIndent indent html ++ printSoftConstraint constraint indent irMap html comments'' ++ comment ++ - printIndentEnd html + printIndentEnd html where (comments', preComments) = printPreComment s comments; - (comments'', comment) = printComment s comments' + (comments'', comment) = printComment s comments' printElements :: Elements -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String printElements (ElementsEmpty _) _ _ _ _ = "" @@ -174,11 +176,11 @@ span' (Subsoftconstraint s _) = s printClafer :: Clafer -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String -printClafer (Clafer s abstract gCard id' super' crd init' es) indent irMap html comments = - preComments ++ - printIndentId indent html ++ - claferDeclaration ++ - comment ++ +printClafer (Clafer s abstract gCard id' super' reference' crd init' es) indent irMap html comments = + preComments ++ + printIndentId indent html ++ + claferDeclaration ++ + comment ++ printElements es indent irMap html comments'' ++ printIndentEnd html where @@ -186,18 +188,19 @@ (comments', preComments) = printPreComment s comments; (comments'', comment) = printComment s comments' claferDeclaration = concat [ - printAbstract abstract html, + printAbstract abstract html, printGCard gCard html, - printPosIdent id' (Just uid') html, - printSuper super' indent irMap html comments, - printCard crd, + printPosIdent id' (Just uid') html, + printSuper super' indent irMap html comments, + printReference reference' indent irMap html comments, + printCard crd, printInit init' indent irMap html comments] -printGoal :: Goal -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String -printGoal (Goal _ exps') indent irMap html comments = - (if html then "<<" else "<<") ++ - concatMap (\x -> printExp x indent irMap html comments) exps' ++ - if html then ">>" else ">>" +printGoal :: Goal -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String +printGoal (Goal _ exps') indent irMap html comments = + (if html then "<<" else "<<") ++ + concatMap (\x -> printExp x indent irMap html comments) exps' ++ + if html then ">>" else ">>" printAbstract :: Abstract -> Bool -> String printAbstract (Abstract _) html = (while html "<span class=\"keyword\">") ++ "abstract" ++ (while html "</span>") ++ " " @@ -214,8 +217,8 @@ printNCard :: NCard -> String printNCard (NCard _ (PosInteger (_, num)) exInteger) = num ++ ".." ++ printExInteger exInteger ++ " " - -printExInteger :: ExInteger -> String + +printExInteger :: ExInteger -> String printExInteger (ExIntegerAst _) = "*" printExInteger (ExIntegerNum _ (PosInteger(_, num))) = num @@ -236,44 +239,45 @@ printSuper :: Super -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String printSuper (SuperEmpty _) _ _ _ _ = "" -printSuper (SuperSome _ superHow setExp) indent irMap html comments = printSuperHow superHow indent irMap html comments ++ printSetExp setExp indent irMap html comments +printSuper (SuperSome _ setExp) indent irMap html comments = (while html "<span class=\"keyword\">") ++ " : " ++ (while html "</span>") ++ printSetExp setExp indent irMap html comments -printSuperHow :: SuperHow -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String -printSuperHow (SuperColon _) _ _ html _ = (while html "<span class=\"keyword\">") ++ " :" ++ (while html "</span>") ++ " " -printSuperHow (SuperArrow _) _ _ html _ = (while html "<span class=\"keyword\">") ++ " ->" ++ (while html "</span>") ++ " " -printSuperHow (SuperMArrow _) _ _ html _ = (while html "<span class=\"keyword\">") ++ " ->>" ++ (while html "</span>") ++ " " +printReference :: Reference -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String +printReference (ReferenceEmpty _) _ _ _ _ = "" +printReference (ReferenceSet _ setExp) indent irMap html comments = (while html "<span class=\"keyword\">") ++ " -> " ++ (while html "</span>") ++ printSetExp setExp indent irMap html comments +printReference (ReferenceBag _ setExp) indent irMap html comments = (while html "<span class=\"keyword\">") ++ " ->> " ++ (while html "</span>") ++ printSetExp setExp indent irMap html comments + printCard :: Card -> String printCard (CardEmpty _) = "" printCard (CardLone _) = " ?" printCard (CardSome _) = " +" printCard (CardAny _) = " *" -printCard (CardNum _ (PosInteger (_,num))) = " " ++ num +printCard (CardNum _ (PosInteger (_,num))) = " " ++ num printCard (CardInterval _ nCard) = " " ++ printNCard nCard printConstraint :: Constraint -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String printConstraint (Constraint _ exps') indent irMap html comments = (concatMap (\x -> printConstraint' x indent irMap html comments) exps') printConstraint' :: Exp -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String -printConstraint' exp' indent irMap html comments = +printConstraint' exp' indent irMap html comments = while html "<span class=\"keyword\">" ++ "[" ++ while html "</span>" ++ - " " ++ - printExp exp' indent irMap html comments ++ - " " ++ + " " ++ + printExp exp' indent irMap html comments ++ + " " ++ while html "<span class=\"keyword\">" ++ "]" ++ while html "</span>" printSoftConstraint :: SoftConstraint -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String printSoftConstraint (SoftConstraint _ exps') indent irMap html comments = concatMap (\x -> printSoftConstraint' x indent irMap html comments) exps' printSoftConstraint' :: Exp -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String -printSoftConstraint' exp' indent' irMap html comments = - while html "<span class=\"keyword\">" ++ "(" ++ while html "</span>" ++ +printSoftConstraint' exp' indent' irMap html comments = + while html "<span class=\"keyword\">" ++ "(" ++ while html "</span>" ++ " " ++ - printExp exp' indent' irMap html comments ++ - " " ++ + printExp exp' indent' irMap html comments ++ + " " ++ while html "<span class=\"keyword\">" ++ ")" ++ while html "</span>" printDecl :: Decl-> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String -printDecl (Decl _ locids setExp) indent irMap html comments = +printDecl (Decl _ locids setExp) indent irMap html comments = (concat $ intersperse "; " $ map printLocId locids) ++ (while html "<span class=\"keyword\">") ++ " : " ++ (while html "</span>") ++ printSetExp setExp indent irMap html comments where @@ -285,8 +289,8 @@ printInit (InitSome _ initHow exp') indent irMap html comments = printInitHow initHow ++ printExp exp' indent irMap html comments printInitHow :: InitHow -> String -printInitHow (InitHow_1 _) = " = " -printInitHow (InitHow_2 _) = " := " +printInitHow (InitConstant _) = " = " +printInitHow (InitDefault _) = " := " printExp :: Exp -> Int -> Map.Map Span [Ir] -> Bool -> [(Span, String)] -> String printExp (DeclAllDisj _ decl exp') indent irMap html comments = "all disj " ++ (printDecl decl indent irMap html comments) ++ " | " ++ (printExp exp' indent irMap html comments) @@ -358,9 +362,9 @@ printIndentEnd html = (while html "</div>") ++ "\n" dropUid :: String -> String -dropUid uid' = let id' = rest $ dropWhile (/= '_') uid' - in if id' == "" - then uid' +dropUid uid' = let id' = rest $ dropWhile (/= '_') uid' + in if id' == "" + then uid' else id' --so it fails more gracefully on empty lists @@ -372,14 +376,17 @@ rest (_:xs) = xs getUid :: PosIdent -> Map.Map Span [Ir] -> String -getUid posIdent@(PosIdent (_, id')) irMap = +getUid posIdent@(PosIdent (_, id')) irMap = if Map.lookup (getSpan posIdent) irMap == Nothing then "Lookup failed" - else let IRPExp pexp = head $ fromJust $ Map.lookup (getSpan posIdent) irMap in - findUid id' $ getIdentPExp pexp - where {getIdentPExp (PExp _ _ _ exp') = getIdentIExp exp'; + else let wrappedResult = head $ fromJust $ Map.lookup (getSpan posIdent) irMap in + findUid id' $ unwrap wrappedResult + where {unwrap (IRPExp pexp') = getIdentPExp pexp'; + unwrap (IRClafer iClafer') = [ _uid iClafer' ]; + unwrap x = error $ "Html:getUid:unwrap called on: " ++ show x; + getIdentPExp (PExp _ _ _ exp') = getIdentIExp exp'; getIdentIExp (IFunExp _ exps') = concatMap getIdentPExp exps'; - getIdentIExp (IClaferId _ id'' _) = [id'']; + getIdentIExp (IClaferId _ id'' _ _) = [id'']; getIdentIExp (IDeclPExp _ _ pexp) = getIdentPExp pexp; getIdentIExp _ = []; findUid name (x:xs) = if name == dropUid x then x else findUid name xs; @@ -400,7 +407,7 @@ getUseId s irMap = if Map.lookup s irMap == Nothing then ("Uid not Found", "Uid not Found") else let IRClafer iClaf = head $ fromJust $ Map.lookup s irMap in - (_uid iClaf, _sident $ _exp $ head $ _supers $ _super iClaf) + (_uid iClaf, fromMaybe "" $ _sident <$> _exp <$> _super iClaf) while :: Bool -> String -> String while bool exp' = if bool then exp' else "" @@ -421,7 +428,7 @@ where replace _ _ [] = [] replace x y (z:zs) = (if x == z then y else z):replace x y zs - + highlightErrors' :: [String] -> [ClaferErr] -> [String] highlightErrors' model' [] = model' highlightErrors' model' ((ClaferErr _):es) = highlightErrors' model' es @@ -430,8 +437,8 @@ newLine = fst (genericSplitAt (c - 1) $ last ls) ++ "<span class=\"error\" title=\"Parsing failed at line " ++ show l ++ " column " ++ show c ++ "...\n" ++ msg' ++ "\">" ++ (if snd (genericSplitAt (c - 1) $ last ls) == "" then " " else snd (genericSplitAt (c - 1) $ last ls)) ++ "</span>" in highlightErrors' (init ls ++ [newLine] ++ lss) es -highlightErrors' model' ((SemanticErr ErrPos{modelPos = Pos l c, fragId = n} msg'):es) = +highlightErrors' model' ((SemanticErr ErrPos{modelPos = Pos l c, fragId = n} msg'):es) = let (ls, lss) = genericSplitAt (l + toInteger n) model' newLine = fst (genericSplitAt (c - 1) $ last ls) ++ "<span class=\"error\" title=\"Compiling failed at line " ++ show l ++ " column " ++ show c ++ "...\n" ++ msg' ++ "\">" ++ (if snd (genericSplitAt (c - 1) $ last ls) == "" then " " else snd (genericSplitAt (c - 1) $ last ls)) ++ "</span>" - in highlightErrors' (init ls ++ [newLine] ++ lss) es+ in highlightErrors' (init ls ++ [newLine] ++ lss) es
src/Language/Clafer/Generator/Python.hs view
@@ -22,10 +22,12 @@ -- | Generates Python representation of IR for the <https://github.com/gsdlab/ClaferZ3 ClaferZ3>. module Language.Clafer.Generator.Python where +import Data.Char +import Data.Maybe (fromMaybe) + import Language.Clafer.Common import Language.Clafer.Front.Absclafer import Language.Clafer.Intermediate.Intclafer -import Data.Char tag:: String -> String -> String tag name exp' = concat ["<", name, ">", exp', "</", name, ">\n"] @@ -60,7 +62,7 @@ genPythonIntPair :: (Integer, Integer) -> String genPythonIntPair (x, y) = concat - [ "(", genPythonInteger x + [ "(", genPythonInteger x , "," , genPythonInteger y, ")"] @@ -93,13 +95,15 @@ genPythonClafer :: IClafer -> Result genPythonClafer x = case x of - IClafer pos' abstract' gcard' id' uid' super' card' glcard' elements' -> - concat [ "\t", genPythonPosition pos', "\n" + IClafer pos' abstract' gcard' id' uid' puid' super' refrence' card' glcard' elements' -> + concat [ "\t", genPythonPosition pos', "\n" , "\t", genPythonAbstract abstract', "\n" , "\t", maybe "" genPythonGCard gcard', "\n" , "\t", genPythonId id', "\n" , "\t", genPythonUid uid', "\n" + , "\t", genPythonParentUid puid', "\n" , "\t", genPythonSuper super', "\n" + , "\t", genPythonReference refrence', "\n" , "\t", maybe "" genPythonCard card', "\n" , "\t", genPythonGlCard glcard', "\n" , "\tcurrClafer = Clafer.Clafer(pos=pos, isAbstract=isAbstract, gcard=groupCard, ident=id, uid=uid, my_supers=my_supers, card=card, glCard=globalCard)\n" @@ -107,18 +111,18 @@ , "\tstack.append(currClafer)\n" , concatMap genPythonElement elements' , "\tstack.pop()\n"] - + genPythonAbstract :: Bool -> String genPythonAbstract isAbstract' = concat [ genPythonBoolean "isAbstract" isAbstract'] genPythonGCard :: IGCard -> String -genPythonGCard (IGCard isKeyword' interval') = concat - [ "groupCard = GCard.GCard(", genPythonBoolean "isKeyword" isKeyword', ", " +genPythonGCard (IGCard isKeyword' interval') = concat + [ "groupCard = GCard.GCard(", genPythonBoolean "isKeyword" isKeyword', ", " , "interval=" , genPythonInterval interval' , ")"] genPythonInterval :: (Integer, Integer) -> String genPythonInterval (nMin, nMax) = concat - [ "(", genPythonInteger nMin + [ "(", genPythonInteger nMin , ",", genPythonInteger nMax , ")"] @@ -128,12 +132,27 @@ genPythonUid :: String -> String genPythonUid uid' = concat [ "uid=\"", uid', "\""] -genPythonSuper :: ISuper -> String +genPythonParentUid :: String -> String +genPythonParentUid uid' = concat [ "parentUid=\"", uid', "\""] + +genPythonSuper :: Maybe PExp -> String genPythonSuper x = case x of - ISuper isOverlapping' pexps' -> concat - [ "my_supers = Supers.Supers(", genPythonBoolean "isOverlapping" isOverlapping', ", elements=[" - , concatMap (genPythonPExp "Super") pexps' , "])"] + Nothing -> "" + Just pexp' -> concat + [ "my_Super = " + , genPythonPExp "Super" pexp' + ] +genPythonReference :: Maybe IReference -> String +genPythonReference x = case x of + Nothing -> "" + Just (IReference isSet' pexp') -> concat + [ "my_Reference = Reference.Reference(" + , genPythonBoolean "isSet" isSet' + , ", " + , genPythonPExp "Ref" pexp' + , ")" ] + genPythonCard :: (Integer, Integer) -> String genPythonCard interval' = concat [ "card=" , genPythonInterval interval'] @@ -147,12 +166,12 @@ [ "##### constraint #####\n", "\tconstraint = IRConstraint.IRConstraint(" , genPythonBoolean "isHard" isHard' , " ," , " exp=", genPythonPExp "ParentExp" pexp' , ")\n" , "\tstack[-1].addElement(constraint)\n"] - IEGoal isMaximize' pexp' -> concat + IEGoal isMaximize' pexp' -> concat [ "##### goal #####\n" ,"\tgoal = Goal.Goal(" , genPythonBoolean "isMaximize" isMaximize' , ", exp=", genPythonPExp "ParentExp" pexp' , ")\n" , "\tstack[-1].addElement(goal)\n"] - - + + {-genPythonAnyOp ft f xs = concatMap (\(tname, texp) -> tagType tname (ft texp) $ f texp) xs -} @@ -162,9 +181,9 @@ [ "\n\t\tExp.Exp","(expType=\"", tagName, "\", ", maybe "exptype=\"\"" genPythonIType iType' , ", parentId=\"", pid', "\"" , ", " , genPythonPosition pos' - , ", iExpType=\"" , genPythonIExpType iexp' , "\"" + , ", iExpType=\"" , genPythonIExpType iexp' , "\"" , ", iExp=[" , genPythonIExp iexp' ,"])"] - + genPythonPosition :: Span -> String genPythonPosition (Span (Pos s1 s2) (Pos e1 e2)) = concat [ "pos=(", genPythonIntPair (s1, s2), ", ", genPythonIntPair (e1, e2), ")"] @@ -176,7 +195,7 @@ IInt _ -> "IIntExp" IDouble _ -> "IDoubleExp" IStr _ -> "IStringExp" - IClaferId _ _ _ -> "IClaferId" + IClaferId _ _ _ _ -> "IClaferId" declHelper :: [IDecl] -> String @@ -201,11 +220,12 @@ escape x = [x] -} IInt n -> genPythonInteger n IDouble n -> concat [ "DoubleLiteral.DoubleLiteral(", show n, ")"] --DoubleLiteral - IStr str -> genPythonString str - IClaferId modName' sident' isTop' -> concat + IStr str -> genPythonString str + IClaferId modName' sident' isTop' bind' -> concat [ "ClaferId.ClaferId(moduleName=\"", modName' , "\", " , "my_id=\"", sident' , "\", " - , genPythonBoolean "isTop" isTop', ")"] + , genPythonBoolean "isTop" isTop' , ", " + , "my_bind=\"", fromMaybe "" bind' , "\")"] genPythonDecl :: IDecl -> String
src/Language/Clafer/Generator/Schema.hs view
@@ -47,11 +47,12 @@ , "\n" , " <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n" , " <!--\n" - , " data IType = TBoolean\n" - , " | TString\n" - , " | TInteger\n" - , " | TReal\n" - , " | TClafer\n" + , "data IType\n" + , " = TBoolean\n" + , " | TString\n" + , " | TInteger\n" + , " | TReal\n" + , " | TClafer [UID]\n" , " -->\n" , " <xs:complexType name=\"IType\" abstract=\"true\"/>\n" , " <xs:element name=\"Type\" type=\"cl:IType\"/>\n" @@ -73,7 +74,7 @@ , " <xs:extension base=\"cl:IType\"/>\n" , " </xs:complexContent>\n" , " </xs:complexType>\n" - , " \n" + , "\n" , " <xs:complexType name=\"IReal\">\n" , " <xs:complexContent>\n" , " <xs:extension base=\"cl:IType\"/>\n" @@ -87,9 +88,11 @@ , " </xs:complexType>\n" , "\n" , " <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n" - , " <!-- data IModule = IModule {\n" - , " mName :: String,\n" - , " mDecls :: [IElement]\n" + , " <!--\n" + , "data IModule\n" + , " = IModule\n" + , " { _mName :: String\n" + , " , _mDecls :: [IElement]\n" , " }\n" , " -->\n" , "\n" @@ -103,17 +106,20 @@ , " <xs:element name=\"Module\" type=\"cl:IModule\"/>\n" , "\n" , " <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n" - , " <!-- data IClafer =\n" - , " IClafer {\n" - , " isAbstract :: Bool, - determines whether it's abstract\n" - , " gcard :: Maybe IGCard, - group cardinality\n" - , " ident :: String, - name\n" - , " uid :: String, - (o) unique identifier\n" - , " super:: ISuper, - superclafers\n" - , " card :: Maybe Interval, - cardinality\n" - , " glCard :: Interval, - (o) global cardinality\n" - , " elements :: [IElement] - subclafers or constraints specified in the context of given clafer\n" - , " }\n" + , " <!--\n" + , "data IClafer\n" + , " = IClafer\n" + , " { _cinPos :: Span\n" + , " , _isAbstract :: Bool\n" + , " , _gcard :: Maybe IGCard\n" + , " , _ident :: CName\n" + , " , _uid :: UID\n" + , " , _parentUID :: UID\n" + , " , _super:: ISuper\n" + , " , _card :: Maybe Interval\n" + , " , _glCard :: Interval\n" + , " , _elements :: [IElement]\n" + , " }\n" , " -->\n" , " <xs:complexType name=\"IClafer\">\n" , " <xs:complexContent>\n" @@ -143,6 +149,7 @@ , " <xs:element name=\"GroupCard\" type=\"cl:IGroupCard\" minOccurs=\"0\" maxOccurs=\"1\"/>\n" , " <xs:element name=\"Id\" type=\"xs:string\"/>\n" , " <xs:element name=\"UniqueId\" type=\"xs:string\"/>\n" + , " <xs:element name=\"ParentUniqueId\" type=\"xs:string\"/>\n" , " <xs:element name=\"Supers\" type=\"cl:ISuper\"/>\n" , " <xs:element name=\"Card\" type=\"cl:IInterval\" minOccurs=\"0\" maxOccurs=\"1\"/>\n" , " <xs:element name=\"GlobalCard\" type=\"cl:IInterval\"/>\n" @@ -153,16 +160,20 @@ , " </xs:complexType>\n" , "\n" , " <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n" - , " <!-- data IElement =\n" - , " IEClafer IClafer\n" - , " | IEConstraint {\n" - , " isHard :: Bool,\n" - , " cpexp :: PExp\n" - , " }\n" - , " | IEGoal {\n" - , " isMaximize :: Bool,\n" - , " cpexp :: PExp\n" - , " }\n" + , " <!--\n" + , "data IElement\n" + , " = IEClafer\n" + , " { _iClafer :: IClafer\n" + , " }\n" + , " | IEConstraint\n" + , " { _isHard :: Bool\n" + , " , _cpexp :: PExp\n" + , " }\n" + , " -- | Goal (optimization objective)\n" + , " | IEGoal\n" + , " { _isMaximize :: Bool\n" + , " , _cpexp :: PExp\n" + , " }\n" , " -->\n" , "\n" , " <xs:complexType name=\"IElement\" abstract=\"true\"/>\n" @@ -197,11 +208,12 @@ , " </xs:complexType>\n" , "\n" , " <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n" - , " <!-- data ISuper =\n" - , " ISuper {\n" - , " isOverlapping :: Bool,\n" - , " supers :: [PExp]\n" - , " }\n" + , " <!--\n" + , "data ISuper\n" + , " = ISuper\n" + , " { _isOverlapping :: Bool\n" + , " , _supers :: [PExp]\n" + , " }\n" , " -->\n" , " <xs:complexType name=\"ISuper\">\n" , " <xs:sequence>\n" @@ -211,11 +223,12 @@ , " </xs:complexType>\n" , "\n" , " <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n" - , " <!-- data IGCard =\n" - , " IGCard {\n" - , " isKeyword :: Bool,\n" - , " interval :: Interval\n" - , " }\n" + , " <!--\n" + , "data IGCard\n" + , " = IGCard\n" + , " { _isKeyword :: Bool\n" + , " , _interval :: Interval\n" + , " }\n" , " -->\n" , "\n" , " <xs:complexType name=\"IGroupCard\">\n" @@ -248,10 +261,13 @@ , " </xs:complexType>\n" , "\n" , " <!-- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->\n" - , " <!-- data PExp = PExp {\n" - , " iType :: Maybe IType,\n" - , " pid :: String,\n" - , " exp :: IExp\n" + , " <!--\n" + , "data PExp\n" + , " = PExp\n" + , " { _iType :: Maybe IType\n" + , " , _pid :: String\n" + , " , _inPos :: Span\n" + , " , _exp :: IExp\n" , " }\n" , " -->\n" , "\n" @@ -286,18 +302,31 @@ , "\n" , " <!-- ......................................................................-->\n" , " <!--\n" - , " data IExp =\n" - , " - quantified expression declarations\n" - , " IDeclPExp {quant :: IQuant, oDecls :: [IDecl], bpexp :: PExp}\n" - , " | IFunExp {op :: String, exps :: [PExp]}\n" - , " | IInt Integer - integer number\n" - , " | IDouble Double - real number\n" - , " | IStr String - string\n" - , " | IClaferId { - clafer name\n" - , " modName :: String, - module name\n" - , " sident :: String, - name\n" - , " isTop :: Bool - identifier refers to a top-level definition\n" - , " }\n" + , "data IExp\n" + , " = IDeclPExp\n" + , " { _quant :: IQuant\n" + , " , _oDecls :: [IDecl]\n" + , " , _bpexp :: PExp\n" + , " }\n" + , " | IFunExp\n" + , " { _op :: String\n" + , " , _exps :: [PExp]\n" + , " }\n" + , " | IInt\n" + , " { _iint :: Integer\n" + , " }\n" + , " | IDouble\n" + , " { _idouble :: Double\n" + , " }\n" + , " | IStr\n" + , " { _istr :: String\n" + , " }\n" + , " | IClaferId\n" + , " { _modName :: String\n" + , " , _sident :: CName\n" + , " , _isTop :: Bool\n" + , " , _binding :: ClaferBinding\n" + , " }\n" , " -->\n" , " <xs:complexType name=\"IExp\" abstract=\"true\"/>\n" , "\n" @@ -362,18 +391,20 @@ , " <xs:element name=\"ModuleName\" type=\"xs:string\" minOccurs=\"0\" maxOccurs=\"1\"/>\n" , " <xs:element name=\"Id\" type=\"xs:string\" />\n" , " <xs:element name=\"IsTop\" type=\"xs:boolean\"/>\n" + , " <xs:element name=\"Bind\" type=\"xs:string\" />\n" , " </xs:sequence>\n" , " </xs:extension>\n" , " </xs:complexContent>\n" , " </xs:complexType>\n" , "\n" , " <!-- ......................................................................-->\n" - , " <!-- data IDecl =\n" - , " IDecl {\n" - , " isDisj :: Bool, - is disjunct\n" - , " decls :: [String], - a list of local names\n" - , " body :: PExp - set to which local names refer to\n" - , " }\n" + , " <!--\n" + , "data IDecl\n" + , " = IDecl\n" + , " { _isDisj :: Bool -- ^ is disjunct\n" + , " , _decls :: [CName] -- ^ a list of local names\n" + , " , _body :: PExp -- ^ set to which local names refer to\n" + , " }\n" , " -->\n" , "\n" , " <xs:complexType name=\"IDeclaration\">\n" @@ -385,12 +416,13 @@ , " </xs:complexType>\n" , "\n" , " <!-- ......................................................................-->\n" - , " <!-- data IQuant =\n" - , " INo\n" - , " | ILone\n" - , " | IOne\n" - , " | ISome\n" - , " | IAll\n" + , " <!--\n" + , "data IQuant\n" + , " = INo\n" + , " | ILone\n" + , " | IOne\n" + , " | ISome\n" + , " | IAll\n" , " -->\n" , "\n" , " <xs:complexType name=\"IQuantifier\" abstract=\"true\"/>\n"
src/Language/Clafer/Generator/Stats.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE FlexibleContexts #-} {- - Copyright (C) 2012 Kacper Bak <http://gsd.uwaterloo.ca> + Copyright (C) 2012 Kacper Bak, Michal Antkiewicz <http://gsd.uwaterloo.ca> 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 @@ -23,6 +23,8 @@ module Language.Clafer.Generator.Stats where import Control.Monad.State +import Data.Maybe (isJust) + import Language.Clafer.Intermediate.Intclafer data Stats = Stats { @@ -42,11 +44,11 @@ statsClafer :: MonadState Stats m => IClafer -> m () statsClafer claf = do if _isAbstract claf - then modify (\e -> e {naClafers = naClafers e + 1}) - else - if _isOverlapping $ _super claf - then modify (\e -> e {nrClafers = nrClafers e + 1}) - else modify (\e -> e {ncClafers = ncClafers e + 1}) + then modify (\e -> e {naClafers = naClafers e + 1}) + else modify (\e -> e {ncClafers = ncClafers e + 1}) + + when (isJust $ _reference claf) $ + modify (\e -> e {nrClafers = nrClafers e + 1}) sglCard' <- gets sglCard modify (\e -> e {sglCard = statsCard sglCard' $ _glCard claf}) mapM_ statsElement $ _elements claf @@ -61,4 +63,4 @@ statsElement x = case x of IEClafer clafer -> statsClafer clafer IEConstraint _ _ -> modify (\e -> e {nConstraints = nConstraints e + 1}) - IEGoal _ _ -> modify (\e -> e {nGoals = nGoals e + 1})+ IEGoal _ _ -> modify (\e -> e {nGoals = nGoals e + 1})
src/Language/Clafer/Generator/Xml.hs view
@@ -24,6 +24,8 @@ -- import Text.XML.HaXml.XmlContent.Haskell hiding (Result) +import Data.Maybe (fromMaybe) + import Language.Clafer.Common import Language.Clafer.Front.Absclafer import Language.Clafer.Intermediate.Intclafer @@ -71,13 +73,15 @@ genXmlClafer :: IClafer -> Result genXmlClafer x = case x of - IClafer pos abstract gcrd id' uid' super' crd glcard es -> + IClafer pos abstract gcrd id' uid' puid' super' reference' crd glcard es -> concat [ tag "Position" $ genXmlPosition pos , genXmlAbstract abstract , optTag gcrd genXmlGCard , genXmlId id' , genXmlUid uid' + , genXmlParentUid puid' , genXmlSuper super' + , genXmlReference reference' , optTag crd genXmlCard , genXmlGlCard glcard , concatMap genXmlElement es] @@ -101,12 +105,21 @@ genXmlUid :: String -> String genXmlUid uid' = tag "UniqueId" uid' -genXmlSuper :: ISuper -> String +genXmlParentUid :: String -> String +genXmlParentUid uid' = tag "ParentUniqueId" uid' + +genXmlSuper :: Maybe PExp -> String genXmlSuper x = case x of - ISuper isOverlapping' pexps -> tag "Supers" $ concat - [ genXmlBoolean "IsOverlapping" isOverlapping' - , concatMap (genXmlPExp "Super") pexps] + Nothing -> "" + Just pexp' -> genXmlPExp "Super" pexp' +genXmlReference :: Maybe IReference -> String +genXmlReference x = case x of + Nothing -> "" + Just (IReference isSet' pexp') -> tag "Reference" $ concat + [ genXmlBoolean "IsSet" isSet' + , genXmlPExp "Ref" pexp'] + genXmlCard :: (Integer, Integer) -> String genXmlCard interval' = tag "Card" $ genXmlInterval interval' @@ -119,12 +132,12 @@ IEConstraint isHard' pexp -> tagType "Declaration" "IConstraint" $ concat [ genXmlBoolean "IsHard" isHard' , genXmlPExp "ParentExp" pexp] - IEGoal isMaximize' pexp -> tagType "Declaration" "IGoal" $ concat + IEGoal isMaximize' pexp -> tagType "Declaration" "IGoal" $ concat [ genXmlBoolean "IsMaximize" isMaximize' , genXmlPExp "ParentExp" pexp] - -genXmlAnyOp :: (a -> String) -> (a -> String) -> [(String, a)] -> String + +genXmlAnyOp :: (a -> String) -> (a -> String) -> [(String, a)] -> String genXmlAnyOp ft f xs = concatMap (\(tname, texp) -> tagType tname (ft texp) $ f texp) xs @@ -147,7 +160,7 @@ IInt _ -> "IIntExp" IDouble _ -> "IDoubleExp" IStr _ -> "IStringExp" - IClaferId _ _ _ -> "IClaferId" + IClaferId _ _ _ _ -> "IClaferId" genXmlIExp :: IExp -> String genXmlIExp x = case x of @@ -167,11 +180,12 @@ escape y = [y] IInt n -> genXmlInteger n IDouble n -> tag "DoubleLiteral" $ show n - IStr str -> genXmlString str - IClaferId modName' sident' isTop' -> concat + IStr str -> genXmlString str + IClaferId modName' sident' isTop' bind' -> concat [ tag "ModuleName" modName' , tag "Id" sident' - , genXmlBoolean "IsTop" isTop'] + , genXmlBoolean "IsTop" isTop' + , tag "Bind" $ fromMaybe "" bind' ] genXmlDecl :: IDecl -> String genXmlDecl (IDecl disj locids pexp) = tag "Declaration" $ concat
src/Language/Clafer/Intermediate/Analysis.hs view
@@ -31,6 +31,8 @@ import qualified Language.Clafer.Intermediate.Intclafer as I import Language.Clafer.Intermediate.Desugarer import Language.Clafer.Front.Printclafer +import Language.Clafer.Common + import Control.Applicative import Control.Monad.LPMonad.Supply import Control.Monad.Error @@ -48,27 +50,27 @@ newtype AnalysisT m a = AnalysisT (ReaderT Info m a) deriving (Monad, Functor, MonadReader Info, MonadState s, MonadTrans, MonadPlus, MonadError e, Applicative, Alternative) - + type Analysis = AnalysisT Identity class (Monad m, Functor m) => MonadAnalysis m where clafers :: m [SClafer] withClafers :: [SClafer] -> m a -> m a - + withExtraClafers :: MonadAnalysis m => [SClafer] -> m a -> m a withExtraClafers cs a = do c <- clafers withClafers (cs ++ c) a - + instance (Monad m, Functor m) => MonadAnalysis (AnalysisT m) where clafers = AnalysisT $ asks sclafers withClafers cs = local (const $ Info cs) - + instance (Error e, MonadAnalysis m) => MonadAnalysis (ErrorT e m) where clafers = lift clafers withClafers = mapErrorT . withClafers - + instance MonadAnalysis m => MonadAnalysis (ListT m) where clafers = lift clafers withClafers = mapListT . withClafers @@ -84,27 +86,26 @@ instance (Monoid w, MonadAnalysis m) => MonadAnalysis (WriterT w m) where clafers = lift clafers withClafers = mapWriterT . withClafers - + instance MonadAnalysis m => MonadAnalysis (VSupplyT m) where clafers = lift clafers withClafers = mapVSupplyT . withClafers - + isConcrete :: SClafer -> Bool isConcrete = not . isAbstract isBase :: SClafer -> Bool -isBase = (`elem` ["clafer", "string", "real", "int", "integer", "boolean"]) . uid +isBase = (`elem` (baseClafer : primitiveTypes)) . uid isDerived :: SClafer -> Bool isDerived = not . isBase - -data SSuper = Ref String | Colon String deriving Show + -- | Easier to work with. IClafers have links from parents to children. SClafers have links from children to parent. -data SClafer = SClafer {uid::String, origUid::String, isAbstract::Bool, low::Integer, high::Integer, groupLow::Integer, groupHigh::Integer, parent::Maybe String, super::Maybe SSuper, constraints::[I.PExp]} deriving Show - -data Info = Info{sclafers :: [SClafer]} deriving Show +data SClafer = SClafer {uid::String, origUid::String, isAbstract::Bool, low::Integer, high::Integer, groupLow::Integer, groupHigh::Integer, parent::Maybe String, super::Maybe String, reference::Maybe String, constraints::[I.PExp]} deriving Show +data Info = Info{sclafers :: [SClafer]} deriving Show + runAnalysis :: Analysis a -> Info -> a runAnalysis r info = runIdentity $ runAnalysisT r info @@ -118,13 +119,13 @@ case find ((==) u . uid) c of Just c' -> return c' Nothing -> error $ "claferWithUid: Unknown uid " ++ u - + parentUid :: Monad m => SClafer -> m String parentUid clafer = case parent clafer of Just p -> return p Nothing -> fail $ "No parent uid for " ++ show clafer - + parentOf :: (Uidable c, MonadAnalysis m) => c -> m c parentOf clafer = fromUid =<< parentUid =<< toClafer clafer @@ -156,14 +157,14 @@ topNonRootAncestor clafer = do uid' <- toUid clafer - when (uid' == rootUid) $ error "Root does not have a non root ancestor." + when (uid' == rootIdent) $ error "Root does not have a non root ancestor." (head . tail . reverse) <$> ancestorsOf clafer refUid :: Monad m => SClafer -> m String refUid clafer = - case super clafer of - Just (Ref u) -> return u - _ -> fail $ "No ref uid for " ++ show clafer + case reference clafer of + Just u -> return u + _ -> fail $ "No ref uid for " ++ show clafer refOf :: (Uidable c, MonadAnalysis m) => c -> m c refOf clafer = fromUid =<< refUid =<< toClafer clafer @@ -181,8 +182,8 @@ do clafer <- toClafer c case super clafer of - Just (Colon u) -> return u - _ -> fail $ "No colon uid for " ++ show clafer + Just u -> return u + _ -> fail $ "No colon uid for " ++ show clafer colonOf :: (Uidable c, MonadAnalysis m) => c -> m c colonOf clafer = fromUid =<< colonUid =<< toClafer clafer @@ -202,8 +203,8 @@ (sub, _) <- foreach $ anything |: clafer fromClafer =<< (return sub `mplus` foreach ( colonsTo sub)) - + hierarchy :: (Uidable c, MonadAnalysis m) => c -> m [c] hierarchy t = (t :) <$> colonsOf t @@ -215,7 +216,7 @@ -} isDirectChild :: (Uidable c, MonadAnalysis m) => c -> c -> m Bool isDirectChild c p = (not . null) <$> (c |^ p) - + {- - C is an direct child of B. - @@ -235,19 +236,19 @@ isChild :: (Uidable c, MonadAnalysis m) => c -> c -> m Bool isChild child parent = liftM2 (||) (isDirectChild child parent) (isIndirectChild child parent) - + class Matchable c => Uidable c where toClafer :: MonadAnalysis m => c -> m SClafer fromClafer :: MonadAnalysis m => SClafer -> m c toUid :: MonadAnalysis m => c -> m String fromUid :: MonadAnalysis m => String -> m c - + instance Uidable SClafer where toClafer = return fromClafer = return toUid = return . uid fromUid = claferWithUid - + instance Uidable String where toClafer = claferWithUid fromClafer = return . uid @@ -258,13 +259,13 @@ class Matchable u where matches :: u -> SClafer -> Bool - + instance Matchable String where matches s c = s == uid c - + instance Matchable Anything where matches _ _ = True - + instance Matchable SClafer where matches c1 c2 = uid c1 == uid c2 @@ -279,16 +280,16 @@ guard $ matches lower clafer parent <- parentOf clafer guard $ matches upper parent - return (clafer , parent) + return (clafer , parent) --- a -> b +-- a -> b (|->) :: (MonadAnalysis m, Matchable a, Matchable b) => a -> b -> m [(SClafer, SClafer)] lower |-> upper = runListT $ do clafer <- foreach clafers guard $ matches lower clafer super <- refOf clafer guard $ matches upper super - return (clafer, super) + return (clafer, super) -- a : b (|:) :: (MonadAnalysis m, Matchable a, Matchable b) => a -> b -> m [(SClafer, SClafer)] @@ -297,7 +298,7 @@ guard $ matches lower clafer super <- colonOf clafer guard $ matches upper super - return (clafer, super) + return (clafer, super) -- constraints under constraintsUnder :: (MonadAnalysis m, Matchable a) => a -> m [(SClafer, I.PExp)] @@ -306,30 +307,25 @@ clafers' <- filter (matches under) <$> clafers return [(clafer, constraint) | clafer <- clafers', constraint <- constraints clafer] - -rootUid :: String -rootUid = "_root" - - -- Converts IClafer to SClafer convertClafer :: I.IClafer -> [SClafer] -convertClafer = +convertClafer = convertClafer' Nothing where convertElement' parent (I.IEClafer clafer) = Just $ Left $ convertClafer' parent clafer convertElement' _ (I.IEConstraint _ pexp) = Just $ Right $ pexp convertElement' _ _ = Nothing - + convertClafer' parent clafer = sclafer : concat children where sclafer | maybe 1 groupLow parent == 0 && maybe 1 groupHigh parent /= -1 = - SClafer (I._uid clafer) (I._uid clafer) (I._isAbstract clafer) 1 high gLow gHigh (uid <$> parent) super constraints + SClafer (I._uid clafer) (I._uid clafer) (I._isAbstract clafer) 1 high gLow gHigh (uid <$> parent) super reference constraints | otherwise = - SClafer (I._uid clafer) (I._uid clafer) (I._isAbstract clafer) low high gLow gHigh (uid <$> parent) super constraints + SClafer (I._uid clafer) (I._uid clafer) (I._isAbstract clafer) low high gLow gHigh (uid <$> parent) super reference constraints (children, constraints) = partitionEithers $ mapMaybe (convertElement' $ Just $ sclafer) (I._elements clafer) - + Just (low, high) = I._card clafer (gLow, gHigh) = case I._gcard clafer of @@ -339,30 +335,30 @@ Just (I.IGCard _ i) -> i super = case I._super clafer of - I.ISuper True [I.PExp{I._exp = I.IClaferId{I._sident = superUid}}] -> Just $ Ref superUid - I.ISuper False [I.PExp{I._exp = I.IClaferId{I._sident = superUid}}] -> - if superUid `elem` ["string", "real", "int", "integer", "boolean"] - then Just $ Ref superUid - else Just $ Colon superUid + Just (I.PExp{I._exp = I.IClaferId{I._sident = superUid}}) -> Just superUid _ -> Nothing + reference = + case I._reference clafer of + Just (I.IReference _ I.PExp{I._exp = I.IClaferId{I._sident = refUid'}}) -> Just refUid' + _ -> Nothing gatherInfo :: I.IModule -> Info gatherInfo imodule = Info $ sClafer : sInteger : sInt : sReal : sString : sBoolean : convertClafer root where - sClafer = SClafer "clafer" "clafer" False 0 (-1) 0 (-1) Nothing Nothing [] - sInteger = SClafer "integer" "integer" False 0 (-1) 0 (-1) Nothing Nothing [] - sInt = SClafer "int" "int" False 0 (-1) 0 (-1) Nothing Nothing [] - sReal = SClafer "real" "real" False 0 (-1) 0 (-1) Nothing Nothing [] - sString = SClafer "string" "string" False 0 (-1) 0 (-1) Nothing Nothing [] - sBoolean = SClafer "boolean" "boolean" False 0 (-1) 0 (-1) Nothing Nothing [] - - root = I.IClafer noSpan False Nothing rootUid rootUid (I.ISuper False [I.PExp Nothing "" noSpan $ I.IClaferId "clafer" "clafer" True]) (Just (1, 1)) (0, 0) $ I._mDecls imodule + sClafer = SClafer baseClafer baseClafer False 0 (-1) 0 (-1) Nothing Nothing Nothing [] + sInteger = SClafer integerType integerType False 0 (-1) 0 (-1) Nothing Nothing Nothing [] + sInt = SClafer "int" "int" False 0 (-1) 0 (-1) Nothing Nothing Nothing [] + sReal = SClafer realType realType False 0 (-1) 0 (-1) Nothing Nothing Nothing [] + sString = SClafer stringType stringType False 0 (-1) 0 (-1) Nothing Nothing Nothing [] + sBoolean = SClafer booleanType booleanType False 0 (-1) 0 (-1) Nothing Nothing Nothing [] + root = I.IClafer noSpan False Nothing rootIdent rootIdent "" Nothing Nothing (Just (1, 1)) (0, 0) $ I._mDecls imodule + {- - - Utility functions @@ -373,7 +369,7 @@ liftList :: Monad m => [a] -> ListT m a liftList = ListT . return - + runListT_ :: Monad m => ListT m a -> m () runListT_ l = runListT l >> return ()
src/Language/Clafer/Intermediate/Desugarer.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE RankNTypes #-} {- - Copyright (C) 2012 Kacper Bak, Jimmy Liang <http://gsd.uwaterloo.ca> + Copyright (C) 2012-2014 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Paulius Juodisius <http://gsd.uwaterloo.ca> 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 @@ -20,39 +20,51 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -} -{- | Transforms an Abstract Syntax Tree (AST) from "Language.Clafer.Front.Absclafer" +{- | Transforms an Abstract Syntax Tree (AST) from "Language.Clafer.Front.Absclafer" into Intermediate representation (IR) from "Language.Clafer.Intermediate.Intclafer" of a Clafer model. -} module Language.Clafer.Intermediate.Desugarer where import Language.Clafer.Common +import Data.Maybe (fromMaybe) import Language.Clafer.Front.Absclafer import Language.Clafer.Intermediate.Intclafer -- | Transform the AST into the intermediate representation (IR) -desugarModule :: Module -> IModule -desugarModule (Module _ declarations) = IModule "" $ - declarations >>= desugarEnums >>= desugarDeclaration --- [ImoduleFragment $ declarations >>= desugarEnums >>= desugarDeclaration] +desugarModule :: Maybe String -> Module -> IModule +desugarModule mURL (Module _ declarations) = IModule + (fromMaybe "" mURL) + (declarations >>= desugarEnums >>= desugarDeclaration) sugarModule :: IModule -> Module sugarModule x = Module noSpan $ map sugarDeclaration $ _mDecls x -- (fragments x >>= mDecls) -- | desugars enumeration to abstract and global singleton features desugarEnums :: Declaration -> [Declaration] -desugarEnums (EnumDecl s id' enumids) = (absEnum s) : map (mkEnum s) enumids +desugarEnums (EnumDecl (Span p1 p2) id' enumids) = absEnum : map mkEnum enumids where - oneToOne = (CardInterval noSpan $ NCard noSpan (PosInteger ((0,0), "1")) (ExIntegerNum noSpan $ PosInteger ((0,0), "1"))) - absEnum s1 = ElementDecl s1 $ Subclafer s1 $ Clafer s1 (Abstract s1) (GCardEmpty s1) id' (SuperEmpty s1) (CardEmpty s1) (InitEmpty s1) (ElementsList s1 []) - mkEnum s2 (EnumIdIdent _ eId) = ElementDecl s2 $ - Subclafer s2 $ - Clafer s2 (AbstractEmpty s2) (GCardEmpty s2) eId ((SuperSome s2) (SuperColon s2) (ClaferId s2 $ Path s2 [ModIdIdent s2 id'])) oneToOne (InitEmpty s2) (ElementsList s2 []) + p2' = case enumids of + -- the abstract enum clafer should end before the first literal begins + ((EnumIdIdent (Span (Pos y' x') _) _):_) -> Pos y' (x'-3) -- cutting the ' = ' + [] -> p2 -- should never happen - cannot have enum without any literals. Return the original end pos. + oneToOne pos' = (CardInterval noSpan $ + NCard noSpan (PosInteger (pos', "1")) (ExIntegerNum noSpan $ PosInteger (pos', "1"))) + absEnum = let + s1 = Span p1 p2' + in + ElementDecl s1 $ + Subclafer s1 $ + Clafer s1 (Abstract s1) (GCardEmpty s1) id' (SuperEmpty s1) (ReferenceEmpty s1) (CardEmpty s1) (InitEmpty s1) (ElementsList s1 []) + mkEnum (EnumIdIdent s2 eId) = -- each concrete clafer must fit within the original span of the literal + ElementDecl s2 $ + Subclafer s2 $ + Clafer s2 (AbstractEmpty s2) (GCardEmpty s2) eId ((SuperSome s2) (ClaferId s2 $ Path s2 [ModIdIdent s2 id'])) (ReferenceEmpty s2) (oneToOne (0, 0)) (InitEmpty s2) (ElementsList s2 []) desugarEnums x = [x] desugarDeclaration :: Declaration -> [IElement] desugarDeclaration (ElementDecl _ element) = desugarElement element -desugarDeclaration _ = error "desugared" +desugarDeclaration _ = error "Desugarer.desugarDeclaration: enum declarations should have already been converted to clafers. BUG." sugarDeclaration :: IElement -> Declaration @@ -65,36 +77,50 @@ desugarClafer :: Clafer -> [IElement] -desugarClafer (Clafer s abstract gcrd id' super' crd init' es) = - (IEClafer $ IClafer s (desugarAbstract abstract) (desugarGCard gcrd) (transIdent id') - "" (desugarSuper super') (desugarCard crd) (0, -1) - (desugarElements es)) : (desugarInit id' init') +desugarClafer claf@(Clafer s abstract gcrd' id' super' reference' crd' init' elements') = + case (super', reference') of + (SuperSome ss setExp, ReferenceEmpty _) -> if isPrimitive $ getPExpClaferIdent setExp + then desugarClafer (Clafer s abstract gcrd' id' (SuperEmpty s) (ReferenceSet ss setExp) crd' init' elements') + else desugarClafer' claf + (SuperSome _ setExp, ReferenceSet _ _) -> if isPrimitive $ getPExpClaferIdent setExp + then error "Desugarer: cannot rewrite : with primitive type into -> because a reference is also present. Using : with primitive types is discouraged." + else desugarClafer' claf + (SuperSome _ setExp, ReferenceBag _ _) -> if isPrimitive $ getPExpClaferIdent setExp + then error "Desugarer: cannot rewrite : with primitive type into -> because a reference is also present. Using : with primitive types is discouraged." + else desugarClafer' claf + _ -> desugarClafer' claf + where + desugarClafer' claf@(Clafer s abstract gcrd' id' super' reference' crd' init' elements') = + (IEClafer $ IClafer s (desugarAbstract abstract) (desugarGCard gcrd') (transIdent id') + "" "" (desugarSuper super') (desugarReference reference') (desugarCard crd') (0, -1) + (desugarElements elements')) : (desugarInit id' init') +getPExpClaferIdent :: SetExp -> String +getPExpClaferIdent (ClaferId _ (Path _ [ (ModIdIdent _ (PosIdent (_, ident'))) ] )) = ident' +getPExpClaferIdent _ = error "Desugarer:getPExpClaferIdent not given a ClaferId PExp" sugarClafer :: IClafer -> Clafer -sugarClafer (IClafer s abstract gcard' _ uid' super' crd _ es) = +sugarClafer (IClafer s abstract gcard' _ uid' _ super' reference' crd' _ elements') = Clafer s (sugarAbstract abstract) (sugarGCard gcard') (mkIdent uid') - (sugarSuper super') (sugarCard crd) (InitEmpty s) (sugarElements es) - - -desugarSuper :: Super -> ISuper -desugarSuper (SuperEmpty s) = - ISuper False [PExp (Just $ TClafer []) "" s $ mkLClaferId baseClafer True] -desugarSuper (SuperSome _ superhow setexp) = - ISuper (desugarSuperHow superhow) [desugarSetExp setexp] + (sugarSuper super') (sugarReference reference') (sugarCard crd') (InitEmpty s) (sugarElements elements') -desugarSuperHow :: SuperHow -> Bool -desugarSuperHow (SuperColon _) = False -desugarSuperHow _ = True +desugarSuper :: Super -> Maybe PExp +desugarSuper (SuperEmpty _) = Nothing +desugarSuper (SuperSome _ (ClaferId _ (Path _ [ (ModIdIdent _ (PosIdent (_, "clafer"))) ] ))) = Nothing +desugarSuper (SuperSome _ setexp) = Just $ desugarSetExp setexp +desugarReference :: Reference -> Maybe IReference +desugarReference (ReferenceEmpty _) = Nothing +desugarReference (ReferenceSet _ setexp) = Just $ IReference True $ desugarSetExp setexp +desugarReference (ReferenceBag _ setexp) = Just $ IReference False $ desugarSetExp setexp desugarInit :: PosIdent -> Init -> [IElement] desugarInit _ (InitEmpty _) = [] desugarInit id' (InitSome s inithow exp') = [ IEConstraint (desugarInitHow inithow) (pExpDefPid s implIExp) ] - where + where cId :: PExp - cId = mkPLClaferId (snd $ getIdent id') False + cId = mkPLClaferId (snd $ getIdent id') False Nothing -- <id> = <exp'> assignIExp :: IExp assignIExp = (IFunExp "=" [cId, desugarExp exp']) @@ -104,14 +130,14 @@ getIdent (PosIdent y) = y desugarInitHow :: InitHow -> Bool -desugarInitHow (InitHow_1 _) = True -desugarInitHow (InitHow_2 _ )= False +desugarInitHow (InitConstant _) = True +desugarInitHow (InitDefault _ )= False desugarName :: Name -> IExp desugarName (Path _ path) = IClaferId (concatMap ((++ modSep).desugarModId) (init path)) - (desugarModId $ last path) True + (desugarModId $ last path) True Nothing desugarModId :: ModId -> Result desugarModId (ModIdIdent _ id') = transIdent id' @@ -119,19 +145,21 @@ sugarModId :: String -> ModId sugarModId modid = ModIdIdent noSpan $ mkIdent modid -sugarSuper :: ISuper -> Super -sugarSuper (ISuper _ []) = SuperEmpty noSpan -sugarSuper (ISuper isOverlapping' [pexp]) = SuperSome noSpan (sugarSuperHow isOverlapping') (sugarSetExp pexp) -sugarSuper _ = error "Function sugarSuper from Desugarer expects an ISuper with a list of length one, but it was given one with a list larger than one" -- Should never happen +sugarSuper :: Maybe PExp -> Super +sugarSuper Nothing = SuperEmpty noSpan +sugarSuper (Just pexp'@(PExp _ _ _ (IClaferId _ _ _ _))) = SuperSome noSpan (sugarSetExp pexp') +sugarSuper (Just pexp') = error $ "Function sugarSuper from Desugarer expects a PExp (IClaferId) but instead was given: " ++ show pexp' -- Should never happen -sugarSuperHow :: Bool -> SuperHow -sugarSuperHow False = SuperColon noSpan -sugarSuperHow True = SuperMArrow noSpan +sugarReference :: Maybe IReference -> Reference +sugarReference Nothing = ReferenceEmpty noSpan +sugarReference (Just (IReference True (pexp'@(PExp _ _ _ (IClaferId _ _ _ _))))) = ReferenceSet noSpan (sugarSetExp pexp') +sugarReference (Just (IReference False (pexp'@(PExp _ _ _ (IClaferId _ _ _ _))))) = ReferenceBag noSpan (sugarSetExp pexp') +sugarReference (Just (IReference _ pexp')) = error $ "Function sugarReference from Desugarer expects a IReference (PExp (IClaferId)) but instead was given: " ++ show pexp' -- Should never happen sugarInitHow :: Bool -> InitHow -sugarInitHow True = InitHow_1 noSpan -sugarInitHow False = InitHow_2 noSpan +sugarInitHow True = InitConstant noSpan +sugarInitHow False = InitDefault noSpan desugarConstraint :: Constraint -> PExp @@ -176,18 +204,17 @@ desugarElement :: Element -> [IElement] desugarElement x = case x of - Subclafer _ claf -> - (desugarClafer claf) ++ - (mkArrowConstraint claf >>= desugarElement) + Subclafer _ claf -> (desugarClafer claf) ClaferUse s name crd es -> desugarClafer $ Clafer s (AbstractEmpty s) (GCardEmpty s) (mkIdent $ _sident $ desugarName name) - ((SuperSome s) (SuperColon s) (ClaferId s name)) crd (InitEmpty s) es + (SuperSome s (ClaferId s name)) (ReferenceEmpty s) crd (InitEmpty s) es Subconstraint _ constraint -> [IEConstraint True $ desugarConstraint constraint] Subsoftconstraint _ softconstraint -> [IEConstraint False $ desugarSoftConstraint softconstraint] Subgoal _ goal -> [IEGoal True $ desugarGoal goal] + sugarElement :: IElement -> Element sugarElement x = case x of IEClafer claf -> Subclafer noSpan $ sugarClafer claf @@ -195,26 +222,6 @@ IEConstraint False softconstraint -> Subsoftconstraint noSpan $ sugarSoftConstraint softconstraint IEGoal _ goal -> Subgoal noSpan $ sugarGoal goal -mkArrowConstraint :: Clafer -> [Element] -mkArrowConstraint (Clafer s _ _ ident' super' _ _ _) = - if isSuperSomeArrow super' then [Subconstraint s $ - Constraint s [DeclAllDisj s - (Decl s [LocIdIdent s $ mkIdent "x", LocIdIdent s $ mkIdent "y"] - (ClaferId s $ Path s [ModIdIdent s ident'])) - (ENeq s (ESetExp s $ Join s (ClaferId s $ Path s [ModIdIdent s $ mkIdent "x"]) - (ClaferId s $ Path s [ModIdIdent s $ mkIdent "ref"])) - (ESetExp s $ Join s (ClaferId s $ Path s [ModIdIdent s $ mkIdent "y"]) - (ClaferId s $ Path s [ModIdIdent s $ mkIdent "ref"])))]] - else [] - -isSuperSomeArrow :: Super -> Bool -isSuperSomeArrow (SuperSome _ arrow _) = isSuperArrow arrow -isSuperSomeArrow _ = False - -isSuperArrow :: SuperHow -> Bool -isSuperArrow (SuperArrow _) = True -isSuperArrow _ = False - desugarGCard :: GCard -> Maybe IGCard desugarGCard x = case x of GCardEmpty _ -> Nothing @@ -298,9 +305,9 @@ EDiv _ exp0 exp' -> dop iDiv [exp0, exp'] ECSetExp _ exp' -> dop iCSet [exp'] ESumSetExp _ exp' -> dop iSumSet [exp'] - EMinExp _ exp' -> dop iMin [exp'] + EMinExp _ exp' -> dop iMin [exp'] EGMax _ exp' -> dop iGMax [exp'] - EGMin _ exp' -> dop iGMin [exp'] + EGMin _ exp' -> dop iGMin [exp'] EInt _ n -> IInt $ mkInteger n EDouble _ (PosDouble n) -> IDouble $ read $ snd n EStr _ (PosString str) -> IStr $ snd str @@ -310,7 +317,7 @@ dpe = desugarPath.desugarExp desugarOp :: (a -> PExp) -> String -> [a] -> IExp -desugarOp f op' exps' = +desugarOp f op' exps' = if (op' == iIfThenElse) then IFunExp op' $ (desugarPath $ head mappedList) : (map reducePExp $ tail mappedList) else IFunExp op' $ map (trans.f) exps' @@ -340,7 +347,7 @@ sugarExp :: PExp -> Exp -sugarExp x = sugarExp' $ Language.Clafer.Intermediate.Intclafer._exp x +sugarExp x = sugarExp' $ _exp x sugarExp' :: IExp -> Exp @@ -364,7 +371,7 @@ IInt n -> EInt noSpan $ PosInteger ((0, 0), show n) IDouble n -> EDouble noSpan $ PosDouble ((0, 0), show n) IStr str -> EStr noSpan $ PosString ((0, 0), str) - IClaferId _ _ _ -> ESetExp noSpan $ sugarSetExp' x + IClaferId _ _ _ _ -> ESetExp noSpan $ sugarSetExp' x _ -> error "Function sugarExp' from Desugarer was given an invalid argument" -- This should never happen where sugarUnOp op'' @@ -408,32 +415,32 @@ where exps'' = map sugarSetExp exps' sugarOp op'' - | op'' == iUnion = Union noSpan - | op'' == iDifference = Difference noSpan - | op'' == iIntersection = Intersection noSpan - | op'' == iDomain = Domain noSpan - | op'' == iRange = Range noSpan - | op'' == iJoin = Join noSpan + | op'' == iUnion = Union noSpan + | op'' == iDifference = Difference noSpan + | op'' == iIntersection = Intersection noSpan + | op'' == iDomain = Domain noSpan + | op'' == iRange = Range noSpan + | op'' == iJoin = Join noSpan | otherwise = error "Invalid argument given to function sygarSetExp' in Desugarer" -sugarSetExp' (IClaferId "" id' _) = ClaferId noSpan $ Path noSpan [ModIdIdent noSpan $ mkIdent id'] -sugarSetExp' (IClaferId modName' id' _) = ClaferId noSpan $ Path noSpan $ (sugarModId modName') : [sugarModId id'] +sugarSetExp' (IClaferId "" id' _ _) = ClaferId noSpan $ Path noSpan [ModIdIdent noSpan $ mkIdent id'] +sugarSetExp' (IClaferId modName' id' _ _) = ClaferId noSpan $ Path noSpan $ (sugarModId modName') : [sugarModId id'] sugarSetExp' _ = error "IDecelPexp, IInt, IDobule, and IStr can not be sugared into a setExp!" --This should never happen desugarPath :: PExp -> PExp desugarPath (PExp iType' pid' pos' x) = reducePExp $ PExp iType' pid' pos' result where result - | isSet x = IDeclPExp ISome [] (pExpDefPid pos' x) - | isNegSome x = IDeclPExp INo [] $ _bpexp $ Language.Clafer.Intermediate.Intclafer._exp $ head $ _exps x + | isSetExp x = IDeclPExp ISome [] (pExpDefPid pos' x) + | isNegSome x = IDeclPExp INo [] $ _bpexp $ _exp $ head $ _exps x | otherwise = x isNegSome (IFunExp op' [PExp _ _ _ (IDeclPExp ISome [] _)]) = op' == iNot isNegSome _ = False -isSet :: IExp -> Bool -isSet (IClaferId _ _ _) = True -isSet (IFunExp op' _) = op' `elem` setBinOps -isSet _ = False +isSetExp :: IExp -> Bool +isSetExp (IClaferId _ _ _ _) = True +isSetExp (IFunExp op' _) = op' `elem` setBinOps +isSetExp _ = False -- reduce parent @@ -444,14 +451,14 @@ reduceIExp (IDeclPExp quant' decls' pexp) = IDeclPExp quant' decls' $ reducePExp pexp reduceIExp (IFunExp op' exps') = redNav $ IFunExp op' $ map redExps exps' where - (redNav, redExps) = if op' == iJoin then (reduceNav, id) else (id, reducePExp) + (redNav, redExps) = if op' == iJoin then (reduceNav, id) else (id, reducePExp) reduceIExp x = x reduceNav :: IExp -> IExp -reduceNav x@(IFunExp op' exps'@((PExp _ _ _ iexp@(IFunExp _ (pexp0:pexp:_))):pPexp:_)) = +reduceNav x@(IFunExp op' exps'@((PExp _ _ _ iexp@(IFunExp _ (pexp0:pexp:_))):pPexp:_)) = if op' == iJoin && isParent pPexp && isClaferName pexp - then reduceNav $ Language.Clafer.Intermediate.Intclafer._exp pexp0 - else x{_exps = (head exps'){Language.Clafer.Intermediate.Intclafer._exp = reduceIExp iexp} : + then reduceNav $ _exp pexp0 + else x{_exps = (head exps'){_exp = reduceIExp iexp} : tail exps'} reduceNav x = x
src/Language/Clafer/Intermediate/GLPKScopeAnalyzer.hs view
@@ -27,6 +27,7 @@ import qualified Language.Clafer.Intermediate.Intclafer as I import Language.Clafer.Intermediate.Analysis import Language.Clafer.Intermediate.ResolverType +import Language.Clafer.Common import Control.Applicative (Applicative(..), (<$>)) import Control.Monad @@ -60,8 +61,8 @@ where intScope = if bitwidth > 4 then return ("int", bitwidth) else fail "Bitwidth less than default." bitwidth = bitwidthAnalysis (constants ++ map snd scopes) - - scopes = + + scopes = removeZeroes $ removeRoot $ removeAux $ -- unsafePerformIO should be safe (?) -- We aren't modifying any global state. @@ -70,21 +71,21 @@ case unsafePerformIO solution of (Success, Just (_, s)) -> Map.toList $ Map.map round s _ -> [] -- No solution - + ((_, constants), analysis) = runScopeAnalysis run $ gatherInfo imodule - + run = do setConstraints abstracts' <- clafers `suchThat` isAbstract constants' <- constantsAnalysis return (abstracts', constants') - + solution = {-trace (show $ unsafePerformIO $ writeLP "TESTTT" analysis) $-} glpSolveVars mipDefaults{msgLev = MsgOff} $ analysis -- Any scope that is 0 will take the global scope of 1 instead. removeZeroes = filter ((/= 0) . snd) -- The root is implied and not and not part of the actual solution. - removeRoot = filter ((/= rootUid) . fst) + removeRoot = filter ((/= rootIdent) . fst) -- Auxilary variables are only part of the computation, not the solution. removeAux = filter (not . (uniqNameSpace `isPrefixOf`) . fst) -- The scope for abstract clafers are removed. Alloy doesn't need it. Makes @@ -100,18 +101,18 @@ within a (minB, maxB) = a >= minB && a <= maxB bitRange = [(-2^i, 2^i-1) | i <- ([0..]::[Integer])] - + -- Returns all constant literals constantsAnalysis :: ScopeAnalysis [Integer] constantsAnalysis = do cons <- constraintsUnder anything `select` snd return $ mapMaybe integerConstant [I._exp sub | con <- cons, sub <- subexpressions con] - where + where integerConstant (I.IInt i) = Just i integerConstant _ = Nothing - + -- (-1) for infinity data Between = Between Integer Integer @@ -129,7 +130,7 @@ minn (-1) b = b minn a (-1) = a minn a b = min a b - + maxx (-1) _ = -1 maxx _ (-1) = -1 maxx a b = max a b @@ -140,8 +141,8 @@ a' <- a b' <- b overlap a' b' --} - +-} + -- Multiplies two positive integers where -1=infinity mult :: Integer -> Integer -> Integer mult (-1) _ = -1 @@ -153,7 +154,7 @@ simpleAnalysis :: ScopeAnalysis [(String, Between)] simpleAnalysis = do - root <- claferWithUid rootUid + root <- claferWithUid rootIdent analysis <- simpleAnalysis' root (Between 1 1) --moreAnalysis <- simpleConstraintAnalysis analysis return analysis @@ -165,13 +166,13 @@ | groupLow cur == 0 && groupHigh cur == -1 = Between (low child * l) (high child `mult` h) | otherwise = Between 0 (-1) foreach (simpleAnalysis' child b) -{- +{- mergeAnalysis analysis = [(n, fromJust x) | (n, b) <- combine analysis, let x = foldr1 overlapM $ map Just b, isJust x] - + simpleConstraintAnalysis :: [(String, Between)] -> ScopeAnalysis [(String, Between)] simpleConstraintAnalysis analysis = mergeAnalysis <$> simpleConstraintAnalysis' analysis - + simpleConstraintAnalysis' analysis = runListT $ do (curThis, cons) <- foreach $ constraintsUnder anything @@ -194,9 +195,9 @@ let parentBetween = fromMaybe (error $ "Missing parent " ++ parent) $ lookup parent analysis guard $ atLeastOne parentBetween return (step, Between 1 $ -1) --} - +-} + setConstraints :: ScopeAnalysis () setConstraints = do @@ -209,7 +210,7 @@ parentConstraints constraintConstraints - (var rootUid) `equalTo` 1 + (var rootIdent) `equalTo` 1 optFormula :: ScopeAnalysis () @@ -228,7 +229,7 @@ let uchild = uid child let uparent = uid parent - + if low child == high child -- Saves us one constraint then do @@ -279,29 +280,29 @@ -flatten :: ScopeAnalysis [SClafer] +flatten :: ScopeAnalysis [SClafer] flatten = runListT $ do abs' <- clafers `suchThat` isAbstract (c, s) <- foreach $ anything |: anything ListT $ runReaderT (addChildren (map uid abs') (Part [uid c, uid s]) (Part [])) [] - -addChildren :: MonadAnalysis m => [String] -> Part -> Part -> m [SClafer] + +addChildren :: MonadAnalysis m => [String] -> Part -> Part -> m [SClafer] addChildren abs' (Part steps) ss@(Part supSteps) = do let parBase = last steps - + chis <- directChildrenOf parBase achis <- forM chis $ \chi -> do let chiP = Part $ init steps ++ [chi] let par = Part steps let supP = Part $ supSteps ++ [chi] - + chiC <- claferWithUid chi - let s = SClafer (reifyPartName chiP) chi False (low chiC) (high chiC) (groupLow chiC) (groupHigh chiC) (Just $ reifyPartName par) (Just $ Colon $ reifyPartName supP) (constraints chiC) + let s = SClafer (reifyPartName chiP) chi False (low chiC) (high chiC) (groupLow chiC) (groupHigh chiC) (Just $ reifyPartName par) (Just $ reifyPartName supP) Nothing (constraints chiC) return s <:> addChildren abs' chiP ss - + col <- runMaybeT $ colonOf parBase case col of Just col' -> do @@ -313,7 +314,7 @@ reifyPartName (Part (t : target)) = reifyPartName' $ t : filter notAbs target reifyPartName (Part []) = error "Function reifyPartName from GLPKScopeAnalyzer expects a non empty Part, but was given one!" -- This should never happen reifyPartName' [target] = target - reifyPartName' target = uniqNameSpace ++ "reify_" ++ intercalate "_" target + reifyPartName' target = uniqNameSpace ++ "reify_" ++ intercalate "_" target data Path = @@ -357,7 +358,7 @@ {-isConst :: Expr -> Bool isConst Const{} = True isConst _ = False-} - + parentOfPart :: MonadAnalysis m => Part -> m Part parentOfPart (Part s) = do @@ -373,7 +374,7 @@ - - [ A in List - B in List ] - - + - - to - - [ A, B in List ] @@ -388,12 +389,12 @@ inPExp a b = I.PExp (Just I.TBoolean) "" noSpan $ I.IFunExp "in" [a, b] unionPExpAll es = foldr1 unionPExp es unionPExp a b = I.PExp (liftM2 (+++) (I._iType a) (I._iType b)) "" noSpan $ I.IFunExp "++" [a, b] - + partitionConstraint I.PExp{I._exp = I.IFunExp {I._op = "in", I._exps = [exp1, exp2]}} = return $ Right (exp1, exp2) partitionConstraint I.PExp{I._exp = I.IFunExp {I._op = "&&", I._exps = [exp1, exp2]}} = partitionConstraint exp1 `mplus` partitionConstraint exp2 partitionConstraint e = return $ Left e - testing' f a b = f a == f b + testing' f a b = f a == f b comparing' f a b = f a `compare` f b @@ -417,16 +418,16 @@ return (under, rename decl bpexp) partitionConstraint I.PExp{I._exp = I.IFunExp {I._op = "&&", I._exps = [exp1, exp2]}} = partitionConstraint exp1 `mplus` partitionConstraint exp2 partitionConstraint e = return (curThis, e) - + rename :: String -> I.PExp -> I.PExp rename f p@I.PExp{I._exp = exp'} = p{I._exp = renameIExp exp'} where renameIExp (I.IFunExp op exps) = I.IFunExp op $ map (rename f) exps renameIExp (I.IDeclPExp quant oDecls bpexp) = I.IDeclPExp quant (map renameDecl oDecls) $ rename f bpexp - renameIExp (I.IClaferId modName sident isTop) - | f == sident = I.IClaferId modName "this" isTop - | otherwise = I.IClaferId modName sident isTop + renameIExp (I.IClaferId modName sident isTop bind) + | f == sident = I.IClaferId modName "this" isTop bind + | otherwise = I.IClaferId modName sident isTop bind renameIExp i = i renameDecl (I.IDecl isDisj decls body) | f `elem` decls = I.IDecl isDisj decls body -- Not a free variable @@ -450,7 +451,7 @@ runListT_ $ do clafer <- foreach clafers (supThis, cons) <- foreach $ optConstraintsUnder clafer - + con <- foreachM cons curThis <- if isAbstract supThis @@ -463,10 +464,10 @@ oneConstraint curThis constraint where --base (Part steps) = last steps - + oneConstraint c (e1, con, e2) = void $ runMaybeT $ oneConstraintOneWay c e1 con e2 `mplus` oneConstraintOneWay c e2 (reverseCon con) e1 - + oneConstraintOneWay c@SClafer{uid} e1 con e2 = oneConstraint' e1 e2 where @@ -515,7 +516,7 @@ let frac = (1 / fromInteger multiplier) * fromInteger constant :: Double (reifyVar part) `comp` return (frac *^ var pos) mult multiplier <$> prod part - + oneConstraint' (This (Path parts1) _) (This (Path parts2) _) = reifyVar (last parts1) `comp` reifyVar (last parts2) oneConstraint' (Global (Path parts1) _) (Global (Path parts2) _) = @@ -536,13 +537,13 @@ then reifyVar (last parts) `comp` reifyVars [last p | This (Path p) _ <- exprs] else mzero oneConstraint' _ _ = mzero - + constantCard SClafer{low, high} | low == high = return low | otherwise = mzero - + prod (Part steps) = foldr1 mult <$> mapM (return . high <=< claferWithUid) steps - + comp x y = do x' <- x @@ -568,7 +569,7 @@ reifyVars p = return (varSum $ map reifyVarName p) reifyVarName (Part [target]) = target reifyVarName (Part target) = uniqNameSpace ++ "reify_" ++ intercalate "_" target -{- +{- isAbstractPart (Part [_]) = False isAbstractPart _ = True @@ -580,7 +581,7 @@ if isNothing sss then return $ Part $ reverse $ b : rest else return $ Part $ reverse $ b : ss : rest - + -- TODO: correct? siblingParts (Part (conc : abst)) = @@ -593,20 +594,20 @@ (sub, _) <- foreach $ anything |: sup' return $ Part $ uid sub : abst siblingParts [] = error "Function siblingParts from GLpkScopeAnalyzer expects a non empty list, given an empty one!" -- This should never happen - + reifyPart (Part steps) = do as <- claferWithUid (last steps) >>= nonTopAncestors forM as $ \a -> return $ Part $ init steps ++ [uid a] - + nonTopAncestors child = do parent <- parentOf child - if uid parent == rootUid + if uid parent == rootIdent then return [] else (++ [child]) `fmap` nonTopAncestors parent - -} + -} data Con = EQU | LTH | LEQ | GTH | GEQ deriving (Eq, Ord, Show) @@ -643,7 +644,7 @@ | _op == "<=>" = (exp1 `implies` exp2) `mplus` (exp2 `implies` exp1) | _op == "=>" = exp1 `implies` exp2 scopeConstraint' _ = mzero - + implies exp1 exp2 = do e1 <- scopeConstraint' $ I._exp exp1 @@ -675,7 +676,7 @@ (Exact e1, AtLeast e2) -> return e1 `lessThanEqual` return e2 _ -> mzero equalConstraint2 exp1 exp2 = scopeConstraintNum exp1 `eqTo` scopeConstraintNum exp2 - + -- exp1 in exp2 inConstraint1 exp1 exp2 = do @@ -696,7 +697,7 @@ then return $ AtLeast $ lExpr l1' else return $ combineDisjoint l1' l2' scopeConstraintSet x = Exact <$> parsePath curThis x - + combineDisjoint (Exact e1) (Exact e2) = Exact (Concat ([e1, e2] >>= flattenConcat) $ eType e1 +++ eType e2) combineDisjoint l1 l2 = @@ -704,11 +705,11 @@ where e1 = lExpr l1 e2 = lExpr l2 - + flattenConcat (Concat es _) = es >>= flattenConcat flattenConcat e = [e] - + scopeConstraintNum I.PExp {I._exp = I.IInt const'} = constant const' scopeConstraintNum I.PExp {I._exp = I.IFunExp {I._op = "#", I._exps = [path]}} = parsePath curThis path scopeConstraintNum _ = mzero @@ -726,7 +727,7 @@ {- - We use the stack to push every abstraction we traverse through. - For example: - - + - - abstract A - B ? - C : D ? @@ -751,17 +752,17 @@ - - Solving the minimization should have scope_E = 2 in its solution. - The (*) equation is set in constraintConstraints - -} + -} parsePath :: MonadScope m => SClafer -> I.PExp -> m Expr parsePath start pexp = do start' <- claferWithUid (origUid start) parsePath2 start' pexp - + parsePath2 :: MonadScope m => SClafer -> I.PExp -> m Expr parsePath2 start pexp = do - root <- claferWithUid rootUid + root <- claferWithUid rootIdent case unfoldJoins pexp of Just unfold -> do match <- patternMatch parsePath' (ParseState root []) unfold @@ -770,14 +771,14 @@ where asPath :: [[String]] -> Path asPath parts = Path [Part part | part <- parts, not $ null part] - + parsePath' = (This <$> (asPath <$> parseThisPath) <*> getThisType) <|> (Global <$> (asPath <$> parseNonthisPath) <*> getThisType) - + getThisType = do t <- getThis return $ fromJust $ fromUnionType [uid t] - + parseThisPath = do t <- _this_ @@ -788,22 +789,22 @@ parseNonthisPath = do paths <- many (step >>= follow) - + lifo <- popStack let end = if null paths then [] else [last paths] let result = reverse $ end ++ map uid lifo - + do _ref_ >>= follow -- recurse rec <- parseNonthisPath return $ result : rec <|> return [result] - + -- Step handles non-this token. step :: MonadScope m => ParseT m String step = _parent_ <|> _directChild_ <|> try (pushThis >> _indirectChild_) - + -- Update the state of where "this" is. -- Path is one step away from where "this" is. follow :: MonadScope m => String -> ParseT m String @@ -819,8 +820,8 @@ - - + + {------------------------------------------------------------ ---------- Internals --------------------------------------- ------------------------------------------------------------} @@ -879,7 +880,7 @@ var aux `leqTo` 1 setVarKind aux IntVar return aux - + {- - Create a new variable "aux". If - all v == 0 -> aux == 0 @@ -894,7 +895,7 @@ auxs <- mapM testPositive vs aux <- uniqVar (length vs *^ var aux) `equal` varSum auxs - + a <- uniqVar (var a ^-^ var aux) `geqTo` (-0.9999) -- Buffer for floating point inaccuracies (var a ^-^ var aux) `leqTo` 0.0001 -- Buffer for floating point inaccuracies @@ -936,7 +937,7 @@ -- Update where "this" refers to. putThis :: MonadScope m => SClafer -> ParseT m () -putThis newThis = +putThis newThis = do state' <- getState putState $ state'{psThis = newThis} @@ -990,9 +991,9 @@ clafer <- _child_ >>= lift . claferWithUid check <- lift $ isIndirectChild clafer curThis when (not check) $ unexpected $ (uid clafer) ++ " is not an indirect child of " ++ (uid curThis) - return $ uid clafer - + return $ uid clafer + satisfy :: MonadScope m => (String -> Bool) -> ParseT m String satisfy f = tLexeme <$> tokenPrim (tLexeme) (\_ c _ -> tPos c) @@ -1011,7 +1012,7 @@ - Utility functions - -} - + subexpressions :: I.PExp -> [I.PExp] subexpressions p@I.PExp{I._exp = exp'} = p : subexpressions' exp' @@ -1023,7 +1024,7 @@ instance MonadSupply s m => MonadSupply s (ListT m) where supplyNew = lift supplyNew - + instance MonadSupply s m => MonadSupply s (MaybeT m) where supplyNew = lift supplyNew
src/Language/Clafer/Intermediate/Intclafer.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE TemplateHaskell, DeriveDataTypeable #-} {- - Copyright (C) 2012-2014 Kacper Bak, Jimmy Liang, Luke Michael Brown <http://gsd.uwaterloo.ca> + Copyright (C) 2012-2014 Kacper Bak, Jimmy Liang, Michal Antkiewicz, Luke Michael Brown <http://gsd.uwaterloo.ca> 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 @@ -24,166 +24,156 @@ module Language.Clafer.Intermediate.Intclafer where import Language.Clafer.Front.Absclafer + import Control.Lens import Data.Data import Data.Monoid import Data.Foldable (foldMap) -- | unique identifier of a clafer -type UID = String +type UID = String -- | clafer name as declared in the source model -type CName = String +type CName = String +-- | file:// ftp:// or http:// prefixed URL +type URL = String -- | A "supertype" of all IR types -data Ir = - IRIModule IModule | - IRIElement IElement | - IRIType IType | - IRClafer IClafer | - IRIExp IExp | - IRPExp PExp | - IRISuper ISuper | - IRIQuant IQuant | - IRIDecl IDecl | - IRIGCard IGCard +data Ir + = IRIModule IModule + | IRIElement IElement + | IRIType IType + | IRClafer IClafer + | IRIExp IExp + | IRPExp PExp + | IRIReference (Maybe IReference) + | IRIQuant IQuant + | IRIDecl IDecl + | IRIGCard (Maybe IGCard) deriving (Eq, Show) -data IType = TBoolean - | TString - | TInteger - | TReal - | TClafer [String] +data IType + = TBoolean + | TString + | TInteger + | TReal + -- | the type is an intersection of the listed clafers + -- supports having paths in the inheritance hierarchy + -- supports multiple inheritance + | TClafer [UID] deriving (Eq,Ord,Show,Data,Typeable) -- | each file contains exactly one mode. A module is a list of declarations -data IModule = IModule { - -- | always empty for now because we don't have syntax for declaring modules - _mName :: String, - -- | List of top-level elements - _mDecls :: [IElement] +data IModule + = IModule + { _mName :: String -- ^ always empty (no syntax for declaring modules) + , _mDecls :: [IElement] -- ^ List of top-level elements } deriving (Eq,Ord,Show,Data,Typeable) -- | Clafer has a list of fields that specify its properties. Some fields, marked as (o) are for generating optimized code -data IClafer = - IClafer { - -- | the position of the syntax in source code - _cinPos :: Span, - -- | whether abstract or not (i.e., concrete) - _isAbstract :: Bool, - -- | group cardinality - _gcard :: Maybe IGCard, - -- | name declared in the model - _ident :: CName, - -- | a unique identifier - _uid :: UID, - -- | superclafers - _super:: ISuper, - -- | clafer cardinality - _card :: Maybe Interval, - -- | (o) global cardinality - _glCard :: Interval, - -- | nested elements - _elements :: [IElement] +data IClafer + = IClafer + { _cinPos :: Span -- ^ the position of the syntax in source code + , _isAbstract :: Bool -- ^ whether abstract or not (i.e., concrete) + , _gcard :: Maybe IGCard -- ^ group cardinality + , _ident :: CName -- ^ name declared in the model + , _uid :: UID -- ^ a unique identifier + , _parentUID :: UID -- ^ "root" if top-level, "" if unresolved or for root clafer, otherwise UID of the parent clafer + , _super :: Maybe PExp -- ^ superclafer - only allowed PExp is IClaferId. Nothing = default super "clafer" + , _reference :: Maybe IReference -- ^ reference type, bag or set + , _card :: Maybe Interval -- ^ clafer cardinality + , _glCard :: Interval -- ^ (o) global cardinality + , _elements :: [IElement] -- ^ nested elements } deriving (Eq,Ord,Show,Data,Typeable) -- | Clafer's subelement is either a clafer, a constraint, or a goal (objective) -- This is a wrapper type needed to have polymorphic lists of elements -data IElement = - IEClafer { - -- | the actual clafer - _iClafer :: IClafer +data IElement + = IEClafer + { _iClafer :: IClafer -- ^ the actual clafer } - | IEConstraint { - -- | whether hard or not (soft) - _isHard :: Bool, - -- | the container of the actual expression - _cpexp :: PExp + | IEConstraint + { _isHard :: Bool -- ^ whether hard constraint or assertion + , _cpexp :: PExp -- ^ the container of the actual expression } -- | Goal (optimization objective) - | IEGoal { - -- | whether maximize or minimize - _isMaximize :: Bool, - -- | the expression - _cpexp :: PExp - } + | IEGoal + { _isMaximize :: Bool -- ^ whether maximize or minimize + , _cpexp :: PExp -- ^ the expression + } deriving (Eq,Ord,Show,Data,Typeable) --- | A list of superclafers. --- -> overlaping unique (set) --- ->> overlapping non-unique (bag) --- : non overlapping (disjoint) -data ISuper = - ISuper { - _isOverlapping :: Bool, -- whether overlapping or disjoint with other clafers extending given list of superclafers - _supers :: [PExp] +-- | A type of reference. +-- -> values unique (set) +-- ->> values non-unique (bag) +data IReference + = IReference + { _isSet :: Bool -- ^ whether set or bag + , _ref :: PExp -- ^ the only allowed reference expressions are IClafer and set expr. (++, **, --s) } deriving (Eq,Ord,Show,Data,Typeable) -- | Group cardinality is specified as an interval. It may also be given by a keyword. -- xor 1..1 isKeyword = True -- 1..1 1..1 isKeyword = False -data IGCard = - IGCard { - _isKeyword :: Bool, -- whether given by keyword: or, xor, mux - _interval :: Interval - } - deriving (Eq,Ord,Show,Data,Typeable) +data IGCard + = IGCard + { _isKeyword :: Bool -- ^ whether given by keyword: or, xor, mux + , _interval :: Interval + } deriving (Eq,Ord,Show,Data,Typeable) -- | (Min, Max) integer interval. -1 denotes * type Interval = (Integer, Integer) --- | This is expression container (parent). +-- | This is expression container (parent). -- It has meta information about an actual expression 'exp' -data PExp = PExp { - -- | the inferred type - _iType :: Maybe IType, - -- | non-empty unique id for expressions with span, \"\" for noSpan - _pid :: String, - -- | position in the input Clafer file - _inPos :: Span, - -- | the actual expression - _exp :: IExp +data PExp + = PExp + { _iType :: Maybe IType -- ^ the inferred type + , _pid :: String -- ^ non-empty unique id for expressions with span, \"\" for noSpan + , _inPos :: Span -- ^ position in the input Clafer file + , _exp :: IExp -- ^ the actual expression } deriving (Eq,Ord,Show,Data,Typeable) -data IExp = - -- | quantified expression with declarations - -- e.g., [ all x1; x2 : X | x1.ref != x2.ref ] - IDeclPExp { - _quant :: IQuant, - _oDecls :: [IDecl], - _bpexp :: PExp +-- | Embedes reference to a resolved Clafer +type ClaferBinding = Maybe UID + +data IExp + -- | quantified expression with declarations + -- e.g., [ all x1; x2 : X | x1.ref != x2.ref ] + = IDeclPExp + { _quant :: IQuant + , _oDecls :: [IDecl] + , _bpexp :: PExp } - -- | expression with a - -- unary function, e.g., -1 - -- binary function, e.g., 2 + 3 - -- ternary function, e.g., if x then 4 else 5 - | IFunExp { - _op :: String, - _exps :: [PExp] + -- | expression with a + -- unary function, e.g., -1 + -- binary function, e.g., 2 + 3 + -- ternary function, e.g., if x then 4 else 5 + | IFunExp + { _op :: String + , _exps :: [PExp] } - -- | integer number - | IInt { - _iint :: Integer + -- | integer number + | IInt + { _iint :: Integer } - -- | real number - | IDouble { - _idouble :: Double + -- | real number + | IDouble + { _idouble :: Double } - -- | string - | IStr { - _istr :: String + -- | string + | IStr + { _istr :: String } - -- | a reference to a clafer name - | IClaferId { - -- | module name - currently not used and empty since we have no module system - _modName :: String, - -- | name of the clafer being referred to - _sident :: CName, - -- | identifier refers to a top-level definition - _isTop :: Bool + -- | a reference to a clafer name + | IClaferId + { _modName :: String -- ^ module name - currently not used and empty since we have no module system + , _sident :: CName -- ^ name of the clafer being referred to + , _isTop :: Bool -- ^ identifier refers to a top-level definition + , _binding :: ClaferBinding -- ^ the UID of the bound IClafer, if resolved } deriving (Eq,Ord,Show,Data,Typeable) @@ -225,30 +215,22 @@ -- | Local declaration -- disj x1; x2 : X ++ Y --- y1 : Y -data IDecl = - IDecl { - -- | is disjunct - _isDisj :: Bool, - -- | a list of local names - _decls :: [CName], - -- | set to which local names refer to - _body :: PExp +-- y1 : Y +data IDecl + = IDecl + { _isDisj :: Bool -- ^ is disjunct + , _decls :: [CName] -- ^ a list of local names + , _body :: PExp -- ^ set to which local names refer to } deriving (Eq,Ord,Show,Data,Typeable) -- | quantifier -data IQuant = - -- | does not exist - INo - -- | less than one - | ILone - -- | exactly one - | IOne - -- | at least one (i.e., exists) - | ISome - -- | for all - | IAll +data IQuant + = INo -- ^ does not exist + | ILone -- ^ less than one + | IOne -- ^ exactly one + | ISome -- ^ at least one (i.e., exists) + | IAll -- ^ for all deriving (Eq,Ord,Show,Data,Typeable) type LineNo = Integer @@ -260,12 +242,12 @@ -- | map over IR mapIR :: (Ir -> Ir) -> IModule -> IModule -- fmap/map for IModule -mapIR f (IModule name decls') = +mapIR f (IModule name decls') = unWrapIModule $ f $ IRIModule $ IModule name $ map (unWrapIElement . iMap f . IRIElement) decls' -- | foldMap over IR foldMapIR :: (Monoid m) => (Ir -> m) -> IModule -> m -- foldMap for IModule -foldMapIR f i@(IModule _ decls') = +foldMapIR f i@(IModule _ decls') = (f $ IRIModule i) `mappend` foldMap (iFoldMap f . IRIElement) decls' -- | fold the IR @@ -273,34 +255,35 @@ foldIR f e m = appEndo (foldMapIR (Endo . f) m) e {- -Note: even though the above functions take an IModule, -the functions they use take an Ir (wrapped version see top of module). +Note: even though the above functions take an IModule, +the functions they use take an Ir (wrapped version see top of module). Also the bellow functions are just helpers for the above, you may use them if you wish to start from somewhere other than IModule. -} -iMap :: (Ir -> Ir) -> Ir -> Ir -iMap f (IRIElement (IEClafer c)) = +iMap :: (Ir -> Ir) -> Ir -> Ir +iMap f (IRIElement (IEClafer c)) = f $ IRIElement $ IEClafer $ unWrapIClafer $ iMap f $ IRClafer c iMap f (IRIElement (IEConstraint h pexp)) = f $ IRIElement $ IEConstraint h $ unWrapPExp $ iMap f $ IRPExp pexp iMap f (IRIElement (IEGoal m pexp)) = - f $ IRIElement $ IEGoal m $ unWrapPExp $ iMap f $ IRPExp pexp -iMap f (IRClafer (IClafer p a (Just grc) i u s c goc elems)) = - f $ IRClafer $ IClafer p a (Just $ unWrapIGCard $ iMap f $ IRIGCard grc) i u (unWrapISuper $ iMap f $ IRISuper s) c goc $ map (unWrapIElement . iMap f . IRIElement) elems -iMap f (IRClafer (IClafer p a Nothing i u s c goc elems)) = - f $ IRClafer $ IClafer p a Nothing i u (unWrapISuper $ iMap f $ IRISuper s) c goc $ map (unWrapIElement . iMap f . IRIElement) elems + f $ IRIElement $ IEGoal m $ unWrapPExp $ iMap f $ IRPExp pexp +iMap f (IRClafer (IClafer p a grc i u pu Nothing r c goc elems)) = + f $ IRClafer $ IClafer p a (unWrapIGCard $ iMap f $ IRIGCard grc) i u pu Nothing (unWrapIReference $ iMap f $ IRIReference r) c goc $ map (unWrapIElement . iMap f . IRIElement) elems +iMap f (IRClafer (IClafer p a grc i u pu (Just s) r c goc elems)) = + f $ IRClafer $ IClafer p a (unWrapIGCard $ iMap f $ IRIGCard grc) i u pu (Just $ unWrapPExp $ iMap f $ IRPExp s) (unWrapIReference $ iMap f $ IRIReference r) c goc $ map (unWrapIElement . iMap f . IRIElement) elems iMap f (IRIExp (IDeclPExp q decs p)) = f $ IRIExp $ IDeclPExp (unWrapIQuant $ iMap f $ IRIQuant q) (map (unWrapIDecl . iMap f . IRIDecl) decs) $ unWrapPExp $ iMap f $ IRPExp p -iMap f (IRIExp (IFunExp o pexps)) = +iMap f (IRIExp (IFunExp o pexps)) = f $ IRIExp $ IFunExp o $ map (unWrapPExp . iMap f . IRPExp) pexps iMap f (IRPExp (PExp (Just iType') pID p iExp)) = f $ IRPExp $ PExp (Just $ unWrapIType $ iMap f $ IRIType iType') pID p $ unWrapIExp $ iMap f $ IRIExp iExp iMap f (IRPExp (PExp Nothing pID p iExp)) = f $ IRPExp $ PExp Nothing pID p $ unWrapIExp $ iMap f $ IRIExp iExp -iMap f (IRISuper (ISuper o pexps)) = - f $ IRISuper $ ISuper o $ map (unWrapPExp . iMap f . IRPExp) pexps -iMap f (IRIDecl (IDecl i d body')) = +iMap _ x@(IRIReference Nothing) = x +iMap f (IRIReference (Just (IReference is ref))) = + f $ IRIReference $ Just $ IReference is $ (unWrapPExp . iMap f . IRPExp) ref +iMap f (IRIDecl (IDecl i d body')) = f $ IRIDecl $ IDecl i d $ unWrapPExp $ iMap f $ IRPExp body' iMap f i = f i @@ -309,21 +292,22 @@ f i `mappend` (iFoldMap f $ IRPExp pexp) iFoldMap f i@(IRIElement (IEGoal _ pexp)) = f i `mappend` (iFoldMap f $ IRPExp pexp) -iFoldMap f i@(IRClafer (IClafer _ _ Nothing _ _ s _ _ elems)) = - f i `mappend` (iFoldMap f $ IRISuper s) `mappend` foldMap (iFoldMap f . IRIElement) elems -iFoldMap f i@(IRClafer (IClafer _ _ (Just grc) _ _ s _ _ elems)) = - f i `mappend` (iFoldMap f $ IRISuper s) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems +iFoldMap f i@(IRClafer (IClafer _ _ grc _ _ _ Nothing r _ _ elems)) = + f i `mappend` (iFoldMap f $ IRIReference r) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems +iFoldMap f i@(IRClafer (IClafer _ _ grc _ _ _ (Just s) r _ _ elems)) = + f i `mappend` (iFoldMap f $ IRPExp s) `mappend` (iFoldMap f $ IRIReference r) `mappend` (iFoldMap f $ IRIGCard grc) `mappend` foldMap (iFoldMap f . IRIElement) elems iFoldMap f i@(IRIExp (IDeclPExp q decs p)) = f i `mappend` (iFoldMap f $ IRIQuant q) `mappend` (iFoldMap f $ IRPExp p) `mappend` foldMap (iFoldMap f . IRIDecl) decs -iFoldMap f i@(IRIExp (IFunExp _ pexps)) = +iFoldMap f i@(IRIExp (IFunExp _ pexps)) = f i `mappend` foldMap (iFoldMap f . IRPExp) pexps iFoldMap f i@(IRPExp (PExp (Just iType') _ _ iExp)) = f i `mappend` (iFoldMap f $ IRIType iType') `mappend` (iFoldMap f $ IRIExp iExp) iFoldMap f i@(IRPExp (PExp Nothing _ _ iExp)) = f i `mappend` (iFoldMap f $ IRIExp iExp) -iFoldMap f i@(IRISuper (ISuper _ pexps)) = - f i `mappend` foldMap (iFoldMap f . IRPExp) pexps -iFoldMap f i@(IRIDecl (IDecl _ _ body')) = +iFoldMap f i@(IRIReference Nothing) = f i +iFoldMap f i@(IRIReference (Just (IReference _ ref))) = + f i `mappend` (iFoldMap f . IRPExp) ref +iFoldMap f i@(IRIDecl (IDecl _ _ body')) = f i `mappend` (iFoldMap f $ IRPExp body') iFoldMap f (IRIElement (IEClafer c)) = iFoldMap f $ IRClafer c iFoldMap f i = f i @@ -350,16 +334,16 @@ unWrapPExp :: Ir -> PExp unWrapPExp (IRPExp x) = x unWrapPExp x = error $ "Can't call unWarpPExp on " ++ show x -unWrapISuper :: Ir -> ISuper -unWrapISuper (IRISuper x) = x -unWrapISuper x = error $ "Can't call unWarpISuper on " ++ show x +unWrapIReference :: Ir -> Maybe IReference +unWrapIReference (IRIReference x) = x +unWrapIReference x = error $ "Can't call unWarpIReference on " ++ show x unWrapIQuant :: Ir -> IQuant unWrapIQuant (IRIQuant x) = x unWrapIQuant x = error $ "Can't call unWarpIQuant on " ++ show x unWrapIDecl :: Ir -> IDecl unWrapIDecl (IRIDecl x) = x unWrapIDecl x = error $ "Can't call unWarpIDecl on " ++ show x -unWrapIGCard :: Ir -> IGCard +unWrapIGCard :: Ir -> Maybe IGCard unWrapIGCard (IRIGCard x) = x unWrapIGCard x = error $ "Can't call unWarpIGcard on " ++ show x @@ -374,7 +358,7 @@ makeLenses ''IElement -makeLenses ''ISuper +makeLenses ''IReference makeLenses ''IGCard @@ -382,4 +366,4 @@ makeLenses ''IExp -makeLenses ''IDecl+makeLenses ''IDecl
src/Language/Clafer/Intermediate/Resolver.hs view
@@ -35,9 +35,9 @@ -- | Run the various resolvers resolveModule :: ClaferArgs -> IModule -> Resolve (IModule, GEnv) -resolveModule args' declarations = +resolveModule args' imodule = do - r <- resolveNModule $ nameModule (skip_resolver args') declarations + r <- resolveNModule $ nameModule (skip_resolver args') imodule resolveNamesModule args' =<< (rom' $ rem' r) where rem' = if flatten_inheritance args' then resolveEModule else id @@ -48,19 +48,19 @@ nameModule :: Bool -> IModule -> (IModule, GEnv) nameModule skipResolver imodule = (imodule{_mDecls = decls'}, genv') where - (decls', genv') = runState (mapM (nameElement skipResolver) $ _mDecls imodule) $ GEnv Map.empty 0 Map.empty [] + (decls', genv') = runState (mapM (nameElement skipResolver "root") $ _mDecls imodule) $ GEnv Map.empty 0 Map.empty [] -nameElement :: MonadState GEnv m => Bool -> IElement -> m IElement -nameElement skipResolver x = case x of - IEClafer claf -> IEClafer `liftM` (nameClafer skipResolver claf) +nameElement :: MonadState GEnv m => Bool -> UID -> IElement -> m IElement +nameElement skipResolver puid x = case x of + IEClafer claf -> IEClafer `liftM` (nameClafer skipResolver puid claf) IEConstraint isHard' pexp -> IEConstraint isHard' `liftM` (namePExp pexp) IEGoal isMaximize' pexp -> IEGoal isMaximize' `liftM` (namePExp pexp) -nameClafer :: MonadState GEnv m => Bool -> IClafer -> m IClafer -nameClafer skipResolver claf = do - claf' <- if skipResolver then return claf{_uid = _ident claf} else (renameClafer (not skipResolver)) claf - elements' <- mapM (nameElement skipResolver) $ _elements claf +nameClafer :: MonadState GEnv m => Bool -> UID -> IClafer -> m IClafer +nameClafer skipResolver puid claf = do + claf' <- if skipResolver then return claf{_uid = _ident claf, _parentUID = puid} else renameClafer True puid claf + elements' <- mapM (nameElement skipResolver (_uid claf')) $ _elements claf return $ claf' {_elements = elements'} @@ -69,7 +69,7 @@ n <- gets expCount modify (\e -> e {expCount = 1 + n}) exp'' <- nameIExp exp' - return $ pexp {_pid = concat [ "e", show n, "_"], Language.Clafer.Intermediate.Intclafer._exp = exp''} + return $ pexp {_pid = concat [ "e", show n, "_"], _exp = exp''} nameIExp :: MonadState GEnv m => IExp -> m IExp nameIExp x = case x of @@ -85,9 +85,9 @@ -- ----------------------------------------------------------------------------- resolveNamesModule :: ClaferArgs -> (IModule, GEnv) -> Resolve (IModule, GEnv) -resolveNamesModule args' (declarations, genv') = +resolveNamesModule args' (imodule, genv') = do - res <- foldM (flip ($)) declarations $ map (\f -> flip (curry f) genv') funs + res <- foldM (flip ($)) imodule $ map (\f -> flip (curry f) genv') funs return (res, genv') where funs :: [(IModule, GEnv) -> Resolve IModule]
src/Language/Clafer/Intermediate/ResolverInheritance.hs view
@@ -34,7 +34,6 @@ import Language.ClaferT import Language.Clafer.Common -import Language.Clafer.Front.Absclafer import Language.Clafer.Intermediate.Intclafer import Language.Clafer.Intermediate.ResolverName @@ -46,9 +45,9 @@ let decls' = _mDecls imodule decls'' <- mapM (resolveNElement decls') decls' return (imodule{_mDecls = decls''}, genv' {sClafers = bfs toNodeShallow $ toClafers decls''}) - + resolveNClafer :: [IElement] -> IClafer -> Resolve IClafer resolveNClafer declarations clafer = do @@ -58,18 +57,18 @@ _elements = elements'} -resolveNSuper :: [IElement] -> ISuper -> Resolve ISuper -resolveNSuper declarations x = case x of - ISuper False [PExp _ pid' pos' (IClaferId _ id' isTop')] -> - if isPrimitive id' || id' == "clafer" - then return x +resolveNSuper :: [IElement] -> Maybe PExp -> Resolve (Maybe PExp) +resolveNSuper _ Nothing = return Nothing +resolveNSuper declarations (Just (PExp _ pid' pos' (IClaferId _ id' _ _))) = + if isPrimitive id' + then throwError $ SemanticErr pos' $ "Primitive types are not allowed as super types: " ++ id' else do r <- resolveN pos' declarations id' - id'' <- case r of + (id'', [superClafer']) <- case r of Nothing -> throwError $ SemanticErr pos' $ "No superclafer found: " ++ id' - Just m -> return $ fst m - return $ ISuper False [idToPExp pid' pos' "" id'' isTop'] - _ -> return x + Just m -> return m + return $ Just $ idToPExp pid' pos' "" id'' $ isTopLevel superClafer' +resolveNSuper _ x = return x resolveNElement :: [IElement] -> IElement -> Resolve IElement @@ -95,18 +94,14 @@ resolveOClafer :: SEnv -> IClafer -> Resolve IClafer resolveOClafer env clafer = do - super' <- resolveOSuper env {context = Just clafer} $ _super clafer + reference' <- resolveOReference env {context = Just clafer} $ _reference clafer elements' <- mapM (resolveOElement env {context = Just clafer}) $ _elements clafer - return $ clafer {_super = super', _elements = elements'} + return $ clafer {_reference = reference', _elements = elements'} -resolveOSuper :: SEnv -> ISuper -> Resolve ISuper -resolveOSuper env x = case x of - ISuper True exps' -> do - exps'' <- mapM (resolvePExp env) exps' - let isOverlap = not (length exps'' == 1 && isPrimitive (getSuperId exps'')) - return $ ISuper isOverlap exps'' - _ -> return x +resolveOReference :: SEnv -> Maybe IReference -> Resolve (Maybe IReference) +resolveOReference _ Nothing = return Nothing +resolveOReference env (Just (IReference is' exp')) = Just <$> IReference is' <$> resolvePExp env exp' resolveOElement :: SEnv -> IElement -> Resolve IElement @@ -114,8 +109,8 @@ IEClafer clafer -> IEClafer <$> resolveOClafer env clafer IEConstraint _ _ -> return x IEGoal _ _ -> return x - + -- | Resolve inherited and default cardinalities analyzeModule :: (IModule, GEnv) -> IModule analyzeModule (imodule, genv') = @@ -138,9 +133,8 @@ analyzeGCard env clafer = gcard' `mplus` (Just $ IGCard False (0, -1)) where gcard' - | _isOverlapping $ _super clafer = _gcard clafer - | otherwise = listToMaybe $ mapMaybe _gcard $ - findHierarchy getSuper (clafers env) clafer + | isNothing $ _super clafer = _gcard clafer + | otherwise = listToMaybe $ mapMaybe _gcard $ findHierarchy getSuper (clafers env) clafer analyzeCard :: SEnv -> IClafer -> Maybe Interval @@ -148,11 +142,10 @@ where card' | _isAbstract clafer = (0, -1) - | (isJust $ context env) && pGcard == (0, -1) - || (isTopLevel $ _cinPos clafer) = (1, 1) + | (isJust $ context env) && pGcard == (0, -1) + || (isTopLevel clafer) = (1, 1) | otherwise = (0, 1) pGcard = _interval $ fromJust $ _gcard $ fromJust $ context env - isTopLevel (Span (Pos _ c) _) = c==1 analyzeElement :: SEnv -> IElement -> IElement analyzeElement env x = case x of @@ -183,10 +176,7 @@ IEGoal _ _ -> Nothing unrollableClafer :: IClafer -> [String] -unrollableClafer clafer - | _isOverlapping $ _super clafer = [] - | getSuper clafer == "clafer" = deps - | otherwise = getSuper clafer : deps +unrollableClafer clafer = (getSuper clafer) ++ deps where deps = (toClafers $ _elements clafer) >>= unrollableClafer @@ -203,7 +193,7 @@ resolveEClafer :: MonadState GEnv m => [String] -> [String] -> Bool -> [IElement] -> IClafer -> m IClafer resolveEClafer predecessors unrollables absAncestor declarations clafer = do sClafers' <- gets sClafers - clafer' <- renameClafer absAncestor clafer + clafer' <- renameClafer absAncestor (_parentUID clafer) clafer let predecessors' = _uid clafer' : predecessors (sElements, super', superList) <- resolveEInheritance predecessors' unrollables absAncestor declarations @@ -217,33 +207,32 @@ $ _elements clafer return $ clafer' {_super = super', _elements = elements' ++ sElements} -renameClafer :: MonadState GEnv m => Bool -> IClafer -> m IClafer -renameClafer False clafer = return clafer -renameClafer True clafer = renameClafer' clafer +renameClafer :: MonadState GEnv m => Bool -> UID -> IClafer -> m IClafer +renameClafer False _ clafer = return clafer +renameClafer True puid clafer = renameClafer' puid clafer -renameClafer' :: MonadState GEnv m => IClafer -> m IClafer -renameClafer' clafer = do - let claferIdent = _ident clafer +renameClafer' :: MonadState GEnv m => UID -> IClafer -> m IClafer +renameClafer' puid clafer = do + let claferIdent = _ident clafer identCountMap' <- gets identCountMap let count = Map.findWithDefault 0 claferIdent identCountMap' modify (\e -> e { identCountMap = Map.alter (\_ -> Just (count+1)) claferIdent identCountMap' } ) - return $ clafer { _uid = genId claferIdent count } + return $ clafer { _uid = genId claferIdent count, _parentUID = puid } genId :: String -> Int -> String genId id' count = concat ["c", show count, "_", id'] -resolveEInheritance :: MonadState GEnv m => [String] -> [String] -> Bool -> [IElement] -> [IClafer] -> m ([IElement], ISuper, [IClafer]) -resolveEInheritance predecessors unrollables absAncestor declarations allSuper - | _isOverlapping $ _super clafer = return ([], _super clafer, [clafer]) - | otherwise = do +resolveEInheritance :: MonadState GEnv m => [String] -> [String] -> Bool -> [IElement] -> [IClafer] -> m ([IElement], Maybe PExp, [IClafer]) +resolveEInheritance predecessors unrollables absAncestor declarations allSuper = do let superList = (if absAncestor then id else tail) allSuper let unrollSuper = filter (\s -> _uid s `notElem` unrollables) $ tail allSuper elements' <- mapM (resolveEElement predecessors unrollables True declarations) $ unrollSuper >>= _elements - let super' = if (getSuper clafer `elem` unrollables) - then _super clafer - else ISuper False [idToPExp "" noSpan "" "clafer" False] + + let super' = case (`elem` unrollables) <$> getSuper clafer of + [True] -> _super clafer + _ -> Nothing return (elements', super', superList) where clafer = head allSuper
src/Language/Clafer/Intermediate/ResolverName.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE FlexibleContexts #-} {- - Copyright (C) 2012 Kacper Bak, Jimmy Liang <http://gsd.uwaterloo.ca> + Copyright (C) 2012 Kacper Bak, Jimmy Liang, Michal Antkiewicz <http://gsd.uwaterloo.ca> 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 @@ -37,7 +37,7 @@ import Language.Clafer.Intermediate.Intclafer import qualified Language.Clafer.Intermediate.Intclafer as I --- | this environment is created for each clafer +-- | this environment is created for each clafer data SEnv = SEnv { clafers :: [IClafer], -- (constant) top level clafers context :: Maybe IClafer, -- context of a constraint @@ -51,25 +51,17 @@ } deriving Show -- | How a given name was resolved -data HowResolved = - -- | "this", "parent", "children" - Special - -- | primitive type: integer, string - | TypeSpecial - -- | local variable (in constraints) - | Binding - -- | clafer's descendant - | Subclafers - -- | resolved by a reference - | Reference - -- | clafer's ancestor - | Ancestor - -- | abstract clafer - | AbsClafer - -- | non-abstract top-level clafer - | TopClafer +data HowResolved + = Special -- ^ "this", "parent", "children", and "root" + | TypeSpecial -- ^ primitive type: "integer", "string" + | Binding -- ^ local variable (in constraints) + | Subclafers -- ^ clafer's descendant + | Reference -- ^ resolved by a reference + | Ancestor -- ^ clafer's ancestor + | AbsClafer -- ^ abstract clafer + | TopClafer -- ^ non-abstract top-level clafer deriving (Eq, Show) - + type Resolve = Either ClaferSErr -- initialize the cache (env) @@ -85,7 +77,7 @@ checkDuplicateSiblings tree = let duplicate = checkDuplicateSiblings' $ _mDecls tree in if (isJust duplicate) then let Just(name,pos') = duplicate in throwError $ SemanticErr pos' $ ("Duplicate name: " ++ name) --error else return $ _mDecls tree - + checkDuplicateSiblings' :: [IElement] -> Maybe (String,Span) checkDuplicateSiblings' tree =if (isJust check) then check else checkForJust $ map checkDuplicateSiblings' elementsList @@ -100,7 +92,7 @@ h else checkForJust rest - + checkListDuplicates :: [(String, Span)] -> Maybe (String,Span) checkListDuplicates list = checkListDuplicates' $ sortBy (compare `on` fst) list @@ -111,16 +103,17 @@ Just (a,b) else checkListDuplicates' ((c,d):rest) - + isIEClafer :: IElement -> Bool isIEClafer (IEClafer _) = True isIEClafer _ = False resolveModuleNames :: (IModule, GEnv) -> Resolve IModule -resolveModuleNames (imodule, genv') = +resolveModuleNames (imodule, genv') = do decls' <- checkDuplicateSiblings imodule - mDecls' <- mapM (resolveElement (defSEnv genv' decls')) decls' + let defaultSEnv = defSEnv genv' decls' + mDecls' <- mapM (resolveElement defaultSEnv) decls' return $ imodule{_mDecls = mDecls'} resolveClafer :: SEnv -> IClafer -> Resolve IClafer @@ -143,14 +136,14 @@ resolveElement env x = case x of IEClafer clafer -> IEClafer <$> resolveClafer env clafer IEConstraint isHard' pexp -> IEConstraint isHard' <$> resolvePExp env pexp - IEGoal isMaximize' pexp -> IEGoal isMaximize' <$> resolvePExp env pexp + IEGoal isMaximize' pexp -> IEGoal isMaximize' <$> resolvePExp env pexp resolvePExp :: SEnv -> PExp -> Resolve PExp resolvePExp env pexp = do - exp' <- resolveIExp (_inPos pexp) env $ Language.Clafer.Intermediate.Intclafer._exp pexp - return $ pexp {Language.Clafer.Intermediate.Intclafer._exp = exp'} + exp' <- resolveIExp (_inPos pexp) env $ _exp pexp + return $ pexp {_exp = exp'} resolveIExp :: Span -> SEnv -> IExp -> Resolve IExp resolveIExp pos' env x = case x of @@ -158,13 +151,12 @@ let (decls'', env') = runState (runErrorT $ (mapM (ErrorT . processDecl) decls')) env IDeclPExp quant' <$> decls'' <*> resolvePExp env' pexp - IFunExp op' exps' -> if op' == iJoin then resNav else IFunExp op' <$> mapM res exps' + IFunExp op' exps' -> if op' == iJoin then resNav else IFunExp op' <$> mapM (resolvePExp env) exps' IInt _ -> return x IDouble _ -> return x IStr _ -> return x - IClaferId _ _ _ -> resNav + IClaferId _ _ _ _ -> resNav where - res = resolvePExp env resNav = fst <$> resolveNav pos' env x True liftError :: Monad m => Either e a -> ErrorT e m a @@ -184,44 +176,57 @@ (exp', path') <- resolveNav (_inPos pexp) env {context = listToMaybe path, resPath = path} (I._exp pexp) False return (IFunExp iJoin [pexp0{I._exp=exp0'}, pexp{I._exp=exp'}], path') - IClaferId modName' id' _ -> out + IClaferId modName' id' _ _-> out where out | isFirst = mkPath env <$> resolveName pos' env id' | otherwise = mkPath' modName' <$> resolveImmName pos' env id' - y -> throwError $ SemanticErr pos' $ "Cannot resolve nav of " ++ show y + y -> throwError $ SemanticErr pos' $ "Cannot resolve nav of " ++ show y -- depending on how resolved construct a path mkPath :: SEnv -> (HowResolved, String, [IClafer]) -> (IExp, [IClafer]) mkPath env (howResolved, id', path) = case howResolved of - Binding -> (mkLClaferId id' True, path) + Binding -> (IClaferId "" id' True Nothing, path) Special -> (specIExp, path) - TypeSpecial -> (mkLClaferId id' True, path) - Subclafers -> (toNav $ tail $ reverse $ map _uid path, path) - Ancestor -> (toNav' $ adjustAncestor (reverse $ map _uid $ resPath env) - (reverse $ map _uid path), path) - _ -> (toNav' $ reverse $ map _uid path, path) + TypeSpecial -> (IClaferId "" id' True (Just id'), path) + Subclafers -> (toNav $ tail $ reverse $ map toTuple path, path) + Ancestor -> (toNav' $ adjustAncestor (fromJust $ context env) + (reverse $ map toTuple $ resPath env) + (reverse $ map toTuple path), path) + _ -> (toNav' $ reverse $ map toTuple path, path) where - toNav = foldl - (\exp' id'' -> IFunExp iJoin [pExpDefPidPos exp', mkPLClaferId id'' False]) - (mkLClaferId this True) - specIExp = if id' /= this then toNav [id'] else mkLClaferId id' True + toNav = foldl' + (\exp' (id'', c) -> IFunExp iJoin [pExpDefPidPos exp', mkPLClaferId id'' False $ _uid <$> c]) + (IClaferId "" thisIdent True (_uid <$> context env)) + specIExp = if id' /= thisIdent && id' /= rootIdent + then toNav [(id', Just $ head path)] + else if id' == thisIdent + then IClaferId "" thisIdent True (_uid <$> context env) + else IClaferId "" rootIdent True (Just rootIdent) -toNav' :: [String] -> IExp -toNav' p = (mkIFunExp iJoin $ map (\c -> mkLClaferId c False) p) :: IExp +toTuple :: IClafer->(String, Maybe IClafer) +toTuple c = (_uid c, Just c) +toNav' :: [(String, Maybe IClafer)] -> IExp +toNav' p = (mkIFunExp iJoin $ map (\(id', cbind) -> IClaferId "" id' False (_uid <$> cbind)) p) :: IExp -adjustAncestor :: [String] -> [String] -> [String] -adjustAncestor cPath rPath = this : parents ++ (fromJust $ stripPrefix prefix rPath) + +adjustAncestor :: IClafer -> [(String, Maybe IClafer)] -> [(String, Maybe IClafer)] -> [(String, Maybe IClafer)] +adjustAncestor ctx cPath rPath = (thisIdent, Just ctx) : parents ++ (fromJust $ stripPrefix prefix rPath) where - parents = replicate (length $ fromJust $ stripPrefix prefix cPath) parent - prefix = fst $ unzip $ takeWhile (uncurry (==)) $ zip cPath rPath + parents = replicate (length $ fromJust $ stripPrefix prefix cPath) (parentIdent, Nothing) + prefix = fst $ unzip $ takeWhile (uncurry eqIds) $ zip cPath rPath + eqIds a b = (fst a) == (fst b) mkPath' :: String -> (HowResolved, String, [IClafer]) -> (IExp, [IClafer]) mkPath' modName' (howResolved, id', path) = case howResolved of - Reference -> (toNav' ["ref", id'], path) - _ -> (IClaferId modName' id' False, path) + Reference -> (toNav' (zip ["ref", id'] (map Just path)), path) + _ -> (IClaferId modName' id' False (_uid <$> bind), path) + where + bind = case path of + [] -> Nothing + c:_ -> Just c -- ----------------------------------------------------------------------------- @@ -243,18 +248,23 @@ -- reports error if clafer not found resolveNone :: Span -> SEnv -> String -> Resolve t resolveNone pos' env id' = - throwError $ SemanticErr pos' $ "resolver: " ++ id' ++ " not found" ++ - " within " ++ (showPath $ map _uid $ resPath env) + throwError $ SemanticErr pos' $ concat + [ "Name resolver: '" + , id' + , "' not found within paths:" + , showPath $ map _uid $ resPath env + , "in context of '" + , show $ fromMaybe "none" (_uid <$> context env) + , "'" ] -- checks if ident is one of special identifiers resolveSpecial :: SEnv -> String -> Resolve (Maybe (HowResolved, String, [IClafer])) resolveSpecial env id' - | id' `elem` [this, children, ref] = - return $ Just (Special, id', resPath env) - | id' == parent = return $ Just (Special, id', tail $ resPath env) - | isPrimitive id' = return $ Just (TypeSpecial, id', []) - | otherwise = return Nothing + | id' == parentIdent = return $ Just (Special, id', safeTail $ resPath env) + | isSpecial id' = return $ Just (Special, id', resPath env) + | isPrimitive id' = return $ Just (TypeSpecial, id', []) + | otherwise = return Nothing -- checks if ident is bound locally @@ -278,10 +288,10 @@ resolveReference pos' env id' = resolveChildren' pos' env id' allChildren Reference resolveChildren' :: Span -> SEnv -> String -> (SEnv -> [IClafer]) -> HowResolved -> Either ClaferSErr (Maybe (HowResolved, String, [IClafer])) -resolveChildren' pos' env id' f label = +resolveChildren' pos' env id' getChildrenF label = runMaybeT $ do liftMaybe $ context env - u <- MaybeT $ findUnique pos' id' $ map (\x -> (x, [x,fromJust $ context env])) $ f env + u <- MaybeT $ findUnique pos' id' $ map (\x -> (x, [x,fromJust $ context env])) $ getChildrenF env liftMaybe $ toMTriple label u liftMaybe :: Maybe a -> MaybeT (Either ClaferSErr) a @@ -312,17 +322,17 @@ where result = (clafer, resPath env) clafer = fromJust $ context env - + -- return children and inherited children but no children of reference targets allInhChildren :: SEnv -> [IClafer] -allInhChildren = selectChildren getSuperNoArr +allInhChildren = selectChildren getSuper -- return all children including inherited children children of reference targets allChildren :: SEnv -> [IClafer] -allChildren = selectChildren getSuper +allChildren = selectChildren getSuperAndReference -selectChildren :: (IClafer -> String) -> SEnv -> [IClafer] +selectChildren :: (IClafer -> [String]) -> SEnv -> [IClafer] selectChildren f env = getSubclafers $ concat $ mapHierarchy _elements f (sClafers $ genv env) (fromJust $ context env) @@ -337,7 +347,7 @@ xs'' = map ((map _uid).snd) xs' errMsg = (if isNamespaceConflict xs'' then "cannot be defined because the name should be unique in the same namespace.\n" - else "is not unique. ") ++ + else "is not unique. ") ++ "Available paths:\n" ++ (xs'' >>= showPath) findFirst :: String -> [(IClafer, [IClafer])] -> Maybe (String, [IClafer])
src/Language/Clafer/Intermediate/ResolverType.hs view
@@ -44,7 +44,7 @@ newtype TypeAnalysis a = TypeAnalysis (ReaderT TypeInfo (Either ClaferSErr) a) deriving (MonadError ClaferSErr, Monad, Functor, MonadReader TypeInfo, Applicative) - + typeOfUid :: MonadTypeAnalysis m => String -> m IType typeOfUid uid = (fromMaybe (TClafer [uid]) . lookup uid) <$> typeDecls @@ -52,11 +52,11 @@ -- What "this" refers to curThis :: m SClafer localCurThis :: SClafer -> m a -> m a - + -- The next path is a child of curPath (or Nothing) curPath :: m (Maybe IType) localCurPath :: IType -> m a -> m a - + -- Extra declarations typeDecls :: m TypeDecls localDecls :: TypeDecls -> m a -> m a @@ -67,19 +67,19 @@ TypeAnalysis $ local setCurThis d where setCurThis t = t{iCurThis = newThis} - + curPath = TypeAnalysis $ asks iCurPath localCurPath newPath (TypeAnalysis d) = TypeAnalysis $ local setCurPath d where setCurPath t = t{iCurPath = Just newPath} - + typeDecls = TypeAnalysis $ asks iTypeDecls localDecls extra (TypeAnalysis d) = TypeAnalysis $ local addTypeDecls d where addTypeDecls t@TypeInfo{iTypeDecls = c} = t{iTypeDecls = extra ++ c} - + instance MonadTypeAnalysis m => MonadTypeAnalysis (ListT m) where curThis = lift $ curThis localCurThis = mapListT . localCurThis @@ -87,7 +87,7 @@ localCurPath = mapListT . localCurPath typeDecls = lift typeDecls localDecls = mapListT . localDecls - + instance MonadTypeAnalysis m => MonadTypeAnalysis (ErrorT ClaferSErr m) where curThis = lift $ curThis localCurThis = mapErrorT . localCurThis @@ -95,8 +95,8 @@ localCurPath = mapErrorT . localCurPath typeDecls = lift typeDecls localDecls = mapErrorT . localDecls - + instance MonadAnalysis TypeAnalysis where clafers = asks (sclafers . iInfo) withClafers cs r = @@ -109,10 +109,10 @@ runTypeAnalysis (TypeAnalysis tc) imodule = runReaderT tc $ TypeInfo [] (gatherInfo imodule) undefined Nothing unionType :: IType -> [String] -unionType TString = ["string"] -unionType TReal = ["real"] -unionType TInteger = ["integer"] -unionType TBoolean = ["boolean"] +unionType TString = [stringType] +unionType TReal = [realType] +unionType TInteger = [integerType] +unionType TBoolean = [booleanType] unionType (TClafer u) = u (+++) :: IType -> IType -> IType @@ -133,7 +133,7 @@ closure ut = concat <$> mapM hierarchy ut intersection :: MonadAnalysis m => IType -> IType -> m (Maybe IType) -intersection t1 t2 = +intersection t1 t2 = do h1 <- mapM hierarchy $ unionType t1 h2 <- mapM hierarchy $ unionType t2 @@ -173,7 +173,7 @@ -- C : A -- Outputs: -- the resulting type is: A, and the type combination is valid -getIfThenElseType t1 t2 = +getIfThenElseType t1 t2 = do h1 <- mapM hierarchy $ unionType t1 h2 <- mapM hierarchy $ unionType t2 @@ -181,15 +181,15 @@ return $ fromUnionType ut where commonHierarchy h1 h2 = filterClafer $ commonHierarchy' (reverse h1) (reverse h2) Nothing - commonHierarchy' (x:xs) (y:ys) accumulator = - if (x == y) - then - if (null xs || null ys) + commonHierarchy' (x:xs) (y:ys) accumulator = + if (x == y) + then + if (null xs || null ys) then Just x - else commonHierarchy' xs ys $ Just x + else commonHierarchy' xs ys $ Just x else accumulator - commonHierarchy' _ _ _ = error "Function commonHierarchy' from ResolverType expects two non empty lists but was given at least one empty list!" -- Should never happen - filterClafer value = + commonHierarchy' _ _ _ = error "Function commonHierarchy' from ResolverType expects two non empty lists but was given at least one empty list!" -- Should never happen + filterClafer value = if (value == Just "clafer") then Nothing else value resolveTModule :: (IModule, GEnv) -> Either ClaferSErr IModule @@ -198,7 +198,7 @@ Right mDecls' -> return imodule{_mDecls = mDecls'} Left err -> throwError err where - analysis decls1 = mapM (resolveTElement $ rootUid) decls1 + analysis decls1 = mapM (resolveTElement rootIdent) decls1 resolveTElement :: String -> IElement -> TypeAnalysis IElement resolveTElement _ (IEClafer iclafer) = @@ -217,14 +217,14 @@ IEGoal isMaximize' <$> resolveTConstraint parent' pexp' resolveTConstraint :: String -> PExp -> TypeAnalysis PExp -resolveTConstraint curThis' constraint = +resolveTConstraint curThis' constraint = do curThis'' <- claferWithUid curThis' head <$> (localCurThis curThis'' $ (resolveTPExp constraint :: TypeAnalysis [PExp])) - + resolveTPExp :: PExp -> TypeAnalysis [PExp] -resolveTPExp p = +resolveTPExp p = do x <- resolveTPExp' p case partitionEithers x of @@ -258,7 +258,7 @@ addRef result -- Case 2: Dereference the sident 1..* times Nothing -> throwError $ SemanticErr _inPos "Cannot parent at the start of a path" resolveTPExp' p@PExp{_exp = IClaferId{_sident = "integer"}} = runListT $ runErrorT $ return $ p `withType` TInteger -resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident}} = +resolveTPExp' p@PExp{_inPos, _exp = IClaferId{_sident}} = runListT $ runErrorT $ do curPath' <- curPath sident' <- if _sident == "this" then uid <$> curThis else return _sident @@ -269,8 +269,8 @@ return result -- Case 1: Use the sident <++> addRef result -- Case 2: Dereference the sident 1..* times - - + + resolveTPExp' p@PExp{_inPos, _exp} = runListT $ runErrorT $ do (iType', exp') <- ErrorT $ ListT $ resolveTExp _exp @@ -304,7 +304,7 @@ localCurPath (typeOf arg1') $ do arg2' <- liftError $ lift $ ListT $ resolveTPExp arg2 return (fromJust $ _iType arg2', e{_exps = [arg1', arg2']}) - + resolveTExp e@IFunExp {_op = "++", _exps = [arg1, arg2]} = do arg1s' <- resolveTPExp arg1 @@ -346,7 +346,7 @@ result' <- result return (result', e{_exps = [arg1', arg2']}) - resolveTExp e@(IFunExp "=>else" [arg1, arg2, arg3]) = + resolveTExp e@(IFunExp "ifthenelse" [arg1, arg2, arg3]) = runListT $ runErrorT $ do arg1' <- lift $ ListT $ resolveTPExp arg1 arg2' <- lift $ ListT $ resolveTPExp arg2 @@ -366,7 +366,7 @@ Nothing -> throwError $ SemanticErr _inPos ("Function '=>else' cannot be performed on if '" ++ str t1 ++ "' then '" ++ str t2 ++ "' else '" ++ str t3 ++ "'") return (t, e{_exps = [arg1', arg2', arg3']}) - + resolveTExp e@IDeclPExp{_oDecls, _bpexp} = runListT $ runErrorT $ do oDecls' <- mapM resolveTDecl _oDecls @@ -379,7 +379,7 @@ do body' <- lift $ ListT $ resolveTPExp _body return $ d{_body = body'} - + resolveTExp e = error $ "Unknown iexp: " ++ show e -- Adds "refs" at the end, effectively dereferencing Clafers when needed. @@ -387,12 +387,12 @@ addRef pexp = do localCurPath (typeOf pexp) $ do - deref <- (ErrorT $ ListT $ resolveTPExp' $ newPExp $ IClaferId "" "ref" False) `catchError` const (lift mzero) + deref <- (ErrorT $ ListT $ resolveTPExp' $ newPExp $ IClaferId "" "ref" False Nothing) `catchError` const (lift mzero) let result = (newPExp $ IFunExp "." [pexp, deref]) `withType` typeOf deref return result <++> addRef result where newPExp = PExp Nothing "" $ _inPos pexp - + typeOf :: PExp -> IType typeOf pexp = fromMaybe (error "No type") $ _iType pexp
src/Language/Clafer/Intermediate/ScopeAnalysis.hs view
@@ -26,8 +26,8 @@ import Language.Clafer.Intermediate.GLPKScopeAnalyzer import Language.Clafer.Intermediate.SimpleScopeAnalyzer --- | Return an appropriate scope analysis for a given strategy +-- | Return an appropriate scope analysis for a given strategy getScopeStrategy :: ScopeStrategy -> IModule -> [(String, Integer)] getScopeStrategy Simple = simpleScopeAnalysis -getScopeStrategy Full = glpkScopeAnalysis -getScopeStrategy _ = const []+getScopeStrategy Full = glpkScopeAnalysis +getScopeStrategy _ = const []
src/Language/Clafer/Intermediate/SimpleScopeAnalyzer.hs view
@@ -21,7 +21,7 @@ -} module Language.Clafer.Intermediate.SimpleScopeAnalyzer (simpleScopeAnalysis) where -import Language.Clafer.Common +import Control.Applicative ((<$>)) import Control.Lens hiding (elements, assign) import Data.Graph import Data.List @@ -30,36 +30,26 @@ import Data.Maybe import Data.Ord import Data.Ratio -import Language.Clafer.Intermediate.Intclafer import Prelude hiding (exp) - -isReference :: IClafer -> Bool -isReference = _isOverlapping . _super -isConcrete :: IClafer -> Bool -isConcrete = not . isReference -isSuperest :: [IClafer] -> IClafer -> Bool -isSuperest clafers clafer = isNothing $ directSuper clafers clafer - +import Language.Clafer.Common +import Language.Clafer.Intermediate.Intclafer -- | Collects the global cardinality and hierarchy information into proper, not necessarily lower, bounds. simpleScopeAnalysis :: IModule -> [(String, Integer)] -simpleScopeAnalysis IModule{_mDecls = decls'} = - [(a, b) | (a, b) <- finalAnalysis, isReferenceOrSuper a, b /= 1] +simpleScopeAnalysis iModule@IModule{_mDecls = decls'} = + [(a, b) | (a, b) <- finalAnalysis, b /= 1] where + uidClaferMap = createUidIClaferMap iModule + findClafer :: UID -> IClafer + findClafer uid' = fromJust $ findIClafer uidClaferMap uid' + finalAnalysis = Map.toList $ foldl analyzeComponent supersAndRefsAnalysis connectedComponents - - isReferenceOrSuper uid' = - isConcrete clafer || isReference clafer || isSuperest clafers clafer - where - clafer = findClafer uid' - - isConcrete' uid' = isConcrete $ findClafer uid' - + upperCards u = Map.findWithDefault (error $ "No upper cardinality for clafer named \"" ++ u ++ "\".") u upperCardsMap upperCardsMap = Map.fromList [(_uid c, snd $ fromJust $ _card c) | c <- clafers] - + supersAnalysis = foldl (analyzeSupers clafers) Map.empty decls' supersAndRefsAnalysis = foldl (analyzeRefs clafers) supersAnalysis decls' constraintAnalysis = analyzeConstraints constraints upperCards @@ -67,20 +57,19 @@ connectedComponents = analyzeDependencies clafers clafers = concatMap findClafers decls' constraints = concatMap findConstraints decls' - findClafer uid' = fromJust $ find (isEqClaferId uid') clafers - + lowerOrUpperFixedCard analysis' clafer = maximum [cardLb, cardUb, lowFromConstraints, oneForStar, targetScopeForStar ] where Just (cardLb, cardUb) = _card clafer oneForStar = if (cardLb == 0 && cardUb == -1) then 1 else 0 - targetScopeForStar = if (isReference clafer && cardUb == -1) - then case (directSuper clafers clafer) of - (Just targetClafer) -> Map.findWithDefault 0 (_uid targetClafer) analysis' - Nothing -> 0 + targetScopeForStar = if ((isJust $ _reference clafer) && cardUb == -1) + then case getReference clafer of + [ref'] -> Map.findWithDefault 1 (fromMaybe "unknown" $ _uid <$> findIClafer uidClaferMap ref' ) analysis' + _ -> 0 else 0 lowFromConstraints = Map.findWithDefault 0 (_uid clafer) constraintAnalysis - + analyzeComponent analysis' component = case flattenSCC component of [uid'] -> analyzeSingleton uid' analysis' @@ -91,7 +80,7 @@ assume = foldr (`Map.insert` 1) analysis' uids where analyzeSingleton uid' analysis'' = analyze analysis'' $ findClafer uid' - + analyze :: Map String Integer -> IClafer -> Map String Integer analyze analysis' clafer = -- Take the max between the supers and references analysis and this analysis @@ -100,8 +89,8 @@ scope | _isAbstract clafer = sum subclaferScopes | otherwise = parentScope * (lowerOrUpperFixedCard analysis' clafer) - - subclaferScopes = map (findOrError " subclafer scope not found" analysis') $ filter isConcrete' subclafers + + subclaferScopes = map (findOrError " subclafer scope not found" analysis') subclafers parentScope = case parentMaybe of Just parent'' -> findOrError " parent scope not found" analysis' parent'' @@ -110,33 +99,33 @@ parentMaybe = Map.lookup (_uid clafer) parentMap rootScope = 1 findOrError message m key = Map.findWithDefault (error $ key ++ message) key m - -analyzeSupers :: [IClafer] -> Map String Integer -> IElement -> Map String Integer + +analyzeSupers :: [IClafer] -> Map String Integer -> IElement -> Map String Integer analyzeSupers clafers analysis (IEClafer clafer) = foldl (analyzeSupers clafers) analysis' (_elements clafer) where (Just (cardLb, cardUb)) = _card clafer lowerOrFixedUpperBound = maximum [1, cardLb, cardUb ] - analysis' = if (isReference clafer) + analysis' = if (isJust $ _reference clafer) then analysis else case (directSuper clafers clafer) of (Just c) -> Map.alter (incLB lowerOrFixedUpperBound) (_uid c) analysis - Nothing -> analysis + Nothing -> analysis incLB lb' Nothing = Just lb' incLB lb' (Just lb) = Just (lb + lb') analyzeSupers _ analysis _ = analysis -analyzeRefs :: [IClafer] -> Map String Integer -> IElement -> Map String Integer +analyzeRefs :: [IClafer] -> Map String Integer -> IElement -> Map String Integer analyzeRefs clafers analysis (IEClafer clafer) = foldl (analyzeRefs clafers) analysis' (_elements clafer) where (Just (cardLb, cardUb)) = _card clafer lowerOrFixedUpperBound = maximum [1, cardLb, cardUb] - analysis' = if (isReference clafer) + analysis' = if (isJust $ _reference clafer) then case (directSuper clafers clafer) of (Just c) -> Map.alter (maxLB lowerOrFixedUpperBound) (_uid c) analysis Nothing -> analysis - else analysis + else analysis maxLB lb' Nothing = Just lb' maxLB lb' (Just lb) = Just (max lb lb') analyzeRefs _ analysis _ = analysis @@ -152,7 +141,7 @@ ISome -> True _ -> False isOneOrSomeConstraint _ = False - + -- Only considers how quantifiers affect scope. Other types of constraints are not considered. -- Constraints of the type [some path1.path2] or [no path1.path2], etc. analyzeConstraint PExp{_exp = IDeclPExp{_oDecls = [], _bpexp = bpexp'}} analysis = @@ -160,7 +149,7 @@ where path' = dropThisAndParent $ unfoldJoins bpexp' atLeastOne = Map.insertWith max `flip` 1 - + -- Constraints of the type [all disj a : path1.path2] or [some b : path3.path4], etc. analyzeConstraint PExp{_exp = IDeclPExp{_oDecls = decls'}} analysis = foldr analyzeDecl analysis decls' @@ -175,9 +164,9 @@ -- "disj a;b;c" implies at least 3 whereas "a;b;c" implies at least one. minScope = if isDisj' then fromIntegral $ length decls' else 1 insert' = Map.insertWith max - + scores = assign path' minScope - + {- - abstract Z - C * @@ -193,7 +182,7 @@ -- b) Make the effective lower cardinality of C=1 and D=4 -- c) Some other combination. -- Choose b, a greedy algorithm that starts from the lowest child progressing upwards. - + {- - abstract Z - C * @@ -219,9 +208,9 @@ pDesireScore = ceiling (score % psScore) pMaxScore = upperCards p pScore = min' pDesireScore pMaxScore - + min' a b = if b == -1 then a else min a b - + -- The each child has at most one parent. No matter what the path in a quantifier -- looks like, we ignore the parent parts. dropThisAndParent = dropWhile (== "parent") . dropWhile (== "this") @@ -242,7 +231,7 @@ -- clafers with no dependencies will not appear in the result. selfDependency = (_uid clafer, _uid clafer) superDependency - | isReference clafer = Nothing + | isNothing $ _super clafer = Nothing | otherwise = do super' <- directSuper clafers clafer @@ -250,21 +239,21 @@ return (_uid super', _uid clafer) -- Need to analyze clafer before its children childDependencies = [(_uid child, _uid clafer) | child <- childClafers clafer] - + analyzeHierarchy :: [IClafer] -> (Map String [String], Map String String) analyzeHierarchy clafers = foldl hierarchy (Map.empty, Map.empty) clafers where hierarchy (subclaferMap, parentMap) clafer = (subclaferMap', parentMap') where - subclaferMap' = + subclaferMap' = case super' of Just super'' -> Map.insertWith (++) (_uid super'') [_uid clafer] subclaferMap Nothing -> subclaferMap super' = directSuper clafers clafer parentMap' = foldr (flip Map.insert $ _uid clafer) parentMap (map _uid $ childClafers clafer) - + directSuper :: [IClafer] -> IClafer -> Maybe IClafer directSuper clafers clafer = second $ findHierarchy getSuper clafers clafer @@ -272,8 +261,8 @@ second [] = Nothing second [_] = Nothing second (_:x:_) = Just x - + -- Finds all ancestors findClafers :: IElement -> [IClafer] findClafers (IEClafer clafer) = clafer : concatMap findClafers (_elements clafer) @@ -289,7 +278,7 @@ -- Finds all the direct ancestors (ie. children) childClafers :: IClafer -> [IClafer] childClafers clafer = clafer ^.. elements.traversed.iClafer - + -- Unfold joins -- If the expression is a tree of only joins, then this function will flatten -- the joins into a list.
src/Language/Clafer/Intermediate/StringAnalyzer.hs view
@@ -41,8 +41,8 @@ astrClafer :: MonadState (Map.Map String Int) m => IClafer -> m IClafer -astrClafer (IClafer s isAbs gcrd ident' uid' super' crd gCard es) = - IClafer s isAbs gcrd ident' uid' super' crd gCard `liftM` mapM astrElement es +astrClafer (IClafer s isAbs gcrd' ident' uid' puid' super' reference' crd' gCard es) = + IClafer s isAbs gcrd' ident' uid' puid' super' reference' crd' gCard `liftM` mapM astrElement es -- astrs single subclafer @@ -68,4 +68,4 @@ modify (\e -> Map.insertWith (flip const) str (Map.size e) e) st <- get return $ (IInt $ toInteger $ (Map.!) st str) - _ -> return x+ _ -> return x
src/Language/Clafer/Intermediate/Tracing.hs view
@@ -27,7 +27,7 @@ import Language.Clafer.Intermediate.Intclafer traceIrModule :: IModule -> Map Span [Ir] --Map Span [Union (IRClafer IClafer) (IRPExp PExp)] -traceIrModule = foldMapIR getMap +traceIrModule = foldMapIR getMap where insert :: Span -> Ir -> Map Span [Ir] -> Map Span [Ir] insert k a = Map.insertWith (++) k [a] @@ -54,7 +54,7 @@ i (AstElements a) = getSpan a i (AstElement a) = getSpan a i (AstSuper a) = getSpan a - i (AstSuperHow a) = getSpan a + i (AstReference a) = getSpan a i (AstInit a) = getSpan a i (AstInitHow a) = getSpan a i (AstGCard a) = getSpan a @@ -71,17 +71,17 @@ i (AstLocId a) = getSpan a traverseModule :: Module -> [Ast] -traverseModule x@(Module _ d) = AstModule x : concatMap traverseDeclaration d +traverseModule x@(Module _ d) = AstModule x : concatMap traverseDeclaration d traverseDeclaration :: Declaration -> [Ast] traverseDeclaration x = AstDeclaration x : case x of - EnumDecl _ _ e -> concatMap traverseEnumId e - ElementDecl _ e -> traverseElement e + EnumDecl _ _ e -> concatMap traverseEnumId e + ElementDecl _ e -> traverseElement e traverseClafer :: Clafer -> [Ast] -traverseClafer x@(Clafer _ a b _ d e f g) = AstClafer x : (traverseAbstract a ++ traverseGCard b ++ traverseSuper d ++ traverseCard e ++ traverseInit f ++ traverseElements g) +traverseClafer x@(Clafer _ a b _ d r e f g) = AstClafer x : (traverseAbstract a ++ traverseGCard b ++ traverseSuper d ++ traverseReference r ++ traverseCard e ++ traverseInit f ++ traverseElements g) traverseConstraint :: Constraint -> [Ast] traverseConstraint x@(Constraint _ e) = AstConstraint x : concatMap traverseExp e @@ -118,11 +118,15 @@ AstSuper x : case x of SuperEmpty _ -> [] - SuperSome _ sh se -> traverseSuperHow sh ++ traverseSetExp se + SuperSome _ se -> traverseSetExp se -traverseSuperHow :: SuperHow -> [Ast] -traverseSuperHow x = - AstSuperHow x : [{- no other children -}] +traverseReference :: Reference -> [Ast] +traverseReference x = + AstReference x : + case x of + ReferenceEmpty _ -> [] + ReferenceSet _ se -> traverseSetExp se + ReferenceBag _ se -> traverseSetExp se traverseInit :: Init -> [Ast] traverseInit x = @@ -203,7 +207,7 @@ EDouble _ _ -> [] EStr _ _ -> [] ESetExp _ s -> traverseSetExp s - _ -> error "Invalid argument given to function traverseExp from Tracing" + _ -> error "Invalid argument given to function traverseExp from Tracing" traverseSetExp :: SetExp -> [Ast] traverseSetExp x = @@ -217,7 +221,7 @@ Range _ s1 s2 -> traverseSetExp s1 ++ traverseSetExp s2 Join _ s1 s2 -> traverseSetExp s1 ++ traverseSetExp s2 ClaferId _ n -> traverseName n - + traverseDecl :: Decl -> [Ast] traverseDecl x@(Decl _ l s) = AstDecl x : (concatMap traverseLocId l ++ traverseSetExp s) @@ -234,7 +238,7 @@ traverseLocId :: LocId -> [Ast] traverseLocId _ = [] - + data Ast = AstModule Module | AstDeclaration Declaration | @@ -246,7 +250,7 @@ AstElements Elements | AstElement Element | AstSuper Super | - AstSuperHow SuperHow | + AstReference Reference | AstInit Init | AstInitHow InitHow | AstGCard GCard | @@ -261,4 +265,4 @@ AstEnumId EnumId | AstModId ModId | AstLocId LocId - deriving (Eq, Show)+ deriving (Eq, Show)
src/Language/Clafer/Intermediate/Transformer.hs view
@@ -34,10 +34,10 @@ transElement :: IElement -> IElement transElement (IEClafer clafer) = IEClafer $ transClafer clafer transElement (IEConstraint isHard' pexp) = IEConstraint isHard' $ transPExp False pexp -transElement (IEGoal isMaximize' pexp) = IEGoal isMaximize' $ transPExp False pexp +transElement (IEGoal isMaximize' pexp) = IEGoal isMaximize' $ transPExp False pexp transClafer :: IClafer -> IClafer -transClafer = I.elements . traversed %~ transElement +transClafer = I.elements . traversed %~ transElement transPExp :: Bool -> PExp -> PExp transPExp True pexp'@(PExp iType' _ _ _) = desugarPath $ I.exp %~ transIExp (fromJust $ iType') $ pexp' @@ -47,7 +47,7 @@ transIExp _ idpe@(IDeclPExp _ _ _) = bpexp %~ transPExp False $ idpe transIExp iType' ife@(IFunExp op' _) = exps . traversed %~ transPExp cond $ ife where - cond = op' == iIfThenElse && + cond = op' == iIfThenElse && iType' `elem` [TBoolean, TClafer []] transIExp _ iexp' = iexp'
src/Language/Clafer/JSONMetaData.hs view
@@ -28,7 +28,7 @@ writeCfrScopeFile, readCfrScopeFile ) - + where import Control.Lens hiding (element) @@ -46,16 +46,16 @@ -- | Generate a JSON list of triples containing a fully-qualified-, least-partially-qualified name, and unique id. -- | Both the FQNames and UIDs are brittle. LPQNames are the least brittle. generateJSONnameUIDMap :: QNameMaps -> String -generateJSONnameUIDMap qNameMaps = - prettyPrintJSON $ convertString $ toJsonBS $ foldl generateQNameUIDArrayEntry mempty sortedTriples +generateJSONnameUIDMap qNameMaps = + prettyPrintJSON $ convertString $ toJsonBS $ foldl generateQNameUIDArrayEntry mempty sortedTriples where sortedTriples :: [(FQName, PQName, UID)] sortedTriples = List.sortBy (\(fqName1, _, _) (fqName2, _, _) -> compare fqName1 fqName2) $ getQNameUIDTriples qNameMaps generateQNameUIDArrayEntry :: Array -> (FQName, PQName, UID) -> Array -generateQNameUIDArrayEntry array (fqName, lpqName, uid) = - mappend array $ element $ mconcat [ - row ("fqName" :: String) fqName, +generateQNameUIDArrayEntry array (fqName, lpqName, uid) = + mappend array $ element $ mconcat [ + row ("fqName" :: String) fqName, row ("lpqName" :: String) lpqName, row ("uid" :: String) uid ] @@ -70,8 +70,8 @@ generateLpqNameScopeArrayEntry :: Array -> (PQName, Integer) -> Array -generateLpqNameScopeArrayEntry array (lpqName, scope) = - mappend array $ element $ mconcat [ +generateLpqNameScopeArrayEntry array (lpqName, scope) = + mappend array $ element $ mconcat [ row ("lpqName" :: String) lpqName, row ("scope" :: String) scope ] @@ -87,21 +87,21 @@ prettyPrintJSON (c:line) = c:(prettyPrintJSON line) prettyPrintJSON "" = "" --- | given the QNameMaps, parse the JSON scopes and return list of scopes +-- | given the QNameMaps, parse the JSON scopes and return list of scopes parseJSONScopes :: QNameMaps -> String -> [ (UID, Integer) ] -parseJSONScopes qNameMaps scopesJSON = +parseJSONScopes qNameMaps scopesJSON = foldl (\uidScopes qScope -> (qNameToUIDs qScope) ++ uidScopes) [] decodedScopes where - -- QName + -- QName decodedScopes :: [ (T.Text, Integer) ] - decodedScopes = scopesJSON ^.. _Array . traverse + decodedScopes = scopesJSON ^.. _Array . traverse . to (\o -> ( o ^?! key "lpqName" . _String , o ^?! key "scope" . _Integer) ) -- a QName may resolve to potentially multiple UIDs qNameToUIDs :: (T.Text, Integer) -> [ (UID, Integer) ] qNameToUIDs (qName, scope) = if T.null qName - then [ ("", scope) ] + then [ ("", scope) ] else [ (uid, scope) | uid <- getUIDs qNameMaps $ convertString qName] -- | Write a .cfr-scope file @@ -117,7 +117,7 @@ let cfrScopeFileName = replaceExtension modelName ".cfr-scope" exists <- doesFileExist cfrScopeFileName - if exists + if exists then do scopesInJSON <- readFile cfrScopeFileName return $ Just $ parseJSONScopes qNameMaps scopesInJSON
src/Language/Clafer/Optimizer/Optimizer.hs view
@@ -24,6 +24,7 @@ import Data.Maybe import Data.List +import Control.Applicative ((<$>)) import Control.Lens hiding (elements, children, un) import Control.Monad.State import Data.Data.Lens (biplate) @@ -71,7 +72,7 @@ where unusedAbs = map IEClafer $ findUnusedAbs clafers $ map _uid $ filter (not._isAbstract) clafers - clafers = toClafers decls' + clafers = toClafers decls' getIClafer (IEClafer c) = c getIClafer _ = error "Function makeZeroUnusedAbs from Optimizer expected paramter of type IClafer got a differnt IElement" --This should never happen @@ -98,7 +99,7 @@ getExtended c = sName ++ ((getSubclafers $ _elements c) >>= getExtended) where - sName = if not $ _isOverlapping $ _super c then [getSuper c] else [] + sName = getSuper c -- ----------------------------------------------------------------------------- -- inheritance expansions @@ -108,15 +109,12 @@ expClafer :: MonadState GEnv m => IClafer -> m IClafer expClafer claf = do - super' <- expSuper $ _super claf + super' <- case _super claf of + Nothing -> return Nothing + (Just pexp') -> Just `liftM` expPExp pexp' elements' <- mapM expElement $ _elements claf return $ claf {_super = super', _elements = elements'} -expSuper :: MonadState GEnv m => ISuper -> m ISuper -expSuper x = case x of - ISuper False _ -> return x - ISuper True pexps -> ISuper True `liftM` mapM expPExp pexps - expElement :: MonadState GEnv m => IElement -> m IElement expElement x = case x of IEClafer claf -> IEClafer `liftM` expClafer claf @@ -134,7 +132,7 @@ return $ IDeclPExp quant' decls'' pexp' IFunExp op' exps' -> if op' == iJoin then expNav x else IFunExp op' `liftM` mapM expPExp exps' - IClaferId _ _ _ -> expNav x + IClaferId _ _ _ _ -> expNav x _ -> return x expDecl :: MonadState GEnv m => IDecl -> m IDecl @@ -148,12 +146,12 @@ return $ mkIFunExp iUnion $ map fst xs' expNav' :: MonadState GEnv m => String -> IExp -> m (IExp, String) -expNav' context (IFunExp _ (p0:p:_)) = do +expNav' context (IFunExp _ (p0:p:_)) = do (exp0', context') <- expNav' context $ _exp p0 (exp', context'') <- expNav' context' $ _exp p return (IFunExp iJoin [ p0 {_exp = exp0'} , p {_exp = exp'}], context'') -expNav' context x@(IClaferId modName' id' isTop') = do +expNav' context x@(IClaferId modName' id' isTop' bind' ) = do st <- gets stable if Map.member id' st then do @@ -161,48 +159,40 @@ let (impls', context') = maybe (impls, "") (\y -> ([[head y]], head y)) $ find (\z -> context == (head.tail) z) impls - return (mkIFunExp iUnion $ map (\u -> IClaferId modName' u isTop') $ + return (mkIFunExp iUnion $ map (\u -> IClaferId modName' u isTop' bind') $ map head impls', context') else do return (x, id') expNav' _ _ = error "Function expNav' from Optimizer expects an argument of type ClaferId or IFunExp but was given another IExp" -split' :: MonadState GEnv m => IExp -> (IExp -> m IExp) -> m [IExp] +split' :: MonadState GEnv m => IExp -> (IExp -> m IExp) -> m [IExp] split'(IFunExp _ (p:pexp:_)) f = split' (_exp p) (\s -> f $ IFunExp iJoin [p {_exp = s}, pexp]) -split' (IClaferId modName' id' isTop') f = do +split' (IClaferId modName' id' isTop' bind') f = do st <- gets stable - mapM f $ map (\y -> IClaferId modName' y isTop') $ maybe [id'] (map head) $ Map.lookup id' st + mapM f $ map (\y -> IClaferId modName' y isTop' bind') $ maybe [id'] (map head) $ Map.lookup id' st split' _ _ = error "Function split' from Optimizer expects an argument of type ClaferId or IFunExp but was given another IExp" -- ----------------------------------------------------------------------------- -- checking if all clafers have unique names and don't extend other clafers allUnique :: IModule -> Bool -allUnique imodule = and un && (null $ - filter (\xs -> 1 < length xs) $ group $ sort $ concat idents) && identsOk - where - (un, idents) = unzip $ map allUniqueElement $ _mDecls imodule - identsOk = and $ map (checkConstraintElement (concat idents)) $ _mDecls imodule - -allUniqueClafer :: IClafer -> (Bool, [String]) -allUniqueClafer claf = - (getSuper claf `elem` "clafer" : primitiveTypes && and un, - _ident claf : concat idents) +allUnique iModule = dontExtend && identsUnique where - (un, idents) = unzip $ map allUniqueElement $ _elements claf + allClafers :: [ IClafer ] + allClafers = universeOn biplate iModule -allUniqueElement :: IElement -> (Bool, [String]) -allUniqueElement x = case x of - IEClafer claf -> allUniqueClafer claf - IEConstraint _ _ -> (True, []) - IEGoal _ _ -> (True, []) + -- True when getSuper always returns Nothing and therefore concatMap returned [] + dontExtend = null $ concatMap getSuper allClafers + allIdents = map _ident allClafers + -- all idents are unique when nub cannot remove any duplicates + identsUnique = (length allIdents) == (length $ nub allIdents) checkConstraintElement :: [String] -> IElement -> Bool checkConstraintElement idents x = case x of IEClafer claf -> and $ map (checkConstraintElement idents) $ _elements claf - IEConstraint _ pexp -> checkConstraintPExp idents pexp + IEConstraint _ pexp -> checkConstraintPExp idents pexp IEGoal _ _ -> True checkConstraintPExp :: [String] -> PExp -> Bool @@ -212,7 +202,7 @@ checkConstraintIExp idents x = case x of IDeclPExp _ oDecls' pexp -> checkConstraintPExp ((oDecls' >>= (checkConstraintIDecl idents)) ++ idents) pexp - IClaferId _ ident' _ -> if ident' `elem` (specialNames ++ idents) then True + IClaferId _ ident' _ _ -> if ident' `elem` (specialNames ++ (rootIdent : idents)) then True else error $ "optimizer: " ++ ident' ++ " not found" _ -> True @@ -226,7 +216,7 @@ findDupModule args iModule = if check_duplicates args && (not $ null dups) then Left $ ClaferErr $ "--check-duplicates: Duplicate clafer names: " ++ (intercalate ", " dups) else Right iModule - where + where allClafers :: [ IClafer ] allClafers = universeOn biplate iModule dups = findDuplicates allClafers @@ -240,20 +230,16 @@ markTopModule :: [IElement] -> [IElement] markTopModule decls' = map (markTopElement ( - [this, parent, children, strType, intType, integerType] ++ + specialNames ++ primitiveTypes ++ (map _uid $ toClafers decls'))) decls' markTopClafer :: [String] -> IClafer -> IClafer markTopClafer clafers c = - c {_super = markTopSuper clafers $ _super c, + c {_super = markTopPExp clafers <$> _super c, _elements = map (markTopElement clafers) $ _elements c} -markTopSuper :: [String] -> ISuper -> ISuper -markTopSuper clafers x = x{_supers = map (markTopPExp clafers) $ _supers x} - - markTopElement :: [String] -> IElement -> IElement markTopElement clafers x = case x of IEClafer c -> IEClafer $ markTopClafer clafers c @@ -270,8 +256,8 @@ IDeclPExp quant' decl pexp -> IDeclPExp quant' (map (markTopDecl clafers) decl) (markTopPExp ((decl >>= _decls) ++ clafers) pexp) IFunExp op' exps' -> IFunExp op' $ map (markTopPExp clafers) exps' - IClaferId modName' sident' _ -> - IClaferId modName' sident' $ sident' `elem` clafers + IClaferId modName' sident' _ bind'-> + IClaferId modName' sident' (sident' `elem` clafers) bind' _ -> x
src/Language/Clafer/QNameUID.hs view
@@ -23,16 +23,16 @@ module Language.Clafer.QNameUID ( QName, FQName, - PQName, + PQName, QNameMaps, UID, deriveQNameMaps, getUIDs, getFQName, getLPQName, - getQNameUIDTriples + getQNameUIDTriples ) - + where import Data.Maybe @@ -54,7 +54,7 @@ -- | partially-qualified name, must not begin with :: -- | e.g., `Person::name`, `chair` -type PQName = String +type PQName = String -- a map from reversed FQName (FQKey) to UID type FQNameUIDMap = SMap.StringMap UID @@ -71,19 +71,19 @@ -- | get the fully-qualified name of a clafer given its UID getFQName :: QNameMaps -> UID -> Maybe FQName -getFQName (QNameMaps _ uidFqNameMap _) uid' = Map.lookup uid' uidFqNameMap +getFQName (QNameMaps _ uidFqNameMap _) uid' = Map.lookup uid' uidFqNameMap -- | get the least-partially-qualified name of a clafer given its UID getLPQName :: QNameMaps -> UID -> Maybe PQName -getLPQName (QNameMaps _ _ uidLpqNameMap) uid' = Map.lookup uid' uidLpqNameMap +getLPQName (QNameMaps _ _ uidLpqNameMap) uid' = Map.lookup uid' uidLpqNameMap -- | derive maps between fully-, partially-qualified names, and UIDs deriveQNameMaps :: IModule -> QNameMaps -deriveQNameMaps iModule = +deriveQNameMaps iModule = let (fqNameUIDMap, uidFqNameMap) = deriveFQNameUIDMaps iModule uidLpqNameMap = deriveUidLpqNameMap fqNameUIDMap - in + in QNameMaps fqNameUIDMap uidFqNameMap uidLpqNameMap deriveFQNameUIDMaps :: IModule -> (FQNameUIDMap, UIDFqNameMap) @@ -93,22 +93,22 @@ addElements path elems maps = foldl (addClafer path) maps elems addClafer :: [String] -> (FQNameUIDMap, UIDFqNameMap) -> IElement -> (FQNameUIDMap, UIDFqNameMap) -addClafer path (fqNameUIDMap, uidFqNameMap) (IEClafer iClaf) = - let - newPath = (_ident iClaf) : path +addClafer path (fqNameUIDMap, uidFqNameMap) (IEClafer iClaf) = + let + newPath = (_ident iClaf) : path fqKey :: FQKey fqKey = concat newPath fqName :: FQName fqName = getQNameFromKey fqKey fqNameUIDMap' = SMap.insert fqKey (_uid iClaf) fqNameUIDMap uidFqNameMap' = Map.insert (_uid iClaf) fqName uidFqNameMap - in + in addElements ("::" : newPath) (_elements iClaf) (fqNameUIDMap', uidFqNameMap') addClafer _ maps _ = maps findUIDsByFQName :: FQNameUIDMap -> FQName -> [ UID ] findUIDsByFQName fqNameUIDMap fqName@(':':':':_) = SMap.lookup (getFQKey fqName) fqNameUIDMap -findUIDsByFQName fqNameUIDMap fqName = SMap.prefixFind (getFQKey fqName) fqNameUIDMap +findUIDsByFQName fqNameUIDMap fqName = SMap.prefixFind (getFQKey fqName) fqNameUIDMap reverseOnQualifier :: FQName -> FQName reverseOnQualifier fqName = concat $ reverse $ split (onSublist "::") fqName @@ -120,11 +120,11 @@ getQNameFromKey = reverseOnQualifier deriveUidLpqNameMap :: FQNameUIDMap -> UIDLpqNameMap -deriveUidLpqNameMap fqNameUIDMap = +deriveUidLpqNameMap fqNameUIDMap = SMap.foldrWithKey (generateUIDLpqMapEntry fqNameUIDMap) Map.empty fqNameUIDMap generateUIDLpqMapEntry :: FQNameUIDMap -> SMap.Key -> UID -> UIDLpqNameMap -> UIDLpqNameMap -generateUIDLpqMapEntry fqNameUIDMap fqKey uid' uidLpqNameMap = +generateUIDLpqMapEntry fqNameUIDMap fqKey uid' uidLpqNameMap = Map.insert uid' lpqName uidLpqNameMap where -- need to reverse the key to get a fully qualified name @@ -145,12 +145,12 @@ -- handle partially qualified name case findLeastQualifiedName pqName fqNameUIDMap' = let - -- remove one segment of qualification + -- remove one segment of qualification lessQName = concat $ drop 2 $ split (onSublist "::") pqName - in + in if (length (findUIDsByFQName fqNameUIDMap' lessQName) > 1) then pqName - else findLeastQualifiedName lessQName fqNameUIDMap' + else findLeastQualifiedName lessQName fqNameUIDMap' getQNameUIDTriples :: QNameMaps -> [(FQName, PQName, UID)] getQNameUIDTriples qNameMaps@(QNameMaps _ uidFqNameMap _) =
src/Language/Clafer/SplitJoin.hs view
@@ -50,4 +50,4 @@ f Quot ('\"':xs) = f Norm xs f Norm (x:xs) | isSpace x = Nothing : f Init xs f m (x:xs) = Just x : f m xs - f _ [] = []+ f _ [] = []
src/Language/ClaferT.hs view
@@ -25,41 +25,47 @@ This is in a separate module from the module "Language.Clafer" so that other modules that require ClaferEnv can just import this module without all the parsing/compiline/generating functionality. -} -module Language.ClaferT ( - ClaferEnv(..), - makeEnv, - getAst, - getIr, - ClaferM, - ClaferT, - CErr(..), - CErrs(..), - ClaferErr, - ClaferErrs, - ClaferSErr, - ClaferSErrs, - ErrPos(..), - PartialErrPos(..), - throwErrs, - throwErr, - catchErrs, - getEnv, - getsEnv, - modifyEnv, - putEnv, - runClafer, - runClaferT, - Throwable(..), - Span(..), - Pos(..) -) where +module Language.ClaferT + ( ClaferEnv(..) + , irModuleTrace + , uidIClaferMap + , parentIClaferMap + , makeEnv + , getAst + , getIr + , ClaferM + , ClaferT + , CErr(..) + , CErrs(..) + , ClaferErr + , ClaferErrs + , ClaferSErr + , ClaferSErrs + , ErrPos(..) + , PartialErrPos(..) + , throwErrs + , throwErr + , catchErrs + , getEnv + , getsEnv + , modifyEnv + , putEnv + , runClafer + , runClaferT + , Throwable(..) + , Span(..) + , Pos(..) + ) where import Control.Monad.Error import Control.Monad.State import Control.Monad.Identity +import Data.Data.Lens (biplate) +import Control.Lens ((^..), traversed, universeOn) import Data.List -import Data.Map (Map) import qualified Data.Map as Map +import Data.StringMap (StringMap) +import qualified Data.StringMap as SMap import Language.Clafer.Common import Language.Clafer.Front.Absclafer @@ -101,10 +107,44 @@ cAst :: Maybe Module, cIr :: Maybe (IModule, GEnv, Bool), frags :: [Pos], -- line numbers of fragment markers - irModuleTrace :: Map Span [Ir], - astModuleTrace :: Map Span [Ast] + astModuleTrace :: Map.Map Span [Ast] -- can keep the Ast map since it never changes } deriving Show +-- | This simulates a field in the ClaferEnv that will always recompute the map, +-- since the IR always changes and the map becomes obsolete +irModuleTrace :: ClaferEnv -> Map.Map Span [Ir] +irModuleTrace env = traceIrModule $ getIModule $ cIr env + where + getIModule (Just (imodule, _, _)) = imodule + getIModule Nothing = error "BUG: irModuleTrace: cannot request IR map before desugaring." + +-- | This simulates a field in the ClaferEnv that will always recompute the map, +-- since the IR always changes and the map becomes obsolete +-- maps from a UID to an IClafer with the given UID +uidIClaferMap :: ClaferEnv -> StringMap IClafer +uidIClaferMap env = createUidIClaferMap $ getIModule $ cIr env + where + getIModule (Just (iModule, _, _)) = iModule + getIModule Nothing = error "BUG: uidIClaferMap: cannot request IClafer map before desugaring." + +-- | This simulates a field in the ClaferEnv that will always recompute the map, +-- since the IR always changes and the map becomes obsolete +-- maps to an IClafer which is the parent of the clafer with the given UID +parentIClaferMap :: ClaferEnv -> StringMap IClafer +parentIClaferMap env = foldl' (\accumMap' claf -> (addChildren accumMap' claf)) SMap.empty allClafers + where + getIModule (Just (iModule, _, _)) = iModule + getIModule Nothing = error "BUG: parentIClaferMap: cannot request IClafer map before desugaring." + + allClafers :: [ IClafer ] + allClafers = universeOn biplate $ getIModule $ cIr env + + addChildren :: StringMap IClafer -> IClafer -> StringMap IClafer + addChildren accumMap'' parentClafer = + -- insert the parentClafer as a value for the uid of each child + foldl' (\accumMap''' uid' -> SMap.insert uid' parentClafer accumMap''') accumMap'' (parentClafer ^.. elements.traversed.iClafer.uid) + + getAst :: (Monad m) => ClaferT m Module getAst = do env <- getEnv @@ -119,15 +159,14 @@ (Just i) -> return i _ -> throwErr (ClaferErr "No IR. Did you forget to compile?" :: CErr Span) -- Indicates a bug in the Clafer translator. -makeEnv :: ClaferArgs -> ClaferEnv +makeEnv :: ClaferArgs -> ClaferEnv makeEnv args' = ClaferEnv { args = args'', modelFrags = [], cAst = Nothing, cIr = Nothing, frags = [], - irModuleTrace = Map.empty, astModuleTrace = Map.empty} - where + where args'' = if (CVLGraph `elem` (mode args') || Html `elem` (mode args') || Graph `elem` (mode args')) @@ -150,22 +189,22 @@ -- | Generate errors using throwErr/throwErrs: data CErr p = -- | Generic error - ClaferErr { + ClaferErr { msg :: String } | -- | Error generated by the parser - ParseErr { + ParseErr { -- | Position of the error - pos :: p, + pos :: p, msg :: String } | -- | Error generated by semantic analysis - SemanticErr { + SemanticErr { pos :: p, msg :: String } deriving Show - + -- | Clafer keeps track of multiple errors. data CErrs p = ClaferErrs {errs :: [CErr p]} @@ -173,10 +212,10 @@ instance Error (CErr p) where strMsg = ClaferErr - + instance Error (CErrs p) where strMsg m = ClaferErrs [strMsg m] - + data ErrPos = ErrPos { -- | The fragment where the error occurred. @@ -188,8 +227,8 @@ modelPos :: Pos } deriving Show - + -- | The full ErrPos requires lots of information that needs to be consistent. Every time we throw an error, -- | we need BOTH the (fragId, fragPos) AND modelPos. This makes it easier for developers using ClaferT so they -- | only need to provide part of the information and the rest is automatically calculated. The code using @@ -225,16 +264,16 @@ pModelSpan :: Span } deriving Show - + class ClaferErrPos p where toErrPos :: Monad m => p -> ClaferT m ErrPos - + instance ClaferErrPos Span where toErrPos = toErrPos . ErrModelSpan - + instance ClaferErrPos ErrPos where toErrPos = return . id - + instance ClaferErrPos PartialErrPos where toErrPos (ErrFragPos frgId frgPos) = do @@ -248,7 +287,7 @@ let fragSpans = zipWith Span (Pos 1 1 : f) f case findFrag modelPos' fragSpans of Just (frgId, Span fragStart _) -> return $ ErrPos frgId (modelPos' `minusPos` fragStart) modelPos' - Nothing -> error $ show modelPos' ++ " not within any frag spans: " ++ show fragSpans -- Indicates a bug in the Clafer translator + Nothing -> return $ ErrPos 1 noPos noPos -- error $ show modelPos' ++ " not within any frag spans: " ++ show fragSpans -- Indicates a bug in the Clafer translator where findFrag pos'' spans = find (inSpan pos'' . snd) (zip [0..] spans) @@ -256,14 +295,14 @@ class Throwable t where toErr :: t -> Monad m => ClaferT m ClaferErr - + instance ClaferErrPos p => Throwable (CErr p) where toErr (ClaferErr mesg) = return $ ClaferErr mesg toErr err = do pos' <- toErrPos $ pos err return $ err{pos = pos'} - + -- | Throw many errors. throwErrs :: (Monad m, Throwable t) => [t] -> ClaferT m a throwErrs throws =
test/Functions.hs view
@@ -38,14 +38,15 @@ checkClaferExt file' = if ((eman == "")) then False else (txe == "rfc") && (takeWhile (/='.') (tail eman) /= "esd") where (txe, eman) = span (/='.') (reverse file') - + compileOneFragment :: ClaferArgs -> InputModel -> Either [ClaferErr] (Map.Map ClaferMode CompilerResult) compileOneFragment args' model = - runClafer (argsWithOPTIONS args' model) $ + runClafer (argsWithOPTIONS args' model) $ do addModuleFragment model parse - compile + iModule <- desugar Nothing + compile iModule generate compiledCheck :: Either a b -> Bool @@ -61,4 +62,4 @@ fromRight (Left _) = error "Function fromLeft expects argument of the form 'Right b'" andMap :: (a -> Bool) -> [a] -> Bool -andMap f lst = and $ map f lst+andMap f lst = and $ map f lst
− test/Suite/Example.hs
@@ -1,110 +0,0 @@-{-# LANGUAGE TemplateHaskell #-} -{- - Copyright (C) 2013 Luke Brown <http://gsd.uwaterloo.ca> - - 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: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - 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. --} -module Suite.Example (tg_Test_Suite_Example) where - -import qualified Data.List as List -import qualified Data.Map as Map -import Data.Monoid -import Control.Monad -import Language.Clafer -import Language.Clafer.Css -import Test.Framework -import Test.Framework.TH -import Test.Framework.Providers.HUnit -import Test.Framework.Providers.QuickCheck2 -import Test.HUnit -import Test.QuickCheck -import Language.Clafer.ClaferArgs -import Control.Monad -import System.Directory -import System.IO -import Functions - -tg_Test_Suite_Example = $(testGroupGenerator) - -case_1 :: Assertion -case_1 = assertEqual "for luckynumber" "WIN!" (luckynumber 42) - -case_2 :: Assertion -case_2 = - do - let a = luckynumber 7 - assertEqual "for luckynumber" "WIN!" a - let b = (luckynumber 2) == (luckynumber 4) - assertBool ("Falied! Lucky number must be either 2 or 4") b - -case_3 = assertString "This will always fail :(" - -prop_4 :: [Int] -> Bool -prop_4 xs = reverse (reverse xs) == xs - -prop_5 :: [Int] -> Property -prop_5 xs = (length xs) >= 5 ==> (length (take 5 xs)) == 5 - where types = (xs :: [Int]) - -case_6 :: Assertion -case_6 = List.sort [1,8,6,5,3,9,0,2,4,10] @?= [0..9] - -case_7 = - do - False @? "Always fails =(" - True @? "You will never see this msg =D" - [0..9] @=? List.sort [1,8,6,5,3,9,0,2,4,10] - -case_8 = assertString "" - -prop_9 x = x >= 5 ==> - x <= 10 ==> - luckynumber x == "LOSE!" - where types = (x :: Int) - - -case_10 :: Assertion -case_10 = do - let e1 = fromRight $ fmap claferEnv $ compileOneFragment defaultClaferArgs "A" - let e2 = fromRight $ fmap claferEnv $ compileOneFragment defaultClaferArgs "B" - assertBool ("This shouldn't fail") (e1 == e1) - assertBool ("This should fail") (e1 == e2) - -case_11 :: Assertion -case_11 = do - clafers <- positiveClafers - getAll (List.foldr (\x -> mappend (All $ x==x)) (All True) clafers) @? "Error in one of clafers" - ---Example of generator -newtype ArbitraryClafer = ArbitraryClafer {getModel :: String} deriving Show - -instance Arbitrary ArbitraryClafer where - arbitrary = do - clafers <- getClafers "positive" - clafer <- elements clafers - return $ ArbitraryClafer clafer - - -prop_12 :: ArbitraryClafer -> Bool -prop_12 model = (getModel model) == (getModel model) - - -luckynumber :: Int -> Bool -luckynumber 7 = True -luckynumber _ = False
test/Suite/Negative.hs view
@@ -38,17 +38,17 @@ return $ filter ((`notElem` crashModels) . fst ) claferModels where crashModels = ["i127-loop.cfr", "i141-constraints.cfr"] -{-Put models in the list above that completly crash +{-Put models in the list above that completly crash the compiler, this will avoid crashing the test suite - Note: If the model is giving an unexpected error it + Note: If the model is giving an unexpected error it should be located in failing/negative not here!-} case_failTest :: Assertion -case_failTest = do +case_failTest = do claferModels <- negativeClaferModels - let compiledClafers = map (\(file', model) -> + let compiledClafers = map (\(file', model) -> (file', compileOneFragment defaultClaferArgs model)) claferModels - forM_ compiledClafers (\(file', compiled) -> + forM_ compiledClafers (\(file', compiled) -> when (compiledCheck compiled) $ putStrLn (file' ++ " compiled when it should not have.")) - (andMap (not . compiledCheck . snd) compiledClafers - @? "test/negative fail: The above clafer models compiled.")+ (andMap (not . compiledCheck . snd) compiledClafers + @? "test/negative fail: The above clafer models compiled.")
test/Suite/Positive.hs view
@@ -36,28 +36,28 @@ tg_Test_Suite_Positive :: TestTree tg_Test_Suite_Positive = $(testGroupGenerator) - + positiveClaferModels :: IO [(String, String)] positiveClaferModels = getClafers "test/positive" case_compileTest :: Assertion -case_compileTest = do +case_compileTest = do claferModels <- positiveClaferModels - let compiledClafers = map (\(file', model) -> + let compiledClafers = map (\(file', model) -> (file', compileOneFragment defaultClaferArgs model)) claferModels - forM_ compiledClafers (\(file', compiled) -> + forM_ compiledClafers (\(file', compiled) -> when (not $ compiledCheck compiled) $ putStrLn (file' ++ " Error: " ++ (show $ fromLeft compiled))) - (andMap (compiledCheck . snd) compiledClafers + (andMap (compiledCheck . snd) compiledClafers @? "test/positive fail: The above claferModels did not compile.") case_reference_Unused_Abstract_Clafer :: Assertion case_reference_Unused_Abstract_Clafer = do model <- readFile "test/positive/i235.cfr" - let compiledClafers = + let compiledClafers = [("None", compileOneFragment defaultClaferArgs{scope_strategy = None} model), ("Simple", compileOneFragment defaultClaferArgs{scope_strategy = Simple} model)] - forM_ compiledClafers (\(ss, compiled) -> + forM_ compiledClafers (\(ss, compiled) -> when (not $ compiledCheck compiled) $ putStrLn ("i235.cfr failed for scope_strategy = " ++ ss)) - (andMap (compiledCheck . snd) compiledClafers + (andMap (compiledCheck . snd) compiledClafers @? "reference_Unused_Abstract_Clafer (i235) failed, error for referencing unused abstract clafer") case_nonempty_cards :: Assertion @@ -70,7 +70,7 @@ (andMap ((==[]) . foldMapIR isEmptyCard . snd) compiledClafeIrs @? "nonempty card test failed. Files contain empty cardinalities after fully compiling") where - getIR (file', (Right (resultMap))) = + getIR (file', (Right (resultMap))) = case Map.lookup Alloy resultMap of Just CompilerResult{claferEnv = ClaferEnv{cIr = Just (iMod, _, _)}} -> [(file', iMod)] _ -> [] @@ -80,5 +80,5 @@ case_stringEqual :: Assertion case_stringEqual = do - let strMap = stringMap $ fromJust $ Map.lookup Alloy $ fromRight $ compileOneFragment defaultClaferArgs "A\n text1 : string = \"some text\"\n text2 : string = \"some text\"" - (Map.size strMap) == 1 @? "Error: same string assigned to differnet numbers!"+ let strMap = stringMap $ fromJust $ Map.lookup Alloy $ fromRight $ compileOneFragment defaultClaferArgs "A\n text1 -> string = \"some text\"\n text2 -> string = \"some text\"" + (Map.size strMap) == 1 @? "Error: same string assigned to differnet numbers!"
test/Suite/SimpleScopeAnalyser.hs view
@@ -37,9 +37,9 @@ tg_Test_Suite_SimpleScopeAnalyser :: TestTree tg_Test_Suite_SimpleScopeAnalyser = $(testGroupGenerator) - + model :: String -model = unlines +model = unlines [ "a 0..0" , "b ?" , "c" @@ -64,10 +64,18 @@ , "abstract F : H" , "f1 : F 2..5" , " m 0" + , "i1 -> integer 2..4" + , "i2 ->> integer ?" + , "i3 -> integer *" + , "i4 ->> integer *" + , "s1 -> string 2..*" + , "s2 ->> string" + , "s3 -> string +" + , "s4 ->> string +" ] expectedScopesSet :: M.Map UID Integer -expectedScopesSet = M.fromList $ [ ("c0_a", 0) +expectedScopesSet = M.fromList $ [ ("c0_a", 0) -- , ("c0_b", 1) -- uses global scope -- , ("c0_c", 1) -- uses global scope -- , ("c0_d", 1) -- uses global scope @@ -79,24 +87,32 @@ , ("c0_i", 22) , ("c0_j", 22) , ("c0_k", 44) - , ("c0_Hs", 16) -- not sure where the 16 comes from + , ("c0_Hs", 16) , ("c0_H1", 2) , ("c0_H12", 4) , ("c0_H2", 4) , ("c0_H3", 2) , ("c0_H4", 5) - , ("c0_Hs2", 16) -- not sure where the 16 comes from + , ("c0_Hs2", 16) , ("c0_Hs3", 8) , ("c0_l", 8) , ("c0_F", 5) , ("c0_f1", 5) , ("c0_m", 0) + , ("c0_i1", 4) + -- , ("c0_i2", 1) -- uses global scope + -- , ("c0_i3", 1) -- uses global scope + -- , ("c0_i4", 1) -- uses global scope + , ("c0_s1", 2) + -- , ("c0_s2", 1) -- uses global scope + -- , ("c0_s3", 1) -- uses global scope + -- , ("c0_s4", 1) -- uses global scope ] -- aggregates a difference aggregateDifference :: UID -> Integer -> Integer -> Maybe String -aggregateDifference k computedV expectedV = +aggregateDifference k computedV expectedV = if computedV == expectedV then Nothing else Just $ k ++ " | computed: " ++ show computedV ++ " | expected: " ++ show expectedV ++ " |" @@ -104,37 +120,37 @@ -- prints only computed scopes missing in expected onlyComputed :: M.Map UID Integer -> M.Map UID String onlyComputed = M.mapWithKey (\k v -> k ++ " | computed: " ++ show v ++ " | no expected |") - + -- prints only expected scopes missing in computed onlyExpected :: M.Map UID Integer -> M.Map UID String onlyExpected = M.mapWithKey (\k v -> k ++ " | no computed | expected: " ++ show v ++ " |") case_ScopeTest :: Assertion -case_ScopeTest = do - let - -- use simple scope inference +case_ScopeTest = do + let + -- use simple scope inference (Right compilerResultMap) = compileOneFragment defaultClaferArgs model (Just compilerResult) = M.lookup Alloy compilerResultMap computedScopesSet :: M.Map UID Integer computedScopesSet = M.fromList $ scopesList compilerResult - differences = M.mergeWithKey aggregateDifference onlyComputed onlyExpected computedScopesSet expectedScopesSet + differences = M.mergeWithKey aggregateDifference onlyComputed onlyExpected computedScopesSet expectedScopesSet - (M.size differences) == 0 @? + (M.size differences) == 0 @? "Computed scopes different from expected:\n" ++ (unlines $ M.foldl (\acc v -> v:acc) [] differences) case_ReadScopesJSON :: Assertion case_ReadScopesJSON = do let - -- use simple scope inference + -- use simple scope inference (Right compilerResultMap) = compileOneFragment defaultClaferArgs model (Just compilerResult) = M.lookup Alloy compilerResultMap Just (iModule, _, _) = cIr $ claferEnv compilerResult - + qNameMaps = deriveQNameMaps iModule - + computedScopes :: [ (UID, Integer) ] computedScopes = scopesList compilerResult @@ -143,5 +159,5 @@ differences = M.mergeWithKey aggregateDifference onlyComputed onlyExpected (M.fromList computedScopes) (M.fromList decodedScopes) - (M.size differences) == 0 @? - "Parsed scopes different from original:\n" ++ (unlines $ M.foldl (\acc v -> v:acc) [] differences)+ (M.size differences) == 0 @? + "Parsed scopes different from original:\n" ++ (unlines $ M.foldl (\acc v -> v:acc) [] differences)
test/test-suite.hs view
@@ -80,7 +80,7 @@ [ "c3_b" ] == getUIDs qNameMaps "::d::b" @? "UID for `::d::b` different from `c3_d`" null ([ "c0_b", "c1_b", "c2_b", "c3_b" ] \\ (getUIDs qNameMaps "b" )) @? "UIDs for `b` different from `c0_b`, `c1_b`, `c2_b`, `c3_b` " null ([ "c2_b", "c3_b" ] \\ (getUIDs qNameMaps "d::b" )) @? "UIDs for `d::b` different from `c2_b`, `c3_b` " - null ([ "c0_d", "c1_d" ] \\ (getUIDs qNameMaps "d" )) @? "UIDs for `d` different from `c0_d`, `c1_d` " + null ([ "c0_d", "c1_d" ] \\ (getUIDs qNameMaps "d" )) @? "UIDs for `d` different from `c0_d`, `c1_d` " null (getUIDs qNameMaps "x") @? "UID for `x` different from []" null (getUIDs qNameMaps "::x") @? "UID for `::x` different from []" @@ -91,4 +91,4 @@ allClafers :: [ IClafer ] allClafers = universeOn biplate iModule allClafersUids = map _uid allClafers - allClafersUids == [ "c0_a", "c0_b", "c1_b", "c0_c", "c0_d", "c2_b", "c1_d", "c3_b"] @? "All clafers\n" ++ show allClafersUids+ allClafersUids == [ "c0_a", "c0_b", "c1_b", "c0_c", "c0_d", "c2_b", "c1_d", "c3_b"] @? "All clafers\n" ++ show allClafersUids
tools/Makefile view
@@ -11,17 +11,12 @@ endif all: - @if test ! -f "alloy4.jar"; then \ - echo "[WARNING] Missing alloy4.jar. Downloading..."; \ - $(WGET_COMMAND) http://alloy.mit.edu/alloy/downloads/alloy4.jar; \ - fi - @if test ! -f "alloy4.2.jar"; then \ echo "[WARNING] Missing alloy4.2.jar. Downloading..."; \ $(WGET_COMMAND) http://alloy.mit.edu/alloy/downloads/alloy4.2_2014-05-16.jar; \ mv alloy4.2_2014-05-16.jar alloy4.2.jar; \ fi - javac -source 1.6 -target 1.6 XsdCheck.java + javac XsdCheck.java clean: - find . -type f -name '*.class' -print0 | xargs -0 rm -f+ find . -type f -name '*.class' -print0 | xargs -0 rm -f
tools/XsdCheck.class view
binary file changed (1779 → 1779 bytes)