camfort 0.900 → 0.901
raw patch · 40 files changed
+5121/−256 lines, 40 filesdep ~fortran-srcPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: fortran-src
API changes (from Hackage documentation)
+ Camfort.Specification.Units.Environment: doubleToRationalSubset :: Double -> Maybe Rational
- Camfort.Functionality: ast :: [Char] -> [Filename] -> [Char] -> t -> IO ()
+ Camfort.Functionality: ast :: FileOrDir -> [Filename] -> t1 -> t -> IO ()
- Camfort.Input: callAndSummarise :: (Monoid a1, Foldable t1) => (t3 -> t2 -> (a1, a)) -> t1 (t3, t, t2) -> (a1, [a])
+ Camfort.Input: callAndSummarise :: (Monoid a, Foldable t) => (t1 -> t3 -> (a, a1)) -> t (t1, t2, t3) -> (a, [a1])
- Camfort.Reprint: takeBounds' :: (Num t, Num t1, Ord t1, Eq t) => ((t1, t), (t1, t)) -> ByteString -> ByteString -> (ByteString, ByteString)
+ Camfort.Reprint: takeBounds' :: (Ord t1, Num t1, Num t, Eq t) => ((t1, t), (t1, t)) -> ByteString -> ByteString -> (ByteString, ByteString)
- Camfort.Specification.Stencils.Syntax: showRegion :: (Show a, Show a1) => [Char] -> a1 -> a -> Bool -> [Char]
+ Camfort.Specification.Stencils.Syntax: showRegion :: (Show a1, Show a) => [Char] -> a -> a1 -> Bool -> [Char]
- Camfort.Transformation.EquivalenceElim: equalTypes :: Eq b => Map Name b -> Expression a1 -> Expression a -> Maybe b
+ Camfort.Transformation.EquivalenceElim: equalTypes :: Eq b => Map Name b -> Expression a -> Expression a1 -> Maybe b
Files
- camfort.cabal +8/−7
- dist/build/Camfort/Specification/Stencils/Grammar.hs +980/−0
- dist/build/Camfort/Specification/Units/Parser.hs +766/−0
- dist/build/Camfort/camfort-tmp/Camfort/Specification/Stencils/Grammar.hs +980/−0
- dist/build/Camfort/camfort-tmp/Camfort/Specification/Units/Parser.hs +766/−0
- src/Camfort/Functionality.hs +2/−2
- src/Camfort/Output.hs +1/−1
- src/Camfort/Specification/Stencils/CheckFrontend.hs +10/−8
- src/Camfort/Specification/Stencils/Grammar.hs +1275/−0
- src/Camfort/Specification/Stencils/Grammar.y +2/−6
- src/Camfort/Specification/Stencils/InferenceFrontend.hs +23/−10
- src/Camfort/Specification/Stencils/Model.hs +1/−1
- src/Camfort/Specification/Stencils/Synthesis.hs +2/−2
- src/Camfort/Specification/Units.hs +11/−11
- src/Camfort/Specification/Units/Environment.hs +36/−3
- src/Camfort/Specification/Units/Parser.y +9/−3
- src/Main.hs +7/−6
- tests/Camfort/Specification/Stencils/ModelSpec.hs +6/−0
- tests/Camfort/Specification/Stencils/example2.f +0/−45
- tests/Camfort/Specification/Stencils/example3.f +0/−31
- tests/Camfort/Specification/Stencils/example4.f +0/−8
- tests/Camfort/Specification/StencilsSpec.hs +45/−12
- tests/Camfort/Specification/Units/ex1.f90 +0/−29
- tests/Camfort/Specification/Units/ex2.f90 +0/−11
- tests/Camfort/Specification/Units/ex3.f90 +0/−14
- tests/Camfort/Specification/Units/param.f90 +0/−10
- tests/Camfort/Specification/UnitsSpec.hs +9/−0
- tests/Camfort/Transformation/CommonSpec.hs +1/−4
- tests/Camfort/Transformation/EquivalenceElimSpec.hs +1/−2
- tests/Camfort/Transformation/samples/common.f90 +0/−10
- tests/Camfort/Transformation/samples/equiv.f90 +0/−20
- tests/fixtures/Specification/Stencils/example2.f +47/−0
- tests/fixtures/Specification/Stencils/example3.f +31/−0
- tests/fixtures/Specification/Stencils/example4.f +8/−0
- tests/fixtures/Specification/Units/ex1.f90 +29/−0
- tests/fixtures/Specification/Units/ex2.f90 +11/−0
- tests/fixtures/Specification/Units/ex3.f90 +14/−0
- tests/fixtures/Specification/Units/param.f90 +10/−0
- tests/fixtures/Transformation/common.f90 +10/−0
- tests/fixtures/Transformation/equiv.f90 +20/−0
camfort.cabal view
@@ -1,5 +1,5 @@ name: camfort-version: 0.900+version: 0.901 synopsis: CamFort - Cambridge Fortran infrastructure description: CamFort is a tool for the analysis, transformation, verification of Fortran code. @@ -17,9 +17,9 @@ cabal-version: >= 1.18 tested-with: GHC >= 7.8 -extra-source-files: tests/Camfort/Specification/Stencils/*.f- tests/Camfort/Specification/Units/*.f90- tests/Camfort/Transformation/samples/*.f90+extra-source-files: tests/fixtures/Specification/Stencils/*.f+ tests/fixtures/Specification/Units/*.f90+ tests/fixtures/Transformation/*.f90 source-repository head type: git@@ -76,7 +76,7 @@ transformers >= 0.4, GenericPretty >= 1.2, QuickCheck >= 2.8,- fortran-src >= 0.1.0.3,+ fortran-src >= 0.1.0.4, filepath, fgl >= 5.5, bytestring >= 0.10@@ -131,7 +131,7 @@ transformers >= 0.4, vector >= 0.1, GenericPretty >= 1.2,- fortran-src >= 0.1.0.3,+ fortran-src >= 0.1.0.4, filepath, bytestring >= 0.10, fgl >= 5.5@@ -156,11 +156,12 @@ directory >= 1.2, hspec >= 2.2, QuickCheck >= 2.8,- fortran-src >= 0.1.0.3,+ fortran-src >= 0.1.0.4, uniplate >= 1.6.10, mtl >= 2.1, bytestring >= 0.10, array >= 0.4, hmatrix >= 0.15,+ text >= 0.11.2.3, camfort default-language: Haskell2010
+ dist/build/Camfort/Specification/Stencils/Grammar.hs view
@@ -0,0 +1,980 @@+{-# OPTIONS_GHC -w #-}+{-# OPTIONS -fglasgow-exts -cpp #-}+-- -*- Mode: Haskell -*-+{-# LANGUAGE DeriveDataTypeable, PatternGuards #-}+module Camfort.Specification.Stencils.Grammar+( specParser, Specification(..), Region(..), Spec(..), Mod(..), lexer ) where++import Data.Char (isLetter, isNumber, isAlphaNum, toLower, isAlpha, isSpace)+import Data.List (intersect, sort, isPrefixOf)+import Data.Data+import qualified Data.Text as T++import Debug.Trace++import Camfort.Analysis.CommentAnnotator+import Camfort.Specification.Stencils.Syntax (showL)+import qualified Data.Array as Happy_Data_Array+import qualified GHC.Exts as Happy_GHC_Exts+import Control.Applicative(Applicative(..))+import Control.Monad (ap)++-- parser produced by Happy Version 1.19.5++newtype HappyAbsSyn = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn4 :: (Specification) -> (HappyAbsSyn )+happyIn4 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn4 #-}+happyOut4 :: (HappyAbsSyn ) -> (Specification)+happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut4 #-}+happyIn5 :: ((String, Region)) -> (HappyAbsSyn )+happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn5 #-}+happyOut5 :: (HappyAbsSyn ) -> ((String, Region))+happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut5 #-}+happyIn6 :: (Region) -> (HappyAbsSyn )+happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn6 #-}+happyOut6 :: (HappyAbsSyn ) -> (Region)+happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut6 #-}+happyIn7 :: ((Depth Int, Dim Int, Bool)) -> (HappyAbsSyn )+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn ) -> ((Depth Int, Dim Int, Bool))+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: ((Dim Int, Bool)) -> (HappyAbsSyn )+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn ) -> ((Dim Int, Bool))+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: ((Depth Int, Bool)) -> (HappyAbsSyn )+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn ) -> ((Depth Int, Bool))+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: (Depth Int) -> (HappyAbsSyn )+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn ) -> (Depth Int)+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: (Dim Int) -> (HappyAbsSyn )+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn ) -> (Dim Int)+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: (Bool) -> (HappyAbsSyn )+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn ) -> (Bool)+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut12 #-}+happyIn13 :: (Spec) -> (HappyAbsSyn )+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn13 #-}+happyOut13 :: (HappyAbsSyn ) -> (Spec)+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut13 #-}+happyIn14 :: (Mod) -> (HappyAbsSyn )+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn14 #-}+happyOut14 :: (HappyAbsSyn ) -> (Mod)+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut14 #-}+happyIn15 :: ([Mod]) -> (HappyAbsSyn )+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn ) -> ([Mod])+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: (Mod) -> (HappyAbsSyn )+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn ) -> (Mod)+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: ([String]) -> (HappyAbsSyn )+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn ) -> ([String])+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut17 #-}+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# "\x51\x00\x71\x00\x00\x00\x74\x00\x50\x00\xfe\xff\x41\x00\x73\x00\x0c\x00\x79\x00\x08\x00\x00\x00\x70\x00\x00\x00\x00\x00\x6f\x00\x6d\x00\x6c\x00\x00\x00\x0c\x00\x6e\x00\x6b\x00\x25\x00\x35\x00\x35\x00\x35\x00\x69\x00\x41\x00\x00\x00\x47\x00\x0c\x00\x3c\x00\x68\x00\x0c\x00\x0c\x00\x00\x00\x6a\x00\x00\x00\x67\x00\x3c\x00\x66\x00\x65\x00\x3d\x00\x36\x00\x40\x00\x00\x00\x64\x00\x4d\x00\x63\x00\x4c\x00\x00\x00\x0c\x00\x37\x00\x00\x00\x00\x00\x62\x00\x60\x00\x61\x00\x5f\x00\x00\x00\x5e\x00\x5d\x00\x00\x00\x5c\x00\x5a\x00\x00\x00\x56\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x2e\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x59\x00\x53\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x30\x00\x2a\x00\x24\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x57\x00\x00\x00\x4b\x00\x55\x00\x54\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xff\xff\x3b\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x49\x00\x00\x00\x42\x00\x3e\x00\x00\x00\x34\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\x00\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\x00\xe3\xff\x00\x00\x00\x00\x00\x00\xe0\xff\xe2\xff\x00\x00\xdf\xff\xde\xff\x00\x00\x00\x00\x00\x00\xf4\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xff\xe1\xff\xe0\xff\x00\x00\xe5\xff\x00\x00\x00\x00\x00\x00\xf6\xff\xf7\xff\xfd\xff\xdc\xff\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xff\x00\x00\xfc\xff\xf9\xff\xfa\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf2\xff\xea\xff\x00\x00\xf3\xff\xed\xff\x00\x00\xfb\xff\x00\x00\xdd\xff\x00\x00\xef\xff\xee\xff\xeb\xff\xec\xff\xf0\xff\xf1\xff\xe8\xff\xe9\xff\xf8\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x03\x00\x04\x00\x04\x00\x06\x00\x07\x00\x07\x00\x08\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x04\x00\x07\x00\x06\x00\x07\x00\x04\x00\x13\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x02\x00\x13\x00\x02\x00\x06\x00\x07\x00\x13\x00\x07\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0b\x00\x0c\x00\x03\x00\x0b\x00\x0c\x00\x06\x00\x07\x00\x08\x00\x03\x00\x00\x00\x01\x00\x06\x00\x07\x00\x08\x00\x03\x00\x0f\x00\x10\x00\x06\x00\x07\x00\x08\x00\x14\x00\x05\x00\x05\x00\x08\x00\x08\x00\x09\x00\x09\x00\x05\x00\x06\x00\x05\x00\x08\x00\x06\x00\x08\x00\x0f\x00\x10\x00\x08\x00\x09\x00\x08\x00\x0f\x00\x10\x00\x06\x00\x07\x00\x06\x00\x0f\x00\x10\x00\x01\x00\x02\x00\x02\x00\x0d\x00\x02\x00\x02\x00\x0d\x00\x02\x00\x02\x00\x02\x00\x01\x00\x0a\x00\x14\x00\x12\x00\x14\x00\x05\x00\x08\x00\x05\x00\x0e\x00\x15\x00\x09\x00\xff\xff\x09\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\xff\xff\x0e\x00\x08\x00\xff\xff\x02\x00\x0d\x00\x0d\x00\x12\x00\x14\x00\x12\x00\x14\x00\x10\x00\x0d\x00\x03\x00\x12\x00\xff\xff\x13\x00\x13\x00\xff\xff\x13\x00\x13\x00\x11\x00\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x0c\x00\x0d\x00\x3e\x00\x0e\x00\x0f\x00\x3f\x00\x40\x00\x10\x00\x11\x00\x12\x00\x13\x00\x0d\x00\x45\x00\x0e\x00\x0f\x00\x0d\x00\x14\x00\x10\x00\x11\x00\x12\x00\x13\x00\x10\x00\x11\x00\x12\x00\x13\x00\x06\x00\x14\x00\x1b\x00\x39\x00\x3a\x00\x14\x00\x4a\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x1c\x00\x1d\x00\x29\x00\x1c\x00\x1d\x00\x2a\x00\x2b\x00\x2c\x00\x30\x00\x04\x00\x02\x00\x2a\x00\x2b\x00\x2c\x00\x31\x00\x22\x00\x23\x00\x2a\x00\x2b\x00\x2c\x00\x33\x00\x2e\x00\x2e\x00\x46\x00\x2f\x00\x30\x00\x30\x00\x3b\x00\x3c\x00\x2e\x00\x3d\x00\x47\x00\x2f\x00\x22\x00\x23\x00\x2f\x00\x30\x00\x48\x00\x22\x00\x23\x00\x0e\x00\x0f\x00\x49\x00\x22\x00\x23\x00\x06\x00\x04\x00\x34\x00\x43\x00\x23\x00\x24\x00\x25\x00\x27\x00\x16\x00\x1f\x00\x02\x00\x1e\x00\x4e\x00\x38\x00\x36\x00\x2e\x00\x2f\x00\x2e\x00\x45\x00\xff\xff\x30\x00\x00\x00\x30\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x29\x00\x00\x00\x04\x00\x27\x00\x27\x00\x39\x00\x37\x00\x43\x00\x42\x00\x23\x00\x16\x00\x0c\x00\x34\x00\x00\x00\x18\x00\x19\x00\x00\x00\x1a\x00\x1b\x00\x21\x00\x15\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, 35) [+ (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)+ ]++happy_n_terms = 22 :: Int+happy_n_nonterms = 14 :: Int++happyReduce_1 = happySpecReduce_1 0# happyReduction_1+happyReduction_1 happy_x_1+ = case happyOut5 happy_x_1 of { happy_var_1 -> + happyIn4+ (RegionDec (fst happy_var_1) (snd happy_var_1)+ )}++happyReduce_2 = happyReduce 4# 0# happyReduction_2+happyReduction_2 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut13 happy_x_2 of { happy_var_2 -> + case happyOut17 happy_x_4 of { happy_var_4 -> + happyIn4+ (SpecDec happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_3 = happyReduce 5# 1# happyReduction_3+happyReduction_3 (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_3 of { (TId happy_var_3) -> + case happyOut6 happy_x_5 of { happy_var_5 -> + happyIn5+ ((happy_var_3, happy_var_5)+ ) `HappyStk` happyRest}}++happyReduce_4 = happyReduce 4# 2# happyReduction_4+happyReduction_4 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut7 happy_x_3 of { happy_var_3 -> + happyIn6+ (applyAttr Forward happy_var_3+ ) `HappyStk` happyRest}++happyReduce_5 = happyReduce 4# 2# happyReduction_5+happyReduction_5 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut7 happy_x_3 of { happy_var_3 -> + happyIn6+ (applyAttr Backward happy_var_3+ ) `HappyStk` happyRest}++happyReduce_6 = happyReduce 4# 2# happyReduction_6+happyReduction_6 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut7 happy_x_3 of { happy_var_3 -> + happyIn6+ (applyAttr Centered happy_var_3+ ) `HappyStk` happyRest}++happyReduce_7 = happyReduce 6# 2# happyReduction_7+happyReduction_7 (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_5 of { (TNum happy_var_5) -> + happyIn6+ (Centered 0 (read happy_var_5) True+ ) `HappyStk` happyRest}++happyReduce_8 = happySpecReduce_3 2# happyReduction_8+happyReduction_8 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut6 happy_x_1 of { happy_var_1 -> + case happyOut6 happy_x_3 of { happy_var_3 -> + happyIn6+ (Or happy_var_1 happy_var_3+ )}}++happyReduce_9 = happySpecReduce_3 2# happyReduction_9+happyReduction_9 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut6 happy_x_1 of { happy_var_1 -> + case happyOut6 happy_x_3 of { happy_var_3 -> + happyIn6+ (And happy_var_1 happy_var_3+ )}}++happyReduce_10 = happySpecReduce_3 2# happyReduction_10+happyReduction_10 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut6 happy_x_2 of { happy_var_2 -> + happyIn6+ (happy_var_2+ )}++happyReduce_11 = happySpecReduce_1 2# happyReduction_11+happyReduction_11 happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + happyIn6+ (Var happy_var_1+ )}++happyReduce_12 = happySpecReduce_2 3# happyReduction_12+happyReduction_12 happy_x_2+ happy_x_1+ = case happyOut10 happy_x_1 of { happy_var_1 -> + case happyOut8 happy_x_2 of { happy_var_2 -> + happyIn7+ ((happy_var_1, fst happy_var_2, snd happy_var_2)+ )}}++happyReduce_13 = happySpecReduce_2 3# happyReduction_13+happyReduction_13 happy_x_2+ happy_x_1+ = case happyOut11 happy_x_1 of { happy_var_1 -> + case happyOut9 happy_x_2 of { happy_var_2 -> + happyIn7+ ((fst happy_var_2, happy_var_1, snd happy_var_2)+ )}}++happyReduce_14 = happySpecReduce_3 3# happyReduction_14+happyReduction_14 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + case happyOut10 happy_x_2 of { happy_var_2 -> + case happyOut11 happy_x_3 of { happy_var_3 -> + happyIn7+ ((happy_var_2, happy_var_3, happy_var_1)+ )}}}++happyReduce_15 = happySpecReduce_3 3# happyReduction_15+happyReduction_15 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + case happyOut11 happy_x_2 of { happy_var_2 -> + case happyOut10 happy_x_3 of { happy_var_3 -> + happyIn7+ ((happy_var_3, happy_var_2, happy_var_1)+ )}}}++happyReduce_16 = happySpecReduce_2 4# happyReduction_16+happyReduction_16 happy_x_2+ happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + case happyOut11 happy_x_2 of { happy_var_2 -> + happyIn8+ ((happy_var_2, happy_var_1)+ )}}++happyReduce_17 = happySpecReduce_2 4# happyReduction_17+happyReduction_17 happy_x_2+ happy_x_1+ = case happyOut11 happy_x_1 of { happy_var_1 -> + case happyOut12 happy_x_2 of { happy_var_2 -> + happyIn8+ ((happy_var_1, happy_var_2)+ )}}++happyReduce_18 = happySpecReduce_1 4# happyReduction_18+happyReduction_18 happy_x_1+ = case happyOut11 happy_x_1 of { happy_var_1 -> + happyIn8+ ((happy_var_1, True)+ )}++happyReduce_19 = happySpecReduce_2 5# happyReduction_19+happyReduction_19 happy_x_2+ happy_x_1+ = case happyOut10 happy_x_1 of { happy_var_1 -> + case happyOut12 happy_x_2 of { happy_var_2 -> + happyIn9+ ((happy_var_1, happy_var_2)+ )}}++happyReduce_20 = happySpecReduce_2 5# happyReduction_20+happyReduction_20 happy_x_2+ happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + case happyOut10 happy_x_2 of { happy_var_2 -> + happyIn9+ ((happy_var_2, happy_var_1)+ )}}++happyReduce_21 = happySpecReduce_1 5# happyReduction_21+happyReduction_21 happy_x_1+ = case happyOut10 happy_x_1 of { happy_var_1 -> + happyIn9+ ((happy_var_1, True)+ )}++happyReduce_22 = happySpecReduce_3 6# happyReduction_22+happyReduction_22 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_3 of { (TNum happy_var_3) -> + happyIn10+ (Depth $ read happy_var_3+ )}++happyReduce_23 = happySpecReduce_3 7# happyReduction_23+happyReduction_23 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_3 of { (TNum happy_var_3) -> + happyIn11+ (Dim $ read happy_var_3+ )}++happyReduce_24 = happySpecReduce_1 8# happyReduction_24+happyReduction_24 happy_x_1+ = happyIn12+ (False+ )++happyReduce_25 = happySpecReduce_3 9# happyReduction_25+happyReduction_25 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + case happyOut14 happy_x_2 of { happy_var_2 -> + case happyOut6 happy_x_3 of { happy_var_3 -> + happyIn13+ (Spatial (happy_var_1 ++ [happy_var_2]) happy_var_3+ )}}}++happyReduce_26 = happySpecReduce_2 9# happyReduction_26+happyReduction_26 happy_x_2+ happy_x_1+ = case happyOut14 happy_x_1 of { happy_var_1 -> + case happyOut6 happy_x_2 of { happy_var_2 -> + happyIn13+ (Spatial [happy_var_1] happy_var_2+ )}}++happyReduce_27 = happySpecReduce_2 9# happyReduction_27+happyReduction_27 happy_x_2+ happy_x_1+ = case happyOut16 happy_x_1 of { happy_var_1 -> + case happyOut6 happy_x_2 of { happy_var_2 -> + happyIn13+ (Spatial [happy_var_1] happy_var_2+ )}}++happyReduce_28 = happySpecReduce_1 9# happyReduction_28+happyReduction_28 happy_x_1+ = case happyOut6 happy_x_1 of { happy_var_1 -> + happyIn13+ (Spatial [] happy_var_1+ )}++happyReduce_29 = happySpecReduce_1 10# happyReduction_29+happyReduction_29 happy_x_1+ = happyIn14+ (ReadOnce+ )++happyReduce_30 = happySpecReduce_2 11# happyReduction_30+happyReduction_30 happy_x_2+ happy_x_1+ = case happyOut16 happy_x_1 of { happy_var_1 -> + case happyOut15 happy_x_2 of { happy_var_2 -> + happyIn15+ (happy_var_1 : happy_var_2+ )}}++happyReduce_31 = happySpecReduce_1 11# happyReduction_31+happyReduction_31 happy_x_1+ = case happyOut16 happy_x_1 of { happy_var_1 -> + happyIn15+ ([happy_var_1]+ )}++happyReduce_32 = happySpecReduce_1 12# happyReduction_32+happyReduction_32 happy_x_1+ = happyIn16+ (AtMost+ )++happyReduce_33 = happySpecReduce_1 12# happyReduction_33+happyReduction_33 happy_x_1+ = happyIn16+ (AtLeast+ )++happyReduce_34 = happySpecReduce_2 13# happyReduction_34+happyReduction_34 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + case happyOut17 happy_x_2 of { happy_var_2 -> + happyIn17+ (happy_var_1 : happy_var_2+ )}}++happyReduce_35 = happySpecReduce_1 13# happyReduction_35+happyReduction_35 happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + happyIn17+ ([happy_var_1]+ )}++happyNewToken action sts stk [] =+ happyDoAction 21# notHappyAtAll action sts stk []++happyNewToken action sts stk (tk:tks) =+ let cont i = happyDoAction i tk action sts stk tks in+ case tk of {+ TId "stencil" -> cont 1#;+ TId "region" -> cont 2#;+ TId "readonce" -> cont 3#;+ TId "reflexive" -> cont 4#;+ TId "irreflexive" -> cont 5#;+ TId "atmost" -> cont 6#;+ TId "atleast" -> cont 7#;+ TId "dim" -> cont 8#;+ TId "depth" -> cont 9#;+ TId "forward" -> cont 10#;+ TId "backward" -> cont 11#;+ TId "centered" -> cont 12#;+ TId happy_dollar_dollar -> cont 13#;+ TNum happy_dollar_dollar -> cont 14#;+ TPlus -> cont 15#;+ TStar -> cont 16#;+ TDoubleColon -> cont 17#;+ TEqual -> cont 18#;+ TLParen -> cont 19#;+ TRParen -> cont 20#;+ _ -> happyError' (tk:tks)+ }++happyError_ 21# tk tks = happyError' tks+happyError_ _ tk tks = happyError' (tk:tks)++happyThen :: () => Either AnnotationParseError a -> (a -> Either AnnotationParseError b) -> Either AnnotationParseError b+happyThen = (>>=)+happyReturn :: () => a -> Either AnnotationParseError a+happyReturn = (return)+happyThen1 m k tks = (>>=) m (\a -> k a tks)+happyReturn1 :: () => a -> b -> Either AnnotationParseError a+happyReturn1 = \a tks -> (return) a+happyError' :: () => [(Token)] -> Either AnnotationParseError a+happyError' = happyError++parseSpec tks = happySomeParser where+ happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut4 x))++happySeq = happyDontSeq+++newtype Depth a = Depth a+newtype Dim a = Dim a++applyAttr :: (Int -> Int -> Bool -> Region)+ -> (Depth Int, Dim Int, Bool)+ -> Region+applyAttr constr (Depth d, Dim dim, irrefl) = constr d dim irrefl++data Specification+ = RegionDec String Region+ | SpecDec Spec [String]+ deriving (Show, Eq, Ord, Typeable, Data)++data Region+ = Forward Int Int Bool+ | Backward Int Int Bool+ | Centered Int Int Bool+ | Or Region Region+ | And Region Region+ | Var String+ deriving (Show, Eq, Ord, Typeable, Data)++data Spec = Spatial [Mod] Region+ deriving (Show, Eq, Ord, Typeable, Data)++data Mod+ = AtLeast+ | AtMost+ | ReadOnce+ deriving (Show, Eq, Ord, Typeable, Data)++--------------------------------------------------++data Token+ = TDoubleColon+ | TStar+ | TPlus+ | TEqual+ | TComma+ | TLParen+ | TRParen+ | TId String+ | TNum String+ deriving (Show)++addToTokens :: Token -> String -> Either AnnotationParseError [ Token ]+addToTokens tok rest = do+ tokens <- lexer' rest+ return $ tok : tokens++lexer :: String -> Either AnnotationParseError [ Token ]+lexer input | length (stripLeadingWhiteSpace input) >= 2 =+ case stripLeadingWhiteSpace input of+ -- Check the leading character is '=' for specification+ '=':input' -> testAnnotation input'+ '!':input' -> testAnnotation input'+ '>':input' -> testAnnotation input'+ '<':input' -> testAnnotation input'+ _ -> Left NotAnnotation+ where+ stripLeadingWhiteSpace = T.unpack . T.strip . T.pack+ testAnnotation inp =+ -- First test to see if the input looks like an actual+ -- specification of either a stencil or region+ if (inp `hasPrefix` "stencil" || inp `hasPrefix` "region")+ then lexer' inp+ else Left NotAnnotation+ hasPrefix [] str = False+ hasPrefix (' ':xs) str = hasPrefix xs str+ hasPrefix xs str = isPrefixOf str xs+lexer _ = Left NotAnnotation+++lexer' :: String -> Either AnnotationParseError [ Token ]+lexer' [] = return []+lexer' (' ':xs) = lexer' xs+lexer' ('\t':xs) = lexer' xs+lexer' (':':':':xs) = addToTokens TDoubleColon xs+lexer' ('*':xs) = addToTokens TStar xs+lexer' ('+':xs) = addToTokens TPlus xs+lexer' ('=':xs) = addToTokens TEqual xs+-- Comma hack: drop commas that are not separating numbers, in order to avoid need for 2-token lookahead.+lexer' (',':xs)+ | x':xs' <- dropWhile isSpace xs, not (isNumber x') = lexer' (x':xs')+ | otherwise = addToTokens TComma xs+lexer' ('(':xs) = addToTokens TLParen xs+lexer' (')':xs) = addToTokens TRParen xs+lexer' (x:xs)+ | isLetter x = aux TId $ \ c -> isAlphaNum c || c == '_'+ | isNumber x = aux TNum isNumber+ | otherwise+ = failWith $ "Not an indentifier " ++ show x+ where+ aux f p = (f target :) `fmap` lexer' rest+ where (target, rest) = span p (x:xs)+lexer' x+ = failWith $ "Not a valid piece of stencil syntax " ++ show x++--------------------------------------------------++-- specParser :: String -> Either AnnotationParseError Specification+specParser :: AnnotationParser Specification+specParser src = do+ tokens <- lexer src+ parseSpec tokens >>= modValidate++-- Check whether modifiers are used correctly+modValidate :: Specification -> Either AnnotationParseError Specification+modValidate (SpecDec (Spatial mods r) vars) =+ do mods' <- modValidate' $ sort mods+ return $ SpecDec (Spatial mods' r) vars++ where modValidate' [] = return $ []++ modValidate' (AtLeast : AtLeast : xs)+ = failWith "Duplicate 'atLeast' modifier; use at most one."++ modValidate' (AtMost : AtMost : xs)+ = failWith "Duplicate 'atMost' modifier; use at most one."++ modValidate' (ReadOnce : ReadOnce : xs)+ = failWith "Duplicate 'readOnce' modifier; use at most one."++ modValidate' (AtLeast : AtMost : xs)+ = failWith $ "Conflicting modifiers: cannot use 'atLeast' and "+ ++ "'atMost' together"++ modValidate' (x : xs)+ = do xs' <- modValidate' xs+ return $ x : xs'+modValidate x = return x++happyError :: [ Token ] -> Either AnnotationParseError a+happyError t = failWith $ "Could not parse specification at: " ++ show t+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 19 "<built-in>" #-}+{-# LINE 1 "/usr/local/lib/ghc-7.10.2/include/ghcversion.h" #-}+++++++++++++++++++{-# LINE 20 "<built-in>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp +++{-# LINE 13 "templates/GenericTemplate.hs" #-}++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)+#else+#define LT(n,m) (n Happy_GHC_Exts.<# m)+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)+#define EQ(n,m) (n Happy_GHC_Exts.==# m)+#endif++{-# LINE 46 "templates/GenericTemplate.hs" #-}+++data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList+++++++{-# LINE 67 "templates/GenericTemplate.hs" #-}+++{-# LINE 77 "templates/GenericTemplate.hs" #-}+++++++++++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is 0#, it means we've just accepted a partial+-- parse (a %partial parser). We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+ happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = + (happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+ = {- nothing -}+ ++ case action of+ 0# -> {- nothing -}+ happyFail i tk st+ -1# -> {- nothing -}+ happyAccept i tk st+ n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}+ + (happyReduceArr Happy_Data_Array.! rule) i tk st+ where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))+ n -> {- nothing -}+ ++ happyShift new_state i tk st+ where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+ where off = indexShortOffAddr happyActOffsets st+ off_i = (off Happy_GHC_Exts.+# i)+ check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))+ then EQ(indexShortOffAddr happyCheck off_i, i)+ else False+ action+ | check = indexShortOffAddr happyTable off_i+ | otherwise = indexShortOffAddr happyDefActions st+++indexShortOffAddr (HappyA# arr) off =+ Happy_GHC_Exts.narrow16Int# i+ where+ i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)+ high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))+ low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))+ off' = off Happy_GHC_Exts.*# 2#++++++data HappyAddr = HappyA# Happy_GHC_Exts.Addr#+++++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)+++{-# LINE 170 "templates/GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "shifting the error token" $+ happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)++happyShift new_state i tk st sts stk =+ happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_0 nt fn j tk st@((action)) sts stk+ = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')+ = let r = fn v1 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')+ = let r = fn v1 v2 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+ = let r = fn v1 v2 v3 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyReduce k nt fn j tk st sts stk+ = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let r = fn stk in -- it doesn't hurt to always seq here...+ happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk in+ happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))++happyMonad2Reduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk++ off = indexShortOffAddr happyGotoOffsets st1+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i++++ in+ happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction+++happyGoto nt j tk st = + {- nothing -}+ happyDoAction j tk new_state+ where off = indexShortOffAddr happyGotoOffsets st+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (0# is the error token)++-- parse error if we are in recovery and we fail again+happyFail 0# tk old_st _ stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "failing" $ + happyError_ i tk++{- We don't need state discarding for our restricted implementation of+ "error". In fact, it can cause some bogus parses, so I've disabled it+ for now --SDM++-- discard a state+happyFail 0# tk old_st (HappyCons ((action)) (sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) =+-- trace ("discarding state, depth " ++ show (length stk)) $+ happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+-- save the old token and carry on.+happyFail i tk (action) sts stk =+-- trace "entering error recovery" $+ happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll :: a+notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: Happy_GHC_Exts.Int# -> a -> a+happyTcHack x y = y+{-# INLINE happyTcHack #-}+++-----------------------------------------------------------------------------+-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq+-- otherwise it emits+-- happySeq = happyDontSeq++happyDoSeq, happyDontSeq :: a -> b -> b+happyDoSeq a b = a `seq` b+happyDontSeq a b = b++-----------------------------------------------------------------------------+-- Don't inline any functions from the template. GHC has a nasty habit+-- of deciding to inline happyGoto everywhere, which increases the size of+-- the generated parser quite a bit.+++{-# NOINLINE happyDoAction #-}+{-# NOINLINE happyTable #-}+{-# NOINLINE happyCheck #-}+{-# NOINLINE happyActOffsets #-}+{-# NOINLINE happyGotoOffsets #-}+{-# NOINLINE happyDefActions #-}++{-# NOINLINE happyShift #-}+{-# NOINLINE happySpecReduce_0 #-}+{-# NOINLINE happySpecReduce_1 #-}+{-# NOINLINE happySpecReduce_2 #-}+{-# NOINLINE happySpecReduce_3 #-}+{-# NOINLINE happyReduce #-}+{-# NOINLINE happyMonadReduce #-}+{-# NOINLINE happyGoto #-}+{-# NOINLINE happyFail #-}++-- end of Happy Template.+
+ dist/build/Camfort/Specification/Units/Parser.hs view
@@ -0,0 +1,766 @@+{-# OPTIONS_GHC -w #-}+{-# OPTIONS -fglasgow-exts -cpp #-}+-- -*- Mode: Haskell -*-++{-# LANGUAGE DeriveDataTypeable #-}+module Camfort.Specification.Units.Parser ( unitParser+ , UnitStatement(..)+ , UnitOfMeasure(..)+ , UnitPower(..)+ ) where++import Camfort.Analysis.CommentAnnotator+import Data.Data+import Data.List+import Data.Char (isLetter, isNumber, isAlphaNum, toLower)+import qualified Data.Text as T+import qualified Data.Array as Happy_Data_Array+import qualified GHC.Exts as Happy_GHC_Exts+import Control.Applicative(Applicative(..))+import Control.Monad (ap)++-- parser produced by Happy Version 1.19.5++newtype HappyAbsSyn = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn4 :: (UnitStatement) -> (HappyAbsSyn )+happyIn4 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn4 #-}+happyOut4 :: (HappyAbsSyn ) -> (UnitStatement)+happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut4 #-}+happyIn5 :: (Maybe [String]) -> (HappyAbsSyn )+happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn5 #-}+happyOut5 :: (HappyAbsSyn ) -> (Maybe [String])+happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut5 #-}+happyIn6 :: ([String]) -> (HappyAbsSyn )+happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn6 #-}+happyOut6 :: (HappyAbsSyn ) -> ([String])+happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut6 #-}+happyIn7 :: (UnitOfMeasure) -> (HappyAbsSyn )+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn ) -> (UnitOfMeasure)+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: (UnitOfMeasure) -> (HappyAbsSyn )+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn ) -> (UnitOfMeasure)+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: (UnitOfMeasure) -> (HappyAbsSyn )+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn ) -> (UnitOfMeasure)+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: (UnitPower) -> (HappyAbsSyn )+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn ) -> (UnitPower)+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: (Integer) -> (HappyAbsSyn )+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn ) -> (Integer)+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: (String) -> (HappyAbsSyn )+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn ) -> (String)+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut12 #-}+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# "\x44\x00\x41\x00\x0f\x00\x3c\x00\x05\x00\x2b\x00\x04\x00\x3d\x00\x00\x00\x00\x00\x3f\x00\xff\xff\x3b\x00\x01\x00\x34\x00\x00\x00\x35\x00\x10\x00\x36\x00\x0f\x00\x00\x00\x04\x00\x3a\x00\x00\x00\x39\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x19\x00\x0f\x00\x00\x00\x00\x00\x33\x00\xfd\xff\x00\x00\x38\x00\x00\x00\x19\x00\x00\x00\x2c\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x37\x00\x00\x00\x27\x00\x00\x00\x27\x00\x22\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1d\x00\x00\x00\x30\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x28\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xff\xf8\xff\xf2\xff\xef\xff\xf7\xff\x00\x00\x00\x00\x00\x00\xf8\xff\xf7\xff\xf5\xff\x00\x00\x00\x00\xf4\xff\x00\x00\xfe\xff\x00\x00\x00\x00\xfc\xff\xf9\xff\xf3\xff\xf1\xff\xee\xff\xeb\xff\xe8\xff\xe9\xff\x00\x00\x00\x00\x00\x00\xf6\xff\xf0\xff\xfd\xff\x00\x00\xea\xff\x00\x00\xfa\xff\x00\x00\xed\xff\x00\x00\xec\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x02\x00\x02\x00\x08\x00\x02\x00\x02\x00\x03\x00\x0c\x00\x0b\x00\x0c\x00\x0b\x00\x0c\x00\x09\x00\x0b\x00\x0b\x00\x02\x00\x03\x00\x03\x00\x04\x00\x08\x00\x06\x00\x03\x00\x04\x00\x05\x00\x0b\x00\x0b\x00\x03\x00\x04\x00\x02\x00\x06\x00\x03\x00\x04\x00\x05\x00\x01\x00\x06\x00\x07\x00\x08\x00\x03\x00\x04\x00\x05\x00\x03\x00\x04\x00\x05\x00\x07\x00\x08\x00\x07\x00\x08\x00\x03\x00\x04\x00\x08\x00\x09\x00\x05\x00\x05\x00\x00\x00\x0c\x00\x07\x00\x02\x00\x08\x00\x02\x00\x07\x00\x05\x00\x0a\x00\x0c\x00\x02\x00\x01\x00\x08\x00\x07\x00\x01\x00\xff\xff\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x09\x00\x0f\x00\x09\x00\x28\x00\x2a\x00\x09\x00\x09\x00\x0a\x00\x2b\x00\x0c\x00\x10\x00\x14\x00\x24\x00\x0b\x00\x14\x00\x0c\x00\x09\x00\x0a\x00\x1e\x00\x1f\x00\x26\x00\x20\x00\x24\x00\x06\x00\x07\x00\x0c\x00\x21\x00\x1e\x00\x1f\x00\x17\x00\x20\x00\x0c\x00\x0d\x00\x07\x00\x14\x00\x1a\x00\x1b\x00\x1c\x00\x0c\x00\x0d\x00\x07\x00\x05\x00\x06\x00\x07\x00\x2b\x00\x1c\x00\x25\x00\x1c\x00\x1e\x00\x1f\x00\x16\x00\x17\x00\x19\x00\x12\x00\x03\x00\x2d\x00\x12\x00\x19\x00\x16\x00\x19\x00\x12\x00\x28\x00\x22\x00\x23\x00\x11\x00\x03\x00\x16\x00\x12\x00\x05\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyReduceArr = Happy_Data_Array.array (1, 23) [+ (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)+ ]++happy_n_terms = 14 :: Int+happy_n_nonterms = 9 :: Int++happyReduce_1 = happySpecReduce_3 0# happyReduction_1+happyReduction_1 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut7 happy_x_2 of { happy_var_2 -> + case happyOut5 happy_x_3 of { happy_var_3 -> + happyIn4+ (UnitAssignment happy_var_3 happy_var_2+ )}}++happyReduce_2 = happyReduce 5# 0# happyReduction_2+happyReduction_2 (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_3 of { (TId happy_var_3) -> + case happyOut7 happy_x_5 of { happy_var_5 -> + happyIn4+ (UnitAlias happy_var_3 happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_3 = happySpecReduce_2 1# happyReduction_3+happyReduction_3 happy_x_2+ happy_x_1+ = case happyOut6 happy_x_2 of { happy_var_2 -> + happyIn5+ (Just happy_var_2+ )}++happyReduce_4 = happySpecReduce_0 1# happyReduction_4+happyReduction_4 = happyIn5+ (Nothing+ )++happyReduce_5 = happySpecReduce_3 2# happyReduction_5+happyReduction_5 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + case happyOut6 happy_x_3 of { happy_var_3 -> + happyIn6+ (happy_var_1 : happy_var_3+ )}}++happyReduce_6 = happySpecReduce_1 2# happyReduction_6+happyReduction_6 happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + happyIn6+ ([happy_var_1]+ )}++happyReduce_7 = happySpecReduce_1 3# happyReduction_7+happyReduction_7 happy_x_1+ = case happyOut8 happy_x_1 of { happy_var_1 -> + happyIn7+ (happy_var_1+ )}++happyReduce_8 = happySpecReduce_1 3# happyReduction_8+happyReduction_8 happy_x_1+ = happyIn7+ (Unitless+ )++happyReduce_9 = happySpecReduce_3 3# happyReduction_9+happyReduction_9 happy_x_3+ happy_x_2+ happy_x_1+ = happyIn7+ (Unitless+ )++happyReduce_10 = happySpecReduce_2 3# happyReduction_10+happyReduction_10 happy_x_2+ happy_x_1+ = happyIn7+ (Unitless+ )++happyReduce_11 = happySpecReduce_2 4# happyReduction_11+happyReduction_11 happy_x_2+ happy_x_1+ = case happyOut8 happy_x_1 of { happy_var_1 -> + case happyOut9 happy_x_2 of { happy_var_2 -> + happyIn8+ (UnitProduct happy_var_1 happy_var_2+ )}}++happyReduce_12 = happySpecReduce_3 4# happyReduction_12+happyReduction_12 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut7 happy_x_1 of { happy_var_1 -> + case happyOut9 happy_x_3 of { happy_var_3 -> + happyIn8+ (UnitQuotient happy_var_1 happy_var_3+ )}}++happyReduce_13 = happySpecReduce_1 4# happyReduction_13+happyReduction_13 happy_x_1+ = case happyOut9 happy_x_1 of { happy_var_1 -> + happyIn8+ (happy_var_1+ )}++happyReduce_14 = happySpecReduce_3 5# happyReduction_14+happyReduction_14 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut9 happy_x_1 of { happy_var_1 -> + case happyOut10 happy_x_3 of { happy_var_3 -> + happyIn9+ (UnitExponentiation happy_var_1 happy_var_3+ )}}++happyReduce_15 = happySpecReduce_3 5# happyReduction_15+happyReduction_15 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut8 happy_x_2 of { happy_var_2 -> + happyIn9+ (happy_var_2+ )}++happyReduce_16 = happySpecReduce_1 5# happyReduction_16+happyReduction_16 happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + happyIn9+ (UnitBasic happy_var_1+ )}++happyReduce_17 = happySpecReduce_1 6# happyReduction_17+happyReduction_17 happy_x_1+ = case happyOut11 happy_x_1 of { happy_var_1 -> + happyIn10+ (UnitPowerInteger happy_var_1+ )}++happyReduce_18 = happySpecReduce_3 6# happyReduction_18+happyReduction_18 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut11 happy_x_2 of { happy_var_2 -> + happyIn10+ (UnitPowerInteger happy_var_2+ )}++happyReduce_19 = happyReduce 5# 6# happyReduction_19+happyReduction_19 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut11 happy_x_2 of { happy_var_2 -> + case happyOut11 happy_x_4 of { happy_var_4 -> + happyIn10+ (UnitPowerRational happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_20 = happySpecReduce_1 7# happyReduction_20+happyReduction_20 happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + happyIn11+ (read happy_var_1+ )}++happyReduce_21 = happySpecReduce_2 7# happyReduction_21+happyReduction_21 happy_x_2+ happy_x_1+ = case happyOut12 happy_x_2 of { happy_var_2 -> + happyIn11+ (read $ '-' : happy_var_2+ )}++happyReduce_22 = happySpecReduce_1 8# happyReduction_22+happyReduction_22 happy_x_1+ = case happyOutTok happy_x_1 of { (TNum happy_var_1) -> + happyIn12+ (happy_var_1+ )}++happyReduce_23 = happySpecReduce_1 8# happyReduction_23+happyReduction_23 happy_x_1+ = happyIn12+ ("1"+ )++happyNewToken action sts stk [] =+ happyDoAction 13# notHappyAtAll action sts stk []++happyNewToken action sts stk (tk:tks) =+ let cont i = happyDoAction i tk action sts stk tks in+ case tk of {+ TId "unit" -> cont 1#;+ TId happy_dollar_dollar -> cont 2#;+ TNum "1" -> cont 3#;+ TNum happy_dollar_dollar -> cont 4#;+ TComma -> cont 5#;+ TMinus -> cont 6#;+ TExponentiation -> cont 7#;+ TDivision -> cont 8#;+ TDoubleColon -> cont 9#;+ TEqual -> cont 10#;+ TLeftPar -> cont 11#;+ TRightPar -> cont 12#;+ _ -> happyError' (tk:tks)+ }++happyError_ 13# tk tks = happyError' tks+happyError_ _ tk tks = happyError' (tk:tks)++happyThen :: () => Either AnnotationParseError a -> (a -> Either AnnotationParseError b) -> Either AnnotationParseError b+happyThen = (>>=)+happyReturn :: () => a -> Either AnnotationParseError a+happyReturn = (return)+happyThen1 m k tks = (>>=) m (\a -> k a tks)+happyReturn1 :: () => a -> b -> Either AnnotationParseError a+happyReturn1 = \a tks -> (return) a+happyError' :: () => [(Token)] -> Either AnnotationParseError a+happyError' = happyError++parseUnit tks = happySomeParser where+ happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut4 x))++happySeq = happyDontSeq+++data UnitStatement =+ UnitAssignment (Maybe [String]) UnitOfMeasure+ | UnitAlias String UnitOfMeasure+ deriving Data++instance Show UnitStatement where+ show (UnitAssignment (Just ss) uom) = "= unit (" ++ show uom ++ ") :: " ++ (intercalate "," ss)+ show (UnitAssignment Nothing uom) = "= unit (" ++ show uom ++ ")"+ show (UnitAlias s uom) = "= unit :: " ++ s ++ " = " ++ show uom++data UnitOfMeasure =+ Unitless+ | UnitBasic String+ | UnitProduct UnitOfMeasure UnitOfMeasure+ | UnitQuotient UnitOfMeasure UnitOfMeasure+ | UnitExponentiation UnitOfMeasure UnitPower+ deriving Data++instance Show UnitOfMeasure where+ show Unitless = "1"+ show (UnitBasic s) = s+ show (UnitProduct uom1 uom2) = show uom1 ++ " " ++ show uom2+ show (UnitQuotient uom1 uom2) = show uom1 ++ " / " ++ show uom2+ show (UnitExponentiation uom exp) = show uom ++ "** (" ++ show exp ++ ")"++data UnitPower =+ UnitPowerInteger Integer+ | UnitPowerRational Integer Integer+ deriving Data++instance Show UnitPower where+ show (UnitPowerInteger i) = show i+ show (UnitPowerRational i1 i2) = show i1 ++ "/" ++ show i2++data Token =+ TUnit+ | TComma+ | TDoubleColon+ | TExponentiation+ | TDivision+ | TMinus+ | TEqual+ | TLeftPar+ | TRightPar+ | TId String+ | TNum String+ deriving (Show)++lexer :: String -> Either AnnotationParseError [ Token ]+lexer [] = Left NotAnnotation+lexer (c:xs)+ | c `elem` ['=', '!', '>', '<'] =+ -- First test to see if the input looks like an actual unit specification+ if "unit" `isPrefixOf` (T.unpack . T.strip . T.toLower . T.pack $ xs)+ then lexer' xs+ else Left NotAnnotation+ | otherwise = Left NotAnnotation++addToTokens :: Token -> String -> Either AnnotationParseError [ Token ]+addToTokens tok rest = do+ tokens <- lexer' rest+ return $ tok : tokens++lexer' :: String -> Either AnnotationParseError [ Token ]+lexer' [] = Right []+lexer' ['\n'] = Right []+lexer' ['\r', '\n'] = Right []+lexer' ['\r'] = Right [] -- windows+lexer' (' ':xs) = lexer' xs+lexer' ('\t':xs) = lexer' xs+lexer' (':':':':xs) = addToTokens TDoubleColon xs+lexer' ('*':'*':xs) = addToTokens TExponentiation xs+lexer' (',':xs) = addToTokens TComma xs+lexer' ('/':xs) = addToTokens TDivision xs+lexer' ('-':xs) = addToTokens TMinus xs+lexer' ('=':xs) = addToTokens TEqual xs+lexer' ('(':xs) = addToTokens TLeftPar xs+lexer' (')':xs) = addToTokens TRightPar xs+lexer' (x:xs)+ | isLetter x = aux (\c -> isAlphaNum c || c `elem` ['\'','_','-']) TId+ | isNumber x = aux isNumber TNum+ | otherwise = failWith $ "Not valid unit syntax at " ++ show (x:xs) ++ "\n"+ where+ aux p cons =+ let (target, rest) = span p xs+ in lexer' rest >>= (\tokens -> return $ cons (x:target) : tokens)++unitParser :: String -> Either AnnotationParseError UnitStatement+unitParser src = do+ tokens <- lexer $ map toLower src+ parseUnit tokens++happyError :: [ Token ] -> Either AnnotationParseError a+happyError t = failWith $ "Could not parse unit specification at: " ++ show t ++ "\n"+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 19 "<built-in>" #-}+{-# LINE 1 "/usr/local/lib/ghc-7.10.2/include/ghcversion.h" #-}+++++++++++++++++++{-# LINE 20 "<built-in>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp +++{-# LINE 13 "templates/GenericTemplate.hs" #-}++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)+#else+#define LT(n,m) (n Happy_GHC_Exts.<# m)+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)+#define EQ(n,m) (n Happy_GHC_Exts.==# m)+#endif++{-# LINE 46 "templates/GenericTemplate.hs" #-}+++data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList+++++++{-# LINE 67 "templates/GenericTemplate.hs" #-}+++{-# LINE 77 "templates/GenericTemplate.hs" #-}+++++++++++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is 0#, it means we've just accepted a partial+-- parse (a %partial parser). We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+ happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = + (happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+ = {- nothing -}+ ++ case action of+ 0# -> {- nothing -}+ happyFail i tk st+ -1# -> {- nothing -}+ happyAccept i tk st+ n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}+ + (happyReduceArr Happy_Data_Array.! rule) i tk st+ where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))+ n -> {- nothing -}+ ++ happyShift new_state i tk st+ where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+ where off = indexShortOffAddr happyActOffsets st+ off_i = (off Happy_GHC_Exts.+# i)+ check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))+ then EQ(indexShortOffAddr happyCheck off_i, i)+ else False+ action+ | check = indexShortOffAddr happyTable off_i+ | otherwise = indexShortOffAddr happyDefActions st+++indexShortOffAddr (HappyA# arr) off =+ Happy_GHC_Exts.narrow16Int# i+ where+ i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)+ high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))+ low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))+ off' = off Happy_GHC_Exts.*# 2#++++++data HappyAddr = HappyA# Happy_GHC_Exts.Addr#+++++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)+++{-# LINE 170 "templates/GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "shifting the error token" $+ happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)++happyShift new_state i tk st sts stk =+ happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_0 nt fn j tk st@((action)) sts stk+ = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')+ = let r = fn v1 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')+ = let r = fn v1 v2 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+ = let r = fn v1 v2 v3 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyReduce k nt fn j tk st sts stk+ = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let r = fn stk in -- it doesn't hurt to always seq here...+ happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk in+ happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))++happyMonad2Reduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk++ off = indexShortOffAddr happyGotoOffsets st1+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i++++ in+ happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction+++happyGoto nt j tk st = + {- nothing -}+ happyDoAction j tk new_state+ where off = indexShortOffAddr happyGotoOffsets st+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (0# is the error token)++-- parse error if we are in recovery and we fail again+happyFail 0# tk old_st _ stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "failing" $ + happyError_ i tk++{- We don't need state discarding for our restricted implementation of+ "error". In fact, it can cause some bogus parses, so I've disabled it+ for now --SDM++-- discard a state+happyFail 0# tk old_st (HappyCons ((action)) (sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) =+-- trace ("discarding state, depth " ++ show (length stk)) $+ happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+-- save the old token and carry on.+happyFail i tk (action) sts stk =+-- trace "entering error recovery" $+ happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll :: a+notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: Happy_GHC_Exts.Int# -> a -> a+happyTcHack x y = y+{-# INLINE happyTcHack #-}+++-----------------------------------------------------------------------------+-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq+-- otherwise it emits+-- happySeq = happyDontSeq++happyDoSeq, happyDontSeq :: a -> b -> b+happyDoSeq a b = a `seq` b+happyDontSeq a b = b++-----------------------------------------------------------------------------+-- Don't inline any functions from the template. GHC has a nasty habit+-- of deciding to inline happyGoto everywhere, which increases the size of+-- the generated parser quite a bit.+++{-# NOINLINE happyDoAction #-}+{-# NOINLINE happyTable #-}+{-# NOINLINE happyCheck #-}+{-# NOINLINE happyActOffsets #-}+{-# NOINLINE happyGotoOffsets #-}+{-# NOINLINE happyDefActions #-}++{-# NOINLINE happyShift #-}+{-# NOINLINE happySpecReduce_0 #-}+{-# NOINLINE happySpecReduce_1 #-}+{-# NOINLINE happySpecReduce_2 #-}+{-# NOINLINE happySpecReduce_3 #-}+{-# NOINLINE happyReduce #-}+{-# NOINLINE happyMonadReduce #-}+{-# NOINLINE happyGoto #-}+{-# NOINLINE happyFail #-}++-- end of Happy Template.+
+ dist/build/Camfort/camfort-tmp/Camfort/Specification/Stencils/Grammar.hs view
@@ -0,0 +1,980 @@+{-# OPTIONS_GHC -w #-}+{-# OPTIONS -fglasgow-exts -cpp #-}+-- -*- Mode: Haskell -*-+{-# LANGUAGE DeriveDataTypeable, PatternGuards #-}+module Camfort.Specification.Stencils.Grammar+( specParser, Specification(..), Region(..), Spec(..), Mod(..), lexer ) where++import Data.Char (isLetter, isNumber, isAlphaNum, toLower, isAlpha, isSpace)+import Data.List (intersect, sort, isPrefixOf)+import Data.Data+import qualified Data.Text as T++import Debug.Trace++import Camfort.Analysis.CommentAnnotator+import Camfort.Specification.Stencils.Syntax (showL)+import qualified Data.Array as Happy_Data_Array+import qualified GHC.Exts as Happy_GHC_Exts+import Control.Applicative(Applicative(..))+import Control.Monad (ap)++-- parser produced by Happy Version 1.19.5++newtype HappyAbsSyn = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn4 :: (Specification) -> (HappyAbsSyn )+happyIn4 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn4 #-}+happyOut4 :: (HappyAbsSyn ) -> (Specification)+happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut4 #-}+happyIn5 :: ((String, Region)) -> (HappyAbsSyn )+happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn5 #-}+happyOut5 :: (HappyAbsSyn ) -> ((String, Region))+happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut5 #-}+happyIn6 :: (Region) -> (HappyAbsSyn )+happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn6 #-}+happyOut6 :: (HappyAbsSyn ) -> (Region)+happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut6 #-}+happyIn7 :: ((Depth Int, Dim Int, Bool)) -> (HappyAbsSyn )+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn ) -> ((Depth Int, Dim Int, Bool))+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: ((Dim Int, Bool)) -> (HappyAbsSyn )+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn ) -> ((Dim Int, Bool))+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: ((Depth Int, Bool)) -> (HappyAbsSyn )+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn ) -> ((Depth Int, Bool))+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: (Depth Int) -> (HappyAbsSyn )+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn ) -> (Depth Int)+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: (Dim Int) -> (HappyAbsSyn )+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn ) -> (Dim Int)+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: (Bool) -> (HappyAbsSyn )+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn ) -> (Bool)+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut12 #-}+happyIn13 :: (Spec) -> (HappyAbsSyn )+happyIn13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn13 #-}+happyOut13 :: (HappyAbsSyn ) -> (Spec)+happyOut13 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut13 #-}+happyIn14 :: (Mod) -> (HappyAbsSyn )+happyIn14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn14 #-}+happyOut14 :: (HappyAbsSyn ) -> (Mod)+happyOut14 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut14 #-}+happyIn15 :: ([Mod]) -> (HappyAbsSyn )+happyIn15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn15 #-}+happyOut15 :: (HappyAbsSyn ) -> ([Mod])+happyOut15 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut15 #-}+happyIn16 :: (Mod) -> (HappyAbsSyn )+happyIn16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn16 #-}+happyOut16 :: (HappyAbsSyn ) -> (Mod)+happyOut16 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut16 #-}+happyIn17 :: ([String]) -> (HappyAbsSyn )+happyIn17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn17 #-}+happyOut17 :: (HappyAbsSyn ) -> ([String])+happyOut17 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut17 #-}+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# "\x51\x00\x71\x00\x00\x00\x74\x00\x50\x00\xfe\xff\x41\x00\x73\x00\x0c\x00\x79\x00\x08\x00\x00\x00\x70\x00\x00\x00\x00\x00\x6f\x00\x6d\x00\x6c\x00\x00\x00\x0c\x00\x6e\x00\x6b\x00\x25\x00\x35\x00\x35\x00\x35\x00\x69\x00\x41\x00\x00\x00\x47\x00\x0c\x00\x3c\x00\x68\x00\x0c\x00\x0c\x00\x00\x00\x6a\x00\x00\x00\x67\x00\x3c\x00\x66\x00\x65\x00\x3d\x00\x36\x00\x40\x00\x00\x00\x64\x00\x4d\x00\x63\x00\x4c\x00\x00\x00\x0c\x00\x37\x00\x00\x00\x00\x00\x62\x00\x60\x00\x61\x00\x5f\x00\x00\x00\x5e\x00\x5d\x00\x00\x00\x5c\x00\x5a\x00\x00\x00\x56\x00\x00\x00\x4a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x2e\x00\x5b\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x59\x00\x53\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x00\x00\x00\x00\x00\x00\x00\x30\x00\x2a\x00\x24\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x57\x00\x00\x00\x4b\x00\x55\x00\x54\x00\x00\x00\x00\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xff\xff\x3b\x00\x17\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x52\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x49\x00\x00\x00\x42\x00\x3e\x00\x00\x00\x34\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\x00\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\x00\xe3\xff\x00\x00\x00\x00\x00\x00\xe0\xff\xe2\xff\x00\x00\xdf\xff\xde\xff\x00\x00\x00\x00\x00\x00\xf4\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xff\xe1\xff\xe0\xff\x00\x00\xe5\xff\x00\x00\x00\x00\x00\x00\xf6\xff\xf7\xff\xfd\xff\xdc\xff\xe6\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe7\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf5\xff\x00\x00\xfc\xff\xf9\xff\xfa\xff\x00\x00\x00\x00\x00\x00\x00\x00\xf2\xff\xea\xff\x00\x00\xf3\xff\xed\xff\x00\x00\xfb\xff\x00\x00\xdd\xff\x00\x00\xef\xff\xee\xff\xeb\xff\xec\xff\xf0\xff\xf1\xff\xe8\xff\xe9\xff\xf8\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x03\x00\x04\x00\x04\x00\x06\x00\x07\x00\x07\x00\x08\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x04\x00\x07\x00\x06\x00\x07\x00\x04\x00\x13\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x0a\x00\x0b\x00\x0c\x00\x0d\x00\x02\x00\x13\x00\x02\x00\x06\x00\x07\x00\x13\x00\x07\x00\x09\x00\x0a\x00\x0b\x00\x0c\x00\x0b\x00\x0c\x00\x03\x00\x0b\x00\x0c\x00\x06\x00\x07\x00\x08\x00\x03\x00\x00\x00\x01\x00\x06\x00\x07\x00\x08\x00\x03\x00\x0f\x00\x10\x00\x06\x00\x07\x00\x08\x00\x14\x00\x05\x00\x05\x00\x08\x00\x08\x00\x09\x00\x09\x00\x05\x00\x06\x00\x05\x00\x08\x00\x06\x00\x08\x00\x0f\x00\x10\x00\x08\x00\x09\x00\x08\x00\x0f\x00\x10\x00\x06\x00\x07\x00\x06\x00\x0f\x00\x10\x00\x01\x00\x02\x00\x02\x00\x0d\x00\x02\x00\x02\x00\x0d\x00\x02\x00\x02\x00\x02\x00\x01\x00\x0a\x00\x14\x00\x12\x00\x14\x00\x05\x00\x08\x00\x05\x00\x0e\x00\x15\x00\x09\x00\xff\xff\x09\x00\x08\x00\xff\xff\xff\xff\xff\xff\xff\xff\x0e\x00\xff\xff\x0e\x00\x08\x00\xff\xff\x02\x00\x0d\x00\x0d\x00\x12\x00\x14\x00\x12\x00\x14\x00\x10\x00\x0d\x00\x03\x00\x12\x00\xff\xff\x13\x00\x13\x00\xff\xff\x13\x00\x13\x00\x11\x00\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x0c\x00\x0d\x00\x3e\x00\x0e\x00\x0f\x00\x3f\x00\x40\x00\x10\x00\x11\x00\x12\x00\x13\x00\x0d\x00\x45\x00\x0e\x00\x0f\x00\x0d\x00\x14\x00\x10\x00\x11\x00\x12\x00\x13\x00\x10\x00\x11\x00\x12\x00\x13\x00\x06\x00\x14\x00\x1b\x00\x39\x00\x3a\x00\x14\x00\x4a\x00\x07\x00\x08\x00\x09\x00\x0a\x00\x1c\x00\x1d\x00\x29\x00\x1c\x00\x1d\x00\x2a\x00\x2b\x00\x2c\x00\x30\x00\x04\x00\x02\x00\x2a\x00\x2b\x00\x2c\x00\x31\x00\x22\x00\x23\x00\x2a\x00\x2b\x00\x2c\x00\x33\x00\x2e\x00\x2e\x00\x46\x00\x2f\x00\x30\x00\x30\x00\x3b\x00\x3c\x00\x2e\x00\x3d\x00\x47\x00\x2f\x00\x22\x00\x23\x00\x2f\x00\x30\x00\x48\x00\x22\x00\x23\x00\x0e\x00\x0f\x00\x49\x00\x22\x00\x23\x00\x06\x00\x04\x00\x34\x00\x43\x00\x23\x00\x24\x00\x25\x00\x27\x00\x16\x00\x1f\x00\x02\x00\x1e\x00\x4e\x00\x38\x00\x36\x00\x2e\x00\x2f\x00\x2e\x00\x45\x00\xff\xff\x30\x00\x00\x00\x30\x00\x2f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x4d\x00\x29\x00\x00\x00\x04\x00\x27\x00\x27\x00\x39\x00\x37\x00\x43\x00\x42\x00\x23\x00\x16\x00\x0c\x00\x34\x00\x00\x00\x18\x00\x19\x00\x00\x00\x1a\x00\x1b\x00\x21\x00\x15\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, 35) [+ (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)+ ]++happy_n_terms = 22 :: Int+happy_n_nonterms = 14 :: Int++happyReduce_1 = happySpecReduce_1 0# happyReduction_1+happyReduction_1 happy_x_1+ = case happyOut5 happy_x_1 of { happy_var_1 -> + happyIn4+ (RegionDec (fst happy_var_1) (snd happy_var_1)+ )}++happyReduce_2 = happyReduce 4# 0# happyReduction_2+happyReduction_2 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut13 happy_x_2 of { happy_var_2 -> + case happyOut17 happy_x_4 of { happy_var_4 -> + happyIn4+ (SpecDec happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_3 = happyReduce 5# 1# happyReduction_3+happyReduction_3 (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_3 of { (TId happy_var_3) -> + case happyOut6 happy_x_5 of { happy_var_5 -> + happyIn5+ ((happy_var_3, happy_var_5)+ ) `HappyStk` happyRest}}++happyReduce_4 = happyReduce 4# 2# happyReduction_4+happyReduction_4 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut7 happy_x_3 of { happy_var_3 -> + happyIn6+ (applyAttr Forward happy_var_3+ ) `HappyStk` happyRest}++happyReduce_5 = happyReduce 4# 2# happyReduction_5+happyReduction_5 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut7 happy_x_3 of { happy_var_3 -> + happyIn6+ (applyAttr Backward happy_var_3+ ) `HappyStk` happyRest}++happyReduce_6 = happyReduce 4# 2# happyReduction_6+happyReduction_6 (happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut7 happy_x_3 of { happy_var_3 -> + happyIn6+ (applyAttr Centered happy_var_3+ ) `HappyStk` happyRest}++happyReduce_7 = happyReduce 6# 2# happyReduction_7+happyReduction_7 (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_5 of { (TNum happy_var_5) -> + happyIn6+ (Centered 0 (read happy_var_5) True+ ) `HappyStk` happyRest}++happyReduce_8 = happySpecReduce_3 2# happyReduction_8+happyReduction_8 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut6 happy_x_1 of { happy_var_1 -> + case happyOut6 happy_x_3 of { happy_var_3 -> + happyIn6+ (Or happy_var_1 happy_var_3+ )}}++happyReduce_9 = happySpecReduce_3 2# happyReduction_9+happyReduction_9 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut6 happy_x_1 of { happy_var_1 -> + case happyOut6 happy_x_3 of { happy_var_3 -> + happyIn6+ (And happy_var_1 happy_var_3+ )}}++happyReduce_10 = happySpecReduce_3 2# happyReduction_10+happyReduction_10 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut6 happy_x_2 of { happy_var_2 -> + happyIn6+ (happy_var_2+ )}++happyReduce_11 = happySpecReduce_1 2# happyReduction_11+happyReduction_11 happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + happyIn6+ (Var happy_var_1+ )}++happyReduce_12 = happySpecReduce_2 3# happyReduction_12+happyReduction_12 happy_x_2+ happy_x_1+ = case happyOut10 happy_x_1 of { happy_var_1 -> + case happyOut8 happy_x_2 of { happy_var_2 -> + happyIn7+ ((happy_var_1, fst happy_var_2, snd happy_var_2)+ )}}++happyReduce_13 = happySpecReduce_2 3# happyReduction_13+happyReduction_13 happy_x_2+ happy_x_1+ = case happyOut11 happy_x_1 of { happy_var_1 -> + case happyOut9 happy_x_2 of { happy_var_2 -> + happyIn7+ ((fst happy_var_2, happy_var_1, snd happy_var_2)+ )}}++happyReduce_14 = happySpecReduce_3 3# happyReduction_14+happyReduction_14 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + case happyOut10 happy_x_2 of { happy_var_2 -> + case happyOut11 happy_x_3 of { happy_var_3 -> + happyIn7+ ((happy_var_2, happy_var_3, happy_var_1)+ )}}}++happyReduce_15 = happySpecReduce_3 3# happyReduction_15+happyReduction_15 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + case happyOut11 happy_x_2 of { happy_var_2 -> + case happyOut10 happy_x_3 of { happy_var_3 -> + happyIn7+ ((happy_var_3, happy_var_2, happy_var_1)+ )}}}++happyReduce_16 = happySpecReduce_2 4# happyReduction_16+happyReduction_16 happy_x_2+ happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + case happyOut11 happy_x_2 of { happy_var_2 -> + happyIn8+ ((happy_var_2, happy_var_1)+ )}}++happyReduce_17 = happySpecReduce_2 4# happyReduction_17+happyReduction_17 happy_x_2+ happy_x_1+ = case happyOut11 happy_x_1 of { happy_var_1 -> + case happyOut12 happy_x_2 of { happy_var_2 -> + happyIn8+ ((happy_var_1, happy_var_2)+ )}}++happyReduce_18 = happySpecReduce_1 4# happyReduction_18+happyReduction_18 happy_x_1+ = case happyOut11 happy_x_1 of { happy_var_1 -> + happyIn8+ ((happy_var_1, True)+ )}++happyReduce_19 = happySpecReduce_2 5# happyReduction_19+happyReduction_19 happy_x_2+ happy_x_1+ = case happyOut10 happy_x_1 of { happy_var_1 -> + case happyOut12 happy_x_2 of { happy_var_2 -> + happyIn9+ ((happy_var_1, happy_var_2)+ )}}++happyReduce_20 = happySpecReduce_2 5# happyReduction_20+happyReduction_20 happy_x_2+ happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + case happyOut10 happy_x_2 of { happy_var_2 -> + happyIn9+ ((happy_var_2, happy_var_1)+ )}}++happyReduce_21 = happySpecReduce_1 5# happyReduction_21+happyReduction_21 happy_x_1+ = case happyOut10 happy_x_1 of { happy_var_1 -> + happyIn9+ ((happy_var_1, True)+ )}++happyReduce_22 = happySpecReduce_3 6# happyReduction_22+happyReduction_22 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_3 of { (TNum happy_var_3) -> + happyIn10+ (Depth $ read happy_var_3+ )}++happyReduce_23 = happySpecReduce_3 7# happyReduction_23+happyReduction_23 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_3 of { (TNum happy_var_3) -> + happyIn11+ (Dim $ read happy_var_3+ )}++happyReduce_24 = happySpecReduce_1 8# happyReduction_24+happyReduction_24 happy_x_1+ = happyIn12+ (False+ )++happyReduce_25 = happySpecReduce_3 9# happyReduction_25+happyReduction_25 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut15 happy_x_1 of { happy_var_1 -> + case happyOut14 happy_x_2 of { happy_var_2 -> + case happyOut6 happy_x_3 of { happy_var_3 -> + happyIn13+ (Spatial (happy_var_1 ++ [happy_var_2]) happy_var_3+ )}}}++happyReduce_26 = happySpecReduce_2 9# happyReduction_26+happyReduction_26 happy_x_2+ happy_x_1+ = case happyOut14 happy_x_1 of { happy_var_1 -> + case happyOut6 happy_x_2 of { happy_var_2 -> + happyIn13+ (Spatial [happy_var_1] happy_var_2+ )}}++happyReduce_27 = happySpecReduce_2 9# happyReduction_27+happyReduction_27 happy_x_2+ happy_x_1+ = case happyOut16 happy_x_1 of { happy_var_1 -> + case happyOut6 happy_x_2 of { happy_var_2 -> + happyIn13+ (Spatial [happy_var_1] happy_var_2+ )}}++happyReduce_28 = happySpecReduce_1 9# happyReduction_28+happyReduction_28 happy_x_1+ = case happyOut6 happy_x_1 of { happy_var_1 -> + happyIn13+ (Spatial [] happy_var_1+ )}++happyReduce_29 = happySpecReduce_1 10# happyReduction_29+happyReduction_29 happy_x_1+ = happyIn14+ (ReadOnce+ )++happyReduce_30 = happySpecReduce_2 11# happyReduction_30+happyReduction_30 happy_x_2+ happy_x_1+ = case happyOut16 happy_x_1 of { happy_var_1 -> + case happyOut15 happy_x_2 of { happy_var_2 -> + happyIn15+ (happy_var_1 : happy_var_2+ )}}++happyReduce_31 = happySpecReduce_1 11# happyReduction_31+happyReduction_31 happy_x_1+ = case happyOut16 happy_x_1 of { happy_var_1 -> + happyIn15+ ([happy_var_1]+ )}++happyReduce_32 = happySpecReduce_1 12# happyReduction_32+happyReduction_32 happy_x_1+ = happyIn16+ (AtMost+ )++happyReduce_33 = happySpecReduce_1 12# happyReduction_33+happyReduction_33 happy_x_1+ = happyIn16+ (AtLeast+ )++happyReduce_34 = happySpecReduce_2 13# happyReduction_34+happyReduction_34 happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + case happyOut17 happy_x_2 of { happy_var_2 -> + happyIn17+ (happy_var_1 : happy_var_2+ )}}++happyReduce_35 = happySpecReduce_1 13# happyReduction_35+happyReduction_35 happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + happyIn17+ ([happy_var_1]+ )}++happyNewToken action sts stk [] =+ happyDoAction 21# notHappyAtAll action sts stk []++happyNewToken action sts stk (tk:tks) =+ let cont i = happyDoAction i tk action sts stk tks in+ case tk of {+ TId "stencil" -> cont 1#;+ TId "region" -> cont 2#;+ TId "readonce" -> cont 3#;+ TId "reflexive" -> cont 4#;+ TId "irreflexive" -> cont 5#;+ TId "atmost" -> cont 6#;+ TId "atleast" -> cont 7#;+ TId "dim" -> cont 8#;+ TId "depth" -> cont 9#;+ TId "forward" -> cont 10#;+ TId "backward" -> cont 11#;+ TId "centered" -> cont 12#;+ TId happy_dollar_dollar -> cont 13#;+ TNum happy_dollar_dollar -> cont 14#;+ TPlus -> cont 15#;+ TStar -> cont 16#;+ TDoubleColon -> cont 17#;+ TEqual -> cont 18#;+ TLParen -> cont 19#;+ TRParen -> cont 20#;+ _ -> happyError' (tk:tks)+ }++happyError_ 21# tk tks = happyError' tks+happyError_ _ tk tks = happyError' (tk:tks)++happyThen :: () => Either AnnotationParseError a -> (a -> Either AnnotationParseError b) -> Either AnnotationParseError b+happyThen = (>>=)+happyReturn :: () => a -> Either AnnotationParseError a+happyReturn = (return)+happyThen1 m k tks = (>>=) m (\a -> k a tks)+happyReturn1 :: () => a -> b -> Either AnnotationParseError a+happyReturn1 = \a tks -> (return) a+happyError' :: () => [(Token)] -> Either AnnotationParseError a+happyError' = happyError++parseSpec tks = happySomeParser where+ happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut4 x))++happySeq = happyDontSeq+++newtype Depth a = Depth a+newtype Dim a = Dim a++applyAttr :: (Int -> Int -> Bool -> Region)+ -> (Depth Int, Dim Int, Bool)+ -> Region+applyAttr constr (Depth d, Dim dim, irrefl) = constr d dim irrefl++data Specification+ = RegionDec String Region+ | SpecDec Spec [String]+ deriving (Show, Eq, Ord, Typeable, Data)++data Region+ = Forward Int Int Bool+ | Backward Int Int Bool+ | Centered Int Int Bool+ | Or Region Region+ | And Region Region+ | Var String+ deriving (Show, Eq, Ord, Typeable, Data)++data Spec = Spatial [Mod] Region+ deriving (Show, Eq, Ord, Typeable, Data)++data Mod+ = AtLeast+ | AtMost+ | ReadOnce+ deriving (Show, Eq, Ord, Typeable, Data)++--------------------------------------------------++data Token+ = TDoubleColon+ | TStar+ | TPlus+ | TEqual+ | TComma+ | TLParen+ | TRParen+ | TId String+ | TNum String+ deriving (Show)++addToTokens :: Token -> String -> Either AnnotationParseError [ Token ]+addToTokens tok rest = do+ tokens <- lexer' rest+ return $ tok : tokens++lexer :: String -> Either AnnotationParseError [ Token ]+lexer input | length (stripLeadingWhiteSpace input) >= 2 =+ case stripLeadingWhiteSpace input of+ -- Check the leading character is '=' for specification+ '=':input' -> testAnnotation input'+ '!':input' -> testAnnotation input'+ '>':input' -> testAnnotation input'+ '<':input' -> testAnnotation input'+ _ -> Left NotAnnotation+ where+ stripLeadingWhiteSpace = T.unpack . T.strip . T.pack+ testAnnotation inp =+ -- First test to see if the input looks like an actual+ -- specification of either a stencil or region+ if (inp `hasPrefix` "stencil" || inp `hasPrefix` "region")+ then lexer' inp+ else Left NotAnnotation+ hasPrefix [] str = False+ hasPrefix (' ':xs) str = hasPrefix xs str+ hasPrefix xs str = isPrefixOf str xs+lexer _ = Left NotAnnotation+++lexer' :: String -> Either AnnotationParseError [ Token ]+lexer' [] = return []+lexer' (' ':xs) = lexer' xs+lexer' ('\t':xs) = lexer' xs+lexer' (':':':':xs) = addToTokens TDoubleColon xs+lexer' ('*':xs) = addToTokens TStar xs+lexer' ('+':xs) = addToTokens TPlus xs+lexer' ('=':xs) = addToTokens TEqual xs+-- Comma hack: drop commas that are not separating numbers, in order to avoid need for 2-token lookahead.+lexer' (',':xs)+ | x':xs' <- dropWhile isSpace xs, not (isNumber x') = lexer' (x':xs')+ | otherwise = addToTokens TComma xs+lexer' ('(':xs) = addToTokens TLParen xs+lexer' (')':xs) = addToTokens TRParen xs+lexer' (x:xs)+ | isLetter x = aux TId $ \ c -> isAlphaNum c || c == '_'+ | isNumber x = aux TNum isNumber+ | otherwise+ = failWith $ "Not an indentifier " ++ show x+ where+ aux f p = (f target :) `fmap` lexer' rest+ where (target, rest) = span p (x:xs)+lexer' x+ = failWith $ "Not a valid piece of stencil syntax " ++ show x++--------------------------------------------------++-- specParser :: String -> Either AnnotationParseError Specification+specParser :: AnnotationParser Specification+specParser src = do+ tokens <- lexer src+ parseSpec tokens >>= modValidate++-- Check whether modifiers are used correctly+modValidate :: Specification -> Either AnnotationParseError Specification+modValidate (SpecDec (Spatial mods r) vars) =+ do mods' <- modValidate' $ sort mods+ return $ SpecDec (Spatial mods' r) vars++ where modValidate' [] = return $ []++ modValidate' (AtLeast : AtLeast : xs)+ = failWith "Duplicate 'atLeast' modifier; use at most one."++ modValidate' (AtMost : AtMost : xs)+ = failWith "Duplicate 'atMost' modifier; use at most one."++ modValidate' (ReadOnce : ReadOnce : xs)+ = failWith "Duplicate 'readOnce' modifier; use at most one."++ modValidate' (AtLeast : AtMost : xs)+ = failWith $ "Conflicting modifiers: cannot use 'atLeast' and "+ ++ "'atMost' together"++ modValidate' (x : xs)+ = do xs' <- modValidate' xs+ return $ x : xs'+modValidate x = return x++happyError :: [ Token ] -> Either AnnotationParseError a+happyError t = failWith $ "Could not parse specification at: " ++ show t+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 19 "<built-in>" #-}+{-# LINE 1 "/usr/local/lib/ghc-7.10.2/include/ghcversion.h" #-}+++++++++++++++++++{-# LINE 20 "<built-in>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp +++{-# LINE 13 "templates/GenericTemplate.hs" #-}++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)+#else+#define LT(n,m) (n Happy_GHC_Exts.<# m)+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)+#define EQ(n,m) (n Happy_GHC_Exts.==# m)+#endif++{-# LINE 46 "templates/GenericTemplate.hs" #-}+++data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList+++++++{-# LINE 67 "templates/GenericTemplate.hs" #-}+++{-# LINE 77 "templates/GenericTemplate.hs" #-}+++++++++++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is 0#, it means we've just accepted a partial+-- parse (a %partial parser). We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+ happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = + (happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+ = {- nothing -}+ ++ case action of+ 0# -> {- nothing -}+ happyFail i tk st+ -1# -> {- nothing -}+ happyAccept i tk st+ n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}+ + (happyReduceArr Happy_Data_Array.! rule) i tk st+ where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))+ n -> {- nothing -}+ ++ happyShift new_state i tk st+ where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+ where off = indexShortOffAddr happyActOffsets st+ off_i = (off Happy_GHC_Exts.+# i)+ check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))+ then EQ(indexShortOffAddr happyCheck off_i, i)+ else False+ action+ | check = indexShortOffAddr happyTable off_i+ | otherwise = indexShortOffAddr happyDefActions st+++indexShortOffAddr (HappyA# arr) off =+ Happy_GHC_Exts.narrow16Int# i+ where+ i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)+ high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))+ low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))+ off' = off Happy_GHC_Exts.*# 2#++++++data HappyAddr = HappyA# Happy_GHC_Exts.Addr#+++++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)+++{-# LINE 170 "templates/GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "shifting the error token" $+ happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)++happyShift new_state i tk st sts stk =+ happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_0 nt fn j tk st@((action)) sts stk+ = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')+ = let r = fn v1 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')+ = let r = fn v1 v2 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+ = let r = fn v1 v2 v3 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyReduce k nt fn j tk st sts stk+ = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let r = fn stk in -- it doesn't hurt to always seq here...+ happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk in+ happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))++happyMonad2Reduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk++ off = indexShortOffAddr happyGotoOffsets st1+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i++++ in+ happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction+++happyGoto nt j tk st = + {- nothing -}+ happyDoAction j tk new_state+ where off = indexShortOffAddr happyGotoOffsets st+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (0# is the error token)++-- parse error if we are in recovery and we fail again+happyFail 0# tk old_st _ stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "failing" $ + happyError_ i tk++{- We don't need state discarding for our restricted implementation of+ "error". In fact, it can cause some bogus parses, so I've disabled it+ for now --SDM++-- discard a state+happyFail 0# tk old_st (HappyCons ((action)) (sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) =+-- trace ("discarding state, depth " ++ show (length stk)) $+ happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+-- save the old token and carry on.+happyFail i tk (action) sts stk =+-- trace "entering error recovery" $+ happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll :: a+notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: Happy_GHC_Exts.Int# -> a -> a+happyTcHack x y = y+{-# INLINE happyTcHack #-}+++-----------------------------------------------------------------------------+-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq+-- otherwise it emits+-- happySeq = happyDontSeq++happyDoSeq, happyDontSeq :: a -> b -> b+happyDoSeq a b = a `seq` b+happyDontSeq a b = b++-----------------------------------------------------------------------------+-- Don't inline any functions from the template. GHC has a nasty habit+-- of deciding to inline happyGoto everywhere, which increases the size of+-- the generated parser quite a bit.+++{-# NOINLINE happyDoAction #-}+{-# NOINLINE happyTable #-}+{-# NOINLINE happyCheck #-}+{-# NOINLINE happyActOffsets #-}+{-# NOINLINE happyGotoOffsets #-}+{-# NOINLINE happyDefActions #-}++{-# NOINLINE happyShift #-}+{-# NOINLINE happySpecReduce_0 #-}+{-# NOINLINE happySpecReduce_1 #-}+{-# NOINLINE happySpecReduce_2 #-}+{-# NOINLINE happySpecReduce_3 #-}+{-# NOINLINE happyReduce #-}+{-# NOINLINE happyMonadReduce #-}+{-# NOINLINE happyGoto #-}+{-# NOINLINE happyFail #-}++-- end of Happy Template.+
+ dist/build/Camfort/camfort-tmp/Camfort/Specification/Units/Parser.hs view
@@ -0,0 +1,766 @@+{-# OPTIONS_GHC -w #-}+{-# OPTIONS -fglasgow-exts -cpp #-}+-- -*- Mode: Haskell -*-++{-# LANGUAGE DeriveDataTypeable #-}+module Camfort.Specification.Units.Parser ( unitParser+ , UnitStatement(..)+ , UnitOfMeasure(..)+ , UnitPower(..)+ ) where++import Camfort.Analysis.CommentAnnotator+import Data.Data+import Data.List+import Data.Char (isLetter, isNumber, isAlphaNum, toLower)+import qualified Data.Text as T+import qualified Data.Array as Happy_Data_Array+import qualified GHC.Exts as Happy_GHC_Exts+import Control.Applicative(Applicative(..))+import Control.Monad (ap)++-- parser produced by Happy Version 1.19.5++newtype HappyAbsSyn = HappyAbsSyn HappyAny+#if __GLASGOW_HASKELL__ >= 607+type HappyAny = Happy_GHC_Exts.Any+#else+type HappyAny = forall a . a+#endif+happyIn4 :: (UnitStatement) -> (HappyAbsSyn )+happyIn4 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn4 #-}+happyOut4 :: (HappyAbsSyn ) -> (UnitStatement)+happyOut4 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut4 #-}+happyIn5 :: (Maybe [String]) -> (HappyAbsSyn )+happyIn5 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn5 #-}+happyOut5 :: (HappyAbsSyn ) -> (Maybe [String])+happyOut5 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut5 #-}+happyIn6 :: ([String]) -> (HappyAbsSyn )+happyIn6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn6 #-}+happyOut6 :: (HappyAbsSyn ) -> ([String])+happyOut6 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut6 #-}+happyIn7 :: (UnitOfMeasure) -> (HappyAbsSyn )+happyIn7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn7 #-}+happyOut7 :: (HappyAbsSyn ) -> (UnitOfMeasure)+happyOut7 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut7 #-}+happyIn8 :: (UnitOfMeasure) -> (HappyAbsSyn )+happyIn8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn8 #-}+happyOut8 :: (HappyAbsSyn ) -> (UnitOfMeasure)+happyOut8 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut8 #-}+happyIn9 :: (UnitOfMeasure) -> (HappyAbsSyn )+happyIn9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn9 #-}+happyOut9 :: (HappyAbsSyn ) -> (UnitOfMeasure)+happyOut9 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut9 #-}+happyIn10 :: (UnitPower) -> (HappyAbsSyn )+happyIn10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn10 #-}+happyOut10 :: (HappyAbsSyn ) -> (UnitPower)+happyOut10 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut10 #-}+happyIn11 :: (Integer) -> (HappyAbsSyn )+happyIn11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn11 #-}+happyOut11 :: (HappyAbsSyn ) -> (Integer)+happyOut11 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut11 #-}+happyIn12 :: (String) -> (HappyAbsSyn )+happyIn12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyIn12 #-}+happyOut12 :: (HappyAbsSyn ) -> (String)+happyOut12 x = Happy_GHC_Exts.unsafeCoerce# x+{-# INLINE happyOut12 #-}+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# "\x44\x00\x41\x00\x0f\x00\x3c\x00\x05\x00\x2b\x00\x04\x00\x3d\x00\x00\x00\x00\x00\x3f\x00\xff\xff\x3b\x00\x01\x00\x34\x00\x00\x00\x35\x00\x10\x00\x36\x00\x0f\x00\x00\x00\x04\x00\x3a\x00\x00\x00\x39\x00\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2e\x00\x19\x00\x0f\x00\x00\x00\x00\x00\x33\x00\xfd\xff\x00\x00\x38\x00\x00\x00\x19\x00\x00\x00\x2c\x00\x00\x00\x00\x00"#++happyGotoOffsets :: HappyAddr+happyGotoOffsets = HappyA# "\x37\x00\x00\x00\x27\x00\x00\x00\x27\x00\x22\x00\x31\x00\x00\x00\x00\x00\x00\x00\x00\x00\x24\x00\x00\x00\x31\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x1d\x00\x00\x00\x30\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00\x28\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x26\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyDefActions :: HappyAddr+happyDefActions = HappyA# "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\xff\xf8\xff\xf2\xff\xef\xff\xf7\xff\x00\x00\x00\x00\x00\x00\xf8\xff\xf7\xff\xf5\xff\x00\x00\x00\x00\xf4\xff\x00\x00\xfe\xff\x00\x00\x00\x00\xfc\xff\xf9\xff\xf3\xff\xf1\xff\xee\xff\xeb\xff\xe8\xff\xe9\xff\x00\x00\x00\x00\x00\x00\xf6\xff\xf0\xff\xfd\xff\x00\x00\xea\xff\x00\x00\xfa\xff\x00\x00\xed\xff\x00\x00\xec\xff"#++happyCheck :: HappyAddr+happyCheck = HappyA# "\xff\xff\x02\x00\x03\x00\x02\x00\x02\x00\x08\x00\x02\x00\x02\x00\x03\x00\x0c\x00\x0b\x00\x0c\x00\x0b\x00\x0c\x00\x09\x00\x0b\x00\x0b\x00\x02\x00\x03\x00\x03\x00\x04\x00\x08\x00\x06\x00\x03\x00\x04\x00\x05\x00\x0b\x00\x0b\x00\x03\x00\x04\x00\x02\x00\x06\x00\x03\x00\x04\x00\x05\x00\x01\x00\x06\x00\x07\x00\x08\x00\x03\x00\x04\x00\x05\x00\x03\x00\x04\x00\x05\x00\x07\x00\x08\x00\x07\x00\x08\x00\x03\x00\x04\x00\x08\x00\x09\x00\x05\x00\x05\x00\x00\x00\x0c\x00\x07\x00\x02\x00\x08\x00\x02\x00\x07\x00\x05\x00\x0a\x00\x0c\x00\x02\x00\x01\x00\x08\x00\x07\x00\x01\x00\xff\xff\xff\xff\xff\xff\x0d\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"#++happyTable :: HappyAddr+happyTable = HappyA# "\x00\x00\x09\x00\x0f\x00\x09\x00\x28\x00\x2a\x00\x09\x00\x09\x00\x0a\x00\x2b\x00\x0c\x00\x10\x00\x14\x00\x24\x00\x0b\x00\x14\x00\x0c\x00\x09\x00\x0a\x00\x1e\x00\x1f\x00\x26\x00\x20\x00\x24\x00\x06\x00\x07\x00\x0c\x00\x21\x00\x1e\x00\x1f\x00\x17\x00\x20\x00\x0c\x00\x0d\x00\x07\x00\x14\x00\x1a\x00\x1b\x00\x1c\x00\x0c\x00\x0d\x00\x07\x00\x05\x00\x06\x00\x07\x00\x2b\x00\x1c\x00\x25\x00\x1c\x00\x1e\x00\x1f\x00\x16\x00\x17\x00\x19\x00\x12\x00\x03\x00\x2d\x00\x12\x00\x19\x00\x16\x00\x19\x00\x12\x00\x28\x00\x22\x00\x23\x00\x11\x00\x03\x00\x16\x00\x12\x00\x05\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#++happyReduceArr = Happy_Data_Array.array (1, 23) [+ (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)+ ]++happy_n_terms = 14 :: Int+happy_n_nonterms = 9 :: Int++happyReduce_1 = happySpecReduce_3 0# happyReduction_1+happyReduction_1 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut7 happy_x_2 of { happy_var_2 -> + case happyOut5 happy_x_3 of { happy_var_3 -> + happyIn4+ (UnitAssignment happy_var_3 happy_var_2+ )}}++happyReduce_2 = happyReduce 5# 0# happyReduction_2+happyReduction_2 (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_3 of { (TId happy_var_3) -> + case happyOut7 happy_x_5 of { happy_var_5 -> + happyIn4+ (UnitAlias happy_var_3 happy_var_5+ ) `HappyStk` happyRest}}++happyReduce_3 = happySpecReduce_2 1# happyReduction_3+happyReduction_3 happy_x_2+ happy_x_1+ = case happyOut6 happy_x_2 of { happy_var_2 -> + happyIn5+ (Just happy_var_2+ )}++happyReduce_4 = happySpecReduce_0 1# happyReduction_4+happyReduction_4 = happyIn5+ (Nothing+ )++happyReduce_5 = happySpecReduce_3 2# happyReduction_5+happyReduction_5 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + case happyOut6 happy_x_3 of { happy_var_3 -> + happyIn6+ (happy_var_1 : happy_var_3+ )}}++happyReduce_6 = happySpecReduce_1 2# happyReduction_6+happyReduction_6 happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + happyIn6+ ([happy_var_1]+ )}++happyReduce_7 = happySpecReduce_1 3# happyReduction_7+happyReduction_7 happy_x_1+ = case happyOut8 happy_x_1 of { happy_var_1 -> + happyIn7+ (happy_var_1+ )}++happyReduce_8 = happySpecReduce_1 3# happyReduction_8+happyReduction_8 happy_x_1+ = happyIn7+ (Unitless+ )++happyReduce_9 = happySpecReduce_3 3# happyReduction_9+happyReduction_9 happy_x_3+ happy_x_2+ happy_x_1+ = happyIn7+ (Unitless+ )++happyReduce_10 = happySpecReduce_2 3# happyReduction_10+happyReduction_10 happy_x_2+ happy_x_1+ = happyIn7+ (Unitless+ )++happyReduce_11 = happySpecReduce_2 4# happyReduction_11+happyReduction_11 happy_x_2+ happy_x_1+ = case happyOut8 happy_x_1 of { happy_var_1 -> + case happyOut9 happy_x_2 of { happy_var_2 -> + happyIn8+ (UnitProduct happy_var_1 happy_var_2+ )}}++happyReduce_12 = happySpecReduce_3 4# happyReduction_12+happyReduction_12 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut7 happy_x_1 of { happy_var_1 -> + case happyOut9 happy_x_3 of { happy_var_3 -> + happyIn8+ (UnitQuotient happy_var_1 happy_var_3+ )}}++happyReduce_13 = happySpecReduce_1 4# happyReduction_13+happyReduction_13 happy_x_1+ = case happyOut9 happy_x_1 of { happy_var_1 -> + happyIn8+ (happy_var_1+ )}++happyReduce_14 = happySpecReduce_3 5# happyReduction_14+happyReduction_14 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut9 happy_x_1 of { happy_var_1 -> + case happyOut10 happy_x_3 of { happy_var_3 -> + happyIn9+ (UnitExponentiation happy_var_1 happy_var_3+ )}}++happyReduce_15 = happySpecReduce_3 5# happyReduction_15+happyReduction_15 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut8 happy_x_2 of { happy_var_2 -> + happyIn9+ (happy_var_2+ )}++happyReduce_16 = happySpecReduce_1 5# happyReduction_16+happyReduction_16 happy_x_1+ = case happyOutTok happy_x_1 of { (TId happy_var_1) -> + happyIn9+ (UnitBasic happy_var_1+ )}++happyReduce_17 = happySpecReduce_1 6# happyReduction_17+happyReduction_17 happy_x_1+ = case happyOut11 happy_x_1 of { happy_var_1 -> + happyIn10+ (UnitPowerInteger happy_var_1+ )}++happyReduce_18 = happySpecReduce_3 6# happyReduction_18+happyReduction_18 happy_x_3+ happy_x_2+ happy_x_1+ = case happyOut11 happy_x_2 of { happy_var_2 -> + happyIn10+ (UnitPowerInteger happy_var_2+ )}++happyReduce_19 = happyReduce 5# 6# happyReduction_19+happyReduction_19 (happy_x_5 `HappyStk`+ happy_x_4 `HappyStk`+ happy_x_3 `HappyStk`+ happy_x_2 `HappyStk`+ happy_x_1 `HappyStk`+ happyRest)+ = case happyOut11 happy_x_2 of { happy_var_2 -> + case happyOut11 happy_x_4 of { happy_var_4 -> + happyIn10+ (UnitPowerRational happy_var_2 happy_var_4+ ) `HappyStk` happyRest}}++happyReduce_20 = happySpecReduce_1 7# happyReduction_20+happyReduction_20 happy_x_1+ = case happyOut12 happy_x_1 of { happy_var_1 -> + happyIn11+ (read happy_var_1+ )}++happyReduce_21 = happySpecReduce_2 7# happyReduction_21+happyReduction_21 happy_x_2+ happy_x_1+ = case happyOut12 happy_x_2 of { happy_var_2 -> + happyIn11+ (read $ '-' : happy_var_2+ )}++happyReduce_22 = happySpecReduce_1 8# happyReduction_22+happyReduction_22 happy_x_1+ = case happyOutTok happy_x_1 of { (TNum happy_var_1) -> + happyIn12+ (happy_var_1+ )}++happyReduce_23 = happySpecReduce_1 8# happyReduction_23+happyReduction_23 happy_x_1+ = happyIn12+ ("1"+ )++happyNewToken action sts stk [] =+ happyDoAction 13# notHappyAtAll action sts stk []++happyNewToken action sts stk (tk:tks) =+ let cont i = happyDoAction i tk action sts stk tks in+ case tk of {+ TId "unit" -> cont 1#;+ TId happy_dollar_dollar -> cont 2#;+ TNum "1" -> cont 3#;+ TNum happy_dollar_dollar -> cont 4#;+ TComma -> cont 5#;+ TMinus -> cont 6#;+ TExponentiation -> cont 7#;+ TDivision -> cont 8#;+ TDoubleColon -> cont 9#;+ TEqual -> cont 10#;+ TLeftPar -> cont 11#;+ TRightPar -> cont 12#;+ _ -> happyError' (tk:tks)+ }++happyError_ 13# tk tks = happyError' tks+happyError_ _ tk tks = happyError' (tk:tks)++happyThen :: () => Either AnnotationParseError a -> (a -> Either AnnotationParseError b) -> Either AnnotationParseError b+happyThen = (>>=)+happyReturn :: () => a -> Either AnnotationParseError a+happyReturn = (return)+happyThen1 m k tks = (>>=) m (\a -> k a tks)+happyReturn1 :: () => a -> b -> Either AnnotationParseError a+happyReturn1 = \a tks -> (return) a+happyError' :: () => [(Token)] -> Either AnnotationParseError a+happyError' = happyError++parseUnit tks = happySomeParser where+ happySomeParser = happyThen (happyParse 0# tks) (\x -> happyReturn (happyOut4 x))++happySeq = happyDontSeq+++data UnitStatement =+ UnitAssignment (Maybe [String]) UnitOfMeasure+ | UnitAlias String UnitOfMeasure+ deriving Data++instance Show UnitStatement where+ show (UnitAssignment (Just ss) uom) = "= unit (" ++ show uom ++ ") :: " ++ (intercalate "," ss)+ show (UnitAssignment Nothing uom) = "= unit (" ++ show uom ++ ")"+ show (UnitAlias s uom) = "= unit :: " ++ s ++ " = " ++ show uom++data UnitOfMeasure =+ Unitless+ | UnitBasic String+ | UnitProduct UnitOfMeasure UnitOfMeasure+ | UnitQuotient UnitOfMeasure UnitOfMeasure+ | UnitExponentiation UnitOfMeasure UnitPower+ deriving Data++instance Show UnitOfMeasure where+ show Unitless = "1"+ show (UnitBasic s) = s+ show (UnitProduct uom1 uom2) = show uom1 ++ " " ++ show uom2+ show (UnitQuotient uom1 uom2) = show uom1 ++ " / " ++ show uom2+ show (UnitExponentiation uom exp) = show uom ++ "** (" ++ show exp ++ ")"++data UnitPower =+ UnitPowerInteger Integer+ | UnitPowerRational Integer Integer+ deriving Data++instance Show UnitPower where+ show (UnitPowerInteger i) = show i+ show (UnitPowerRational i1 i2) = show i1 ++ "/" ++ show i2++data Token =+ TUnit+ | TComma+ | TDoubleColon+ | TExponentiation+ | TDivision+ | TMinus+ | TEqual+ | TLeftPar+ | TRightPar+ | TId String+ | TNum String+ deriving (Show)++lexer :: String -> Either AnnotationParseError [ Token ]+lexer [] = Left NotAnnotation+lexer (c:xs)+ | c `elem` ['=', '!', '>', '<'] =+ -- First test to see if the input looks like an actual unit specification+ if "unit" `isPrefixOf` (T.unpack . T.strip . T.toLower . T.pack $ xs)+ then lexer' xs+ else Left NotAnnotation+ | otherwise = Left NotAnnotation++addToTokens :: Token -> String -> Either AnnotationParseError [ Token ]+addToTokens tok rest = do+ tokens <- lexer' rest+ return $ tok : tokens++lexer' :: String -> Either AnnotationParseError [ Token ]+lexer' [] = Right []+lexer' ['\n'] = Right []+lexer' ['\r', '\n'] = Right []+lexer' ['\r'] = Right [] -- windows+lexer' (' ':xs) = lexer' xs+lexer' ('\t':xs) = lexer' xs+lexer' (':':':':xs) = addToTokens TDoubleColon xs+lexer' ('*':'*':xs) = addToTokens TExponentiation xs+lexer' (',':xs) = addToTokens TComma xs+lexer' ('/':xs) = addToTokens TDivision xs+lexer' ('-':xs) = addToTokens TMinus xs+lexer' ('=':xs) = addToTokens TEqual xs+lexer' ('(':xs) = addToTokens TLeftPar xs+lexer' (')':xs) = addToTokens TRightPar xs+lexer' (x:xs)+ | isLetter x = aux (\c -> isAlphaNum c || c `elem` ['\'','_','-']) TId+ | isNumber x = aux isNumber TNum+ | otherwise = failWith $ "Not valid unit syntax at " ++ show (x:xs) ++ "\n"+ where+ aux p cons =+ let (target, rest) = span p xs+ in lexer' rest >>= (\tokens -> return $ cons (x:target) : tokens)++unitParser :: String -> Either AnnotationParseError UnitStatement+unitParser src = do+ tokens <- lexer $ map toLower src+ parseUnit tokens++happyError :: [ Token ] -> Either AnnotationParseError a+happyError t = failWith $ "Could not parse unit specification at: " ++ show t ++ "\n"+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 19 "<built-in>" #-}+{-# LINE 1 "/usr/local/lib/ghc-7.10.2/include/ghcversion.h" #-}+++++++++++++++++++{-# LINE 20 "<built-in>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp +++{-# LINE 13 "templates/GenericTemplate.hs" #-}++++++-- Do not remove this comment. Required to fix CPP parsing when using GCC and a clang-compiled alex.+#if __GLASGOW_HASKELL__ > 706+#define LT(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.<# m)) :: Bool)+#define GTE(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.>=# m)) :: Bool)+#define EQ(n,m) ((Happy_GHC_Exts.tagToEnum# (n Happy_GHC_Exts.==# m)) :: Bool)+#else+#define LT(n,m) (n Happy_GHC_Exts.<# m)+#define GTE(n,m) (n Happy_GHC_Exts.>=# m)+#define EQ(n,m) (n Happy_GHC_Exts.==# m)+#endif++{-# LINE 46 "templates/GenericTemplate.hs" #-}+++data Happy_IntList = HappyCons Happy_GHC_Exts.Int# Happy_IntList+++++++{-# LINE 67 "templates/GenericTemplate.hs" #-}+++{-# LINE 77 "templates/GenericTemplate.hs" #-}+++++++++++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is 0#, it means we've just accepted a partial+-- parse (a %partial parser). We must ignore the saved token on the top of+-- the stack in this case.+happyAccept 0# tk st sts (_ `HappyStk` ans `HappyStk` _) =+ happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = + (happyTcHack j (happyTcHack st)) (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action++++happyDoAction i tk st+ = {- nothing -}+ ++ case action of+ 0# -> {- nothing -}+ happyFail i tk st+ -1# -> {- nothing -}+ happyAccept i tk st+ n | LT(n,(0# :: Happy_GHC_Exts.Int#)) -> {- nothing -}+ + (happyReduceArr Happy_Data_Array.! rule) i tk st+ where rule = (Happy_GHC_Exts.I# ((Happy_GHC_Exts.negateInt# ((n Happy_GHC_Exts.+# (1# :: Happy_GHC_Exts.Int#))))))+ n -> {- nothing -}+ ++ happyShift new_state i tk st+ where new_state = (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#))+ where off = indexShortOffAddr happyActOffsets st+ off_i = (off Happy_GHC_Exts.+# i)+ check = if GTE(off_i,(0# :: Happy_GHC_Exts.Int#))+ then EQ(indexShortOffAddr happyCheck off_i, i)+ else False+ action+ | check = indexShortOffAddr happyTable off_i+ | otherwise = indexShortOffAddr happyDefActions st+++indexShortOffAddr (HappyA# arr) off =+ Happy_GHC_Exts.narrow16Int# i+ where+ i = Happy_GHC_Exts.word2Int# (Happy_GHC_Exts.or# (Happy_GHC_Exts.uncheckedShiftL# high 8#) low)+ high = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr (off' Happy_GHC_Exts.+# 1#)))+ low = Happy_GHC_Exts.int2Word# (Happy_GHC_Exts.ord# (Happy_GHC_Exts.indexCharOffAddr# arr off'))+ off' = off Happy_GHC_Exts.*# 2#++++++data HappyAddr = HappyA# Happy_GHC_Exts.Addr#+++++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)+++{-# LINE 170 "templates/GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state 0# tk st sts stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "shifting the error token" $+ happyDoAction i tk new_state (HappyCons (st) (sts)) (stk)++happyShift new_state i tk st sts stk =+ happyNewToken new_state (HappyCons (st) (sts)) ((happyInTok (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_0 nt fn j tk st@((action)) sts stk+ = happyGoto nt j tk st (HappyCons (st) (sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@((HappyCons (st@(action)) (_))) (v1`HappyStk`stk')+ = let r = fn v1 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_2 nt fn j tk _ (HappyCons (_) (sts@((HappyCons (st@(action)) (_))))) (v1`HappyStk`v2`HappyStk`stk')+ = let r = fn v1 v2 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happySpecReduce_3 nt fn j tk _ (HappyCons (_) ((HappyCons (_) (sts@((HappyCons (st@(action)) (_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+ = let r = fn v1 v2 v3 in+ happySeq r (happyGoto nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyReduce k nt fn j tk st sts stk+ = case happyDrop (k Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) sts of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let r = fn stk in -- it doesn't hurt to always seq here...+ happyDoSeq r (happyGoto nt j tk st1 sts1 r)++happyMonadReduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk in+ happyThen1 (fn stk tk) (\r -> happyGoto nt j tk st1 sts1 (r `HappyStk` drop_stk))++happyMonad2Reduce k nt fn 0# tk st sts stk+ = happyFail 0# tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+ case happyDrop k (HappyCons (st) (sts)) of+ sts1@((HappyCons (st1@(action)) (_))) ->+ let drop_stk = happyDropStk k stk++ off = indexShortOffAddr happyGotoOffsets st1+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i++++ in+ happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))++happyDrop 0# l = l+happyDrop n (HappyCons (_) (t)) = happyDrop (n Happy_GHC_Exts.-# (1# :: Happy_GHC_Exts.Int#)) t++happyDropStk 0# l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n Happy_GHC_Exts.-# (1#::Happy_GHC_Exts.Int#)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction+++happyGoto nt j tk st = + {- nothing -}+ happyDoAction j tk new_state+ where off = indexShortOffAddr happyGotoOffsets st+ off_i = (off Happy_GHC_Exts.+# nt)+ new_state = indexShortOffAddr happyTable off_i+++++-----------------------------------------------------------------------------+-- Error recovery (0# is the error token)++-- parse error if we are in recovery and we fail again+happyFail 0# tk old_st _ stk@(x `HappyStk` _) =+ let i = (case Happy_GHC_Exts.unsafeCoerce# x of { (Happy_GHC_Exts.I# (i)) -> i }) in+-- trace "failing" $ + happyError_ i tk++{- We don't need state discarding for our restricted implementation of+ "error". In fact, it can cause some bogus parses, so I've disabled it+ for now --SDM++-- discard a state+happyFail 0# tk old_st (HappyCons ((action)) (sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) =+-- trace ("discarding state, depth " ++ show (length stk)) $+ happyDoAction 0# tk action sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+-- save the old token and carry on.+happyFail i tk (action) sts stk =+-- trace "entering error recovery" $+ happyDoAction 0# tk action sts ( (Happy_GHC_Exts.unsafeCoerce# (Happy_GHC_Exts.I# (i))) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll :: a+notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions+++happyTcHack :: Happy_GHC_Exts.Int# -> a -> a+happyTcHack x y = y+{-# INLINE happyTcHack #-}+++-----------------------------------------------------------------------------+-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq+-- otherwise it emits+-- happySeq = happyDontSeq++happyDoSeq, happyDontSeq :: a -> b -> b+happyDoSeq a b = a `seq` b+happyDontSeq a b = b++-----------------------------------------------------------------------------+-- Don't inline any functions from the template. GHC has a nasty habit+-- of deciding to inline happyGoto everywhere, which increases the size of+-- the generated parser quite a bit.+++{-# NOINLINE happyDoAction #-}+{-# NOINLINE happyTable #-}+{-# NOINLINE happyCheck #-}+{-# NOINLINE happyActOffsets #-}+{-# NOINLINE happyGotoOffsets #-}+{-# NOINLINE happyDefActions #-}++{-# NOINLINE happyShift #-}+{-# NOINLINE happySpecReduce_0 #-}+{-# NOINLINE happySpecReduce_1 #-}+{-# NOINLINE happySpecReduce_2 #-}+{-# NOINLINE happySpecReduce_3 #-}+{-# NOINLINE happyReduce #-}+{-# NOINLINE happyMonadReduce #-}+{-# NOINLINE happyGoto #-}+{-# NOINLINE happyFail #-}++-- end of Happy Template.+
src/Camfort/Functionality.hs view
@@ -78,8 +78,8 @@ getExcludes = getOption -- * Wrappers on all of the features-ast d excludes f _ = do- xs <- readParseSrcDir (d ++ "/" ++ f) excludes+ast d excludes _ _ = do+ xs <- readParseSrcDir d excludes print (map (\(_, _, p) -> p) xs) countVarDecls inSrc excludes _ _ = do
src/Camfort/Output.hs view
@@ -144,7 +144,7 @@ lb' = leftOne lb (p0, _) = takeBounds (cursor, lb') inp nl = if null comment then B.empty else B.pack "\n"- in put ub >> return (B.concat [p0, B.pack comment, nl], True)+ in (put ub >> return (B.concat [p0, B.pack comment, nl], True)) else return (B.empty, False) where leftOne (FU.Position f c l) = FU.Position f (c-1) (l-1)
src/Camfort/Specification/Stencils/CheckFrontend.hs view
@@ -64,7 +64,7 @@ let gr = FAB.superBBGrGraph sgr -- get map of variable name ==> { defining AST-Block-IDs } let dm = FAD.genDefMap bm- let pprint = map (\(span, spec) -> show span ++ "\t" ++ spec)+ let pprint = map (\(span, spec) -> show span ++ " " ++ spec) -- perform reaching definitions analysis let rd = FAD.reachingDefinitions dm gr -- create graph of definition "flows"@@ -144,7 +144,7 @@ Just subs -> do -- Create list of relative indices ivmap <- snd <$> get- -- Do inference+ -- Do analysis let realName v = v `fromMaybe` (v `M.lookup` ?nameMap) let lhsN = fromMaybe [] (neighbourIndex ivmap subs) let correctNames = map (first realName)@@ -161,12 +161,14 @@ else do let correctNames2 = map (first (map realName)) let inferred = correctNames2 . fst . runWriter $ genSpecifications ivmap lhsN [s]- tell [ (span, "Not well specified.\n"- ++ "\tSpecification is:\t "- ++ pprintSpecDecls specDecls- ++ "\tbut at " ++ show span' ++ " the code behaves as"- ++ "\n\t \t "- ++ pprintSpecDecls inferred) ]+ let sp = replicate 8 ' '+ tell [ (span,+ "Not well specified.\n"+ ++ sp ++ "Specification is:\n"+ ++ sp ++ sp ++ pprintSpecDecls specDecls ++ "\n"+ ++ sp ++ "but at " ++ show span' ++ " the code behaves as\n"+ ++ sp ++ sp ++ pprintSpecDecls inferred) ]+ return b' Nothing -> return b'
+ src/Camfort/Specification/Stencils/Grammar.hs view
@@ -0,0 +1,1275 @@+{-# OPTIONS_GHC -w #-}+-- -*- Mode: Haskell -*-+{-# LANGUAGE DeriveDataTypeable, PatternGuards #-}+module Camfort.Specification.Stencils.Grammar+( specParser, Specification(..), Region(..), Spec(..), Mod(..), lexer ) where++import Data.Char (isLetter, isNumber, isAlphaNum, toLower, isAlpha, isSpace)+import Data.List (intersect, sort, isPrefixOf)+import Data.Data++import Debug.Trace++import Camfort.Analysis.CommentAnnotator+import Camfort.Specification.Stencils.Syntax (showL)+import Control.Applicative(Applicative(..))+import Control.Monad (ap)++-- parser produced by Happy Version 1.19.5++data HappyAbsSyn + = HappyTerminal (Token)+ | HappyErrorToken Int+ | HappyAbsSyn4 (Specification)+ | HappyAbsSyn5 ((String, Region))+ | HappyAbsSyn6 (Region)+ | HappyAbsSyn7 ((Depth Int, Dim Int, Bool))+ | HappyAbsSyn8 ((Dim Int, Bool))+ | HappyAbsSyn9 ((Depth Int, Bool))+ | HappyAbsSyn10 (Depth Int)+ | HappyAbsSyn11 (Dim Int)+ | HappyAbsSyn12 (Bool)+ | HappyAbsSyn13 (Spec)+ | HappyAbsSyn14 (Mod)+ | HappyAbsSyn15 ([Mod])+ | HappyAbsSyn17 ([String])++{- to allow type-synonyms as our monads (likely+ - with explicitly-specified bind and return)+ - in Haskell98, it seems that with+ - /type M a = .../, then /(HappyReduction M)/+ - is not allowed. But Happy is a+ - code-generator that can just substitute it.+type HappyReduction m = + Int + -> (Token)+ -> HappyState (Token) (HappyStk HappyAbsSyn -> [(Token)] -> m HappyAbsSyn)+ -> [HappyState (Token) (HappyStk HappyAbsSyn -> [(Token)] -> m HappyAbsSyn)] + -> HappyStk HappyAbsSyn + -> [(Token)] -> m HappyAbsSyn+-}++action_0,+ action_1,+ action_2,+ action_3,+ action_4,+ action_5,+ action_6,+ action_7,+ action_8,+ action_9,+ action_10,+ action_11,+ action_12,+ action_13,+ action_14,+ action_15,+ action_16,+ action_17,+ action_18,+ action_19,+ action_20,+ action_21,+ action_22,+ action_23,+ action_24,+ action_25,+ action_26,+ action_27,+ action_28,+ action_29,+ action_30,+ action_31,+ action_32,+ action_33,+ action_34,+ action_35,+ action_36,+ action_37,+ action_38,+ action_39,+ action_40,+ action_41,+ action_42,+ action_43,+ action_44,+ action_45,+ action_46,+ action_47,+ action_48,+ action_49,+ action_50,+ action_51,+ action_52,+ action_53,+ action_54,+ action_55,+ action_56,+ action_57,+ action_58,+ action_59,+ action_60,+ action_61,+ action_62,+ action_63,+ action_64,+ action_65,+ action_66,+ action_67,+ action_68,+ action_69,+ action_70,+ action_71,+ action_72,+ action_73,+ action_74,+ action_75,+ action_76,+ action_77,+ action_78,+ action_79,+ action_80,+ action_81,+ action_82 :: () => Int -> ({-HappyReduction (Either AnnotationParseError) = -}+ Int + -> (Token)+ -> HappyState (Token) (HappyStk HappyAbsSyn -> [(Token)] -> (Either AnnotationParseError) HappyAbsSyn)+ -> [HappyState (Token) (HappyStk HappyAbsSyn -> [(Token)] -> (Either AnnotationParseError) HappyAbsSyn)] + -> HappyStk HappyAbsSyn + -> [(Token)] -> (Either AnnotationParseError) HappyAbsSyn)++happyReduce_1,+ happyReduce_2,+ happyReduce_3,+ happyReduce_4,+ happyReduce_5,+ happyReduce_6,+ happyReduce_7,+ happyReduce_8,+ happyReduce_9,+ happyReduce_10,+ happyReduce_11,+ happyReduce_12,+ happyReduce_13,+ happyReduce_14,+ happyReduce_15,+ happyReduce_16,+ happyReduce_17,+ happyReduce_18,+ happyReduce_19,+ happyReduce_20,+ happyReduce_21,+ happyReduce_22,+ happyReduce_23,+ happyReduce_24,+ happyReduce_25,+ happyReduce_26,+ happyReduce_27,+ happyReduce_28,+ happyReduce_29,+ happyReduce_30,+ happyReduce_31,+ happyReduce_32,+ happyReduce_33,+ happyReduce_34,+ happyReduce_35,+ happyReduce_36,+ happyReduce_37 :: () => ({-HappyReduction (Either AnnotationParseError) = -}+ Int + -> (Token)+ -> HappyState (Token) (HappyStk HappyAbsSyn -> [(Token)] -> (Either AnnotationParseError) HappyAbsSyn)+ -> [HappyState (Token) (HappyStk HappyAbsSyn -> [(Token)] -> (Either AnnotationParseError) HappyAbsSyn)] + -> HappyStk HappyAbsSyn + -> [(Token)] -> (Either AnnotationParseError) HappyAbsSyn)++action_0 (18) = happyShift action_5+action_0 (19) = happyShift action_3+action_0 (4) = happyGoto action_4+action_0 (5) = happyGoto action_2+action_0 _ = happyFail++action_1 (19) = happyShift action_3+action_1 (5) = happyGoto action_2+action_1 _ = happyFail++action_2 _ = happyReduce_1++action_3 (36) = happyShift action_21+action_3 _ = happyFail++action_4 (40) = happyAccept+action_4 _ = happyFail++action_5 (20) = happyShift action_11+action_5 (21) = happyShift action_12+action_5 (23) = happyShift action_13+action_5 (24) = happyShift action_14+action_5 (27) = happyShift action_15+action_5 (28) = happyShift action_16+action_5 (29) = happyShift action_17+action_5 (30) = happyShift action_18+action_5 (32) = happyShift action_19+action_5 (38) = happyShift action_20+action_5 (6) = happyGoto action_6+action_5 (13) = happyGoto action_7+action_5 (14) = happyGoto action_8+action_5 (15) = happyGoto action_9+action_5 (16) = happyGoto action_10+action_5 _ = happyFail++action_6 (34) = happyShift action_35+action_6 (35) = happyShift action_36+action_6 _ = happyReduce_30++action_7 (36) = happyShift action_34+action_7 _ = happyFail++action_8 (21) = happyShift action_12+action_8 (27) = happyShift action_15+action_8 (28) = happyShift action_16+action_8 (29) = happyShift action_17+action_8 (32) = happyShift action_19+action_8 (38) = happyShift action_20+action_8 (6) = happyGoto action_33+action_8 _ = happyFail++action_9 (20) = happyShift action_11+action_9 (14) = happyGoto action_32+action_9 _ = happyFail++action_10 (21) = happyShift action_12+action_10 (23) = happyShift action_13+action_10 (24) = happyShift action_14+action_10 (27) = happyShift action_15+action_10 (28) = happyShift action_16+action_10 (29) = happyShift action_17+action_10 (32) = happyShift action_19+action_10 (38) = happyShift action_20+action_10 (6) = happyGoto action_29+action_10 (15) = happyGoto action_30+action_10 (16) = happyGoto action_31+action_10 _ = happyReduce_33++action_11 _ = happyReduce_31++action_12 (38) = happyShift action_28+action_12 _ = happyFail++action_13 _ = happyReduce_34++action_14 _ = happyReduce_35++action_15 (38) = happyShift action_27+action_15 _ = happyFail++action_16 (38) = happyShift action_26+action_16 _ = happyFail++action_17 (38) = happyShift action_25+action_17 _ = happyFail++action_18 (38) = happyShift action_24+action_18 _ = happyFail++action_19 _ = happyReduce_11++action_20 (21) = happyShift action_12+action_20 (27) = happyShift action_15+action_20 (28) = happyShift action_16+action_20 (29) = happyShift action_17+action_20 (32) = happyShift action_19+action_20 (38) = happyShift action_20+action_20 (6) = happyGoto action_23+action_20 _ = happyFail++action_21 (32) = happyShift action_22+action_21 _ = happyFail++action_22 (37) = happyShift action_54+action_22 _ = happyFail++action_23 (34) = happyShift action_35+action_23 (35) = happyShift action_36+action_23 (39) = happyShift action_53+action_23 _ = happyFail++action_24 (32) = happyShift action_40+action_24 (17) = happyGoto action_52+action_24 _ = happyFail++action_25 (22) = happyShift action_47+action_25 (25) = happyShift action_48+action_25 (26) = happyShift action_49+action_25 (7) = happyGoto action_51+action_25 (10) = happyGoto action_44+action_25 (11) = happyGoto action_45+action_25 (12) = happyGoto action_46+action_25 _ = happyFail++action_26 (22) = happyShift action_47+action_26 (25) = happyShift action_48+action_26 (26) = happyShift action_49+action_26 (7) = happyGoto action_50+action_26 (10) = happyGoto action_44+action_26 (11) = happyGoto action_45+action_26 (12) = happyGoto action_46+action_26 _ = happyFail++action_27 (22) = happyShift action_47+action_27 (25) = happyShift action_48+action_27 (26) = happyShift action_49+action_27 (7) = happyGoto action_43+action_27 (10) = happyGoto action_44+action_27 (11) = happyGoto action_45+action_27 (12) = happyGoto action_46+action_27 _ = happyFail++action_28 (25) = happyShift action_42+action_28 _ = happyFail++action_29 (34) = happyShift action_35+action_29 (35) = happyShift action_36+action_29 _ = happyReduce_29++action_30 _ = happyReduce_32++action_31 (23) = happyShift action_13+action_31 (24) = happyShift action_14+action_31 (15) = happyGoto action_30+action_31 (16) = happyGoto action_31+action_31 _ = happyReduce_33++action_32 (21) = happyShift action_12+action_32 (27) = happyShift action_15+action_32 (28) = happyShift action_16+action_32 (29) = happyShift action_17+action_32 (32) = happyShift action_19+action_32 (38) = happyShift action_20+action_32 (6) = happyGoto action_41+action_32 _ = happyFail++action_33 (34) = happyShift action_35+action_33 (35) = happyShift action_36+action_33 _ = happyReduce_28++action_34 (32) = happyShift action_40+action_34 (17) = happyGoto action_39+action_34 _ = happyFail++action_35 (21) = happyShift action_12+action_35 (27) = happyShift action_15+action_35 (28) = happyShift action_16+action_35 (29) = happyShift action_17+action_35 (32) = happyShift action_19+action_35 (38) = happyShift action_20+action_35 (6) = happyGoto action_38+action_35 _ = happyFail++action_36 (21) = happyShift action_12+action_36 (27) = happyShift action_15+action_36 (28) = happyShift action_16+action_36 (29) = happyShift action_17+action_36 (32) = happyShift action_19+action_36 (38) = happyShift action_20+action_36 (6) = happyGoto action_37+action_36 _ = happyFail++action_37 _ = happyReduce_9++action_38 (35) = happyShift action_36+action_38 _ = happyReduce_8++action_39 _ = happyReduce_2++action_40 (32) = happyShift action_40+action_40 (17) = happyGoto action_71+action_40 _ = happyReduce_37++action_41 (34) = happyShift action_35+action_41 (35) = happyShift action_36+action_41 _ = happyReduce_27++action_42 (37) = happyShift action_70+action_42 _ = happyFail++action_43 (39) = happyShift action_69+action_43 _ = happyFail++action_44 (22) = happyShift action_47+action_44 (25) = happyShift action_48+action_44 (8) = happyGoto action_66+action_44 (11) = happyGoto action_67+action_44 (12) = happyGoto action_68+action_44 _ = happyFail++action_45 (22) = happyShift action_47+action_45 (26) = happyShift action_49+action_45 (9) = happyGoto action_63+action_45 (10) = happyGoto action_64+action_45 (12) = happyGoto action_65+action_45 _ = happyFail++action_46 (25) = happyShift action_48+action_46 (26) = happyShift action_49+action_46 (10) = happyGoto action_61+action_46 (11) = happyGoto action_62+action_46 _ = happyFail++action_47 _ = happyReduce_24++action_48 (37) = happyShift action_60+action_48 _ = happyFail++action_49 (37) = happyShift action_59+action_49 _ = happyFail++action_50 (39) = happyShift action_58+action_50 _ = happyFail++action_51 (39) = happyShift action_57+action_51 _ = happyFail++action_52 (39) = happyShift action_56+action_52 _ = happyFail++action_53 _ = happyReduce_10++action_54 (21) = happyShift action_12+action_54 (27) = happyShift action_15+action_54 (28) = happyShift action_16+action_54 (29) = happyShift action_17+action_54 (32) = happyShift action_19+action_54 (38) = happyShift action_20+action_54 (6) = happyGoto action_55+action_54 _ = happyFail++action_55 (34) = happyShift action_35+action_55 (35) = happyShift action_36+action_55 _ = happyReduce_3++action_56 (31) = happyShift action_81+action_56 _ = happyReduce_25++action_57 _ = happyReduce_6++action_58 _ = happyReduce_5++action_59 (33) = happyShift action_80+action_59 _ = happyFail++action_60 (33) = happyShift action_79+action_60 _ = happyFail++action_61 (25) = happyShift action_48+action_61 (11) = happyGoto action_78+action_61 _ = happyFail++action_62 (26) = happyShift action_49+action_62 (10) = happyGoto action_77+action_62 _ = happyFail++action_63 _ = happyReduce_13++action_64 (22) = happyShift action_47+action_64 (12) = happyGoto action_76+action_64 _ = happyReduce_21++action_65 (26) = happyShift action_49+action_65 (10) = happyGoto action_75+action_65 _ = happyFail++action_66 _ = happyReduce_12++action_67 (22) = happyShift action_47+action_67 (12) = happyGoto action_74+action_67 _ = happyReduce_18++action_68 (25) = happyShift action_48+action_68 (11) = happyGoto action_73+action_68 _ = happyFail++action_69 _ = happyReduce_4++action_70 (33) = happyShift action_72+action_70 _ = happyFail++action_71 _ = happyReduce_36++action_72 (39) = happyShift action_82+action_72 _ = happyFail++action_73 _ = happyReduce_16++action_74 _ = happyReduce_17++action_75 _ = happyReduce_20++action_76 _ = happyReduce_19++action_77 _ = happyReduce_15++action_78 _ = happyReduce_14++action_79 _ = happyReduce_23++action_80 _ = happyReduce_22++action_81 _ = happyReduce_26++action_82 _ = happyReduce_7++happyReduce_1 = happySpecReduce_1 4 happyReduction_1+happyReduction_1 (HappyAbsSyn5 happy_var_1)+ = HappyAbsSyn4+ (RegionDec (fst happy_var_1) (snd happy_var_1)+ )+happyReduction_1 _ = notHappyAtAll ++happyReduce_2 = happyReduce 4 4 happyReduction_2+happyReduction_2 ((HappyAbsSyn17 happy_var_4) `HappyStk`+ _ `HappyStk`+ (HappyAbsSyn13 happy_var_2) `HappyStk`+ _ `HappyStk`+ happyRest)+ = HappyAbsSyn4+ (SpecDec happy_var_2 happy_var_4+ ) `HappyStk` happyRest++happyReduce_3 = happyReduce 5 5 happyReduction_3+happyReduction_3 ((HappyAbsSyn6 happy_var_5) `HappyStk`+ _ `HappyStk`+ (HappyTerminal (TId happy_var_3)) `HappyStk`+ _ `HappyStk`+ _ `HappyStk`+ happyRest)+ = HappyAbsSyn5+ ((happy_var_3, happy_var_5)+ ) `HappyStk` happyRest++happyReduce_4 = happyReduce 4 6 happyReduction_4+happyReduction_4 (_ `HappyStk`+ (HappyAbsSyn7 happy_var_3) `HappyStk`+ _ `HappyStk`+ _ `HappyStk`+ happyRest)+ = HappyAbsSyn6+ (applyAttr Forward happy_var_3+ ) `HappyStk` happyRest++happyReduce_5 = happyReduce 4 6 happyReduction_5+happyReduction_5 (_ `HappyStk`+ (HappyAbsSyn7 happy_var_3) `HappyStk`+ _ `HappyStk`+ _ `HappyStk`+ happyRest)+ = HappyAbsSyn6+ (applyAttr Backward happy_var_3+ ) `HappyStk` happyRest++happyReduce_6 = happyReduce 4 6 happyReduction_6+happyReduction_6 (_ `HappyStk`+ (HappyAbsSyn7 happy_var_3) `HappyStk`+ _ `HappyStk`+ _ `HappyStk`+ happyRest)+ = HappyAbsSyn6+ (applyAttr Centered happy_var_3+ ) `HappyStk` happyRest++happyReduce_7 = happyReduce 6 6 happyReduction_7+happyReduction_7 (_ `HappyStk`+ (HappyTerminal (TNum happy_var_5)) `HappyStk`+ _ `HappyStk`+ _ `HappyStk`+ _ `HappyStk`+ _ `HappyStk`+ happyRest)+ = HappyAbsSyn6+ (Centered 0 (read happy_var_5) True+ ) `HappyStk` happyRest++happyReduce_8 = happySpecReduce_3 6 happyReduction_8+happyReduction_8 (HappyAbsSyn6 happy_var_3)+ _+ (HappyAbsSyn6 happy_var_1)+ = HappyAbsSyn6+ (Or happy_var_1 happy_var_3+ )+happyReduction_8 _ _ _ = notHappyAtAll ++happyReduce_9 = happySpecReduce_3 6 happyReduction_9+happyReduction_9 (HappyAbsSyn6 happy_var_3)+ _+ (HappyAbsSyn6 happy_var_1)+ = HappyAbsSyn6+ (And happy_var_1 happy_var_3+ )+happyReduction_9 _ _ _ = notHappyAtAll ++happyReduce_10 = happySpecReduce_3 6 happyReduction_10+happyReduction_10 _+ (HappyAbsSyn6 happy_var_2)+ _+ = HappyAbsSyn6+ (happy_var_2+ )+happyReduction_10 _ _ _ = notHappyAtAll ++happyReduce_11 = happySpecReduce_1 6 happyReduction_11+happyReduction_11 (HappyTerminal (TId happy_var_1))+ = HappyAbsSyn6+ (Var happy_var_1+ )+happyReduction_11 _ = notHappyAtAll ++happyReduce_12 = happySpecReduce_2 7 happyReduction_12+happyReduction_12 (HappyAbsSyn8 happy_var_2)+ (HappyAbsSyn10 happy_var_1)+ = HappyAbsSyn7+ ((happy_var_1, fst happy_var_2, snd happy_var_2)+ )+happyReduction_12 _ _ = notHappyAtAll ++happyReduce_13 = happySpecReduce_2 7 happyReduction_13+happyReduction_13 (HappyAbsSyn9 happy_var_2)+ (HappyAbsSyn11 happy_var_1)+ = HappyAbsSyn7+ ((fst happy_var_2, happy_var_1, snd happy_var_2)+ )+happyReduction_13 _ _ = notHappyAtAll ++happyReduce_14 = happySpecReduce_3 7 happyReduction_14+happyReduction_14 (HappyAbsSyn11 happy_var_3)+ (HappyAbsSyn10 happy_var_2)+ (HappyAbsSyn12 happy_var_1)+ = HappyAbsSyn7+ ((happy_var_2, happy_var_3, happy_var_1)+ )+happyReduction_14 _ _ _ = notHappyAtAll ++happyReduce_15 = happySpecReduce_3 7 happyReduction_15+happyReduction_15 (HappyAbsSyn10 happy_var_3)+ (HappyAbsSyn11 happy_var_2)+ (HappyAbsSyn12 happy_var_1)+ = HappyAbsSyn7+ ((happy_var_3, happy_var_2, happy_var_1)+ )+happyReduction_15 _ _ _ = notHappyAtAll ++happyReduce_16 = happySpecReduce_2 8 happyReduction_16+happyReduction_16 (HappyAbsSyn11 happy_var_2)+ (HappyAbsSyn12 happy_var_1)+ = HappyAbsSyn8+ ((happy_var_2, happy_var_1)+ )+happyReduction_16 _ _ = notHappyAtAll ++happyReduce_17 = happySpecReduce_2 8 happyReduction_17+happyReduction_17 (HappyAbsSyn12 happy_var_2)+ (HappyAbsSyn11 happy_var_1)+ = HappyAbsSyn8+ ((happy_var_1, happy_var_2)+ )+happyReduction_17 _ _ = notHappyAtAll ++happyReduce_18 = happySpecReduce_1 8 happyReduction_18+happyReduction_18 (HappyAbsSyn11 happy_var_1)+ = HappyAbsSyn8+ ((happy_var_1, True)+ )+happyReduction_18 _ = notHappyAtAll ++happyReduce_19 = happySpecReduce_2 9 happyReduction_19+happyReduction_19 (HappyAbsSyn12 happy_var_2)+ (HappyAbsSyn10 happy_var_1)+ = HappyAbsSyn9+ ((happy_var_1, happy_var_2)+ )+happyReduction_19 _ _ = notHappyAtAll ++happyReduce_20 = happySpecReduce_2 9 happyReduction_20+happyReduction_20 (HappyAbsSyn10 happy_var_2)+ (HappyAbsSyn12 happy_var_1)+ = HappyAbsSyn9+ ((happy_var_2, happy_var_1)+ )+happyReduction_20 _ _ = notHappyAtAll ++happyReduce_21 = happySpecReduce_1 9 happyReduction_21+happyReduction_21 (HappyAbsSyn10 happy_var_1)+ = HappyAbsSyn9+ ((happy_var_1, True)+ )+happyReduction_21 _ = notHappyAtAll ++happyReduce_22 = happySpecReduce_3 10 happyReduction_22+happyReduction_22 (HappyTerminal (TNum happy_var_3))+ _+ _+ = HappyAbsSyn10+ (Depth $ read happy_var_3+ )+happyReduction_22 _ _ _ = notHappyAtAll ++happyReduce_23 = happySpecReduce_3 11 happyReduction_23+happyReduction_23 (HappyTerminal (TNum happy_var_3))+ _+ _+ = HappyAbsSyn11+ (Dim $ read happy_var_3+ )+happyReduction_23 _ _ _ = notHappyAtAll ++happyReduce_24 = happySpecReduce_1 12 happyReduction_24+happyReduction_24 _+ = HappyAbsSyn12+ (False+ )++happyReduce_25 = happyReduce 4 13 happyReduction_25+happyReduction_25 (_ `HappyStk`+ (HappyAbsSyn17 happy_var_3) `HappyStk`+ _ `HappyStk`+ _ `HappyStk`+ happyRest)+ = HappyAbsSyn13+ (Temporal happy_var_3 False+ ) `HappyStk` happyRest++happyReduce_26 = happyReduce 5 13 happyReduction_26+happyReduction_26 (_ `HappyStk`+ _ `HappyStk`+ (HappyAbsSyn17 happy_var_3) `HappyStk`+ _ `HappyStk`+ _ `HappyStk`+ happyRest)+ = HappyAbsSyn13+ (Temporal happy_var_3 True+ ) `HappyStk` happyRest++happyReduce_27 = happySpecReduce_3 13 happyReduction_27+happyReduction_27 (HappyAbsSyn6 happy_var_3)+ (HappyAbsSyn14 happy_var_2)+ (HappyAbsSyn15 happy_var_1)+ = HappyAbsSyn13+ (Spatial (happy_var_1 ++ [happy_var_2]) happy_var_3+ )+happyReduction_27 _ _ _ = notHappyAtAll ++happyReduce_28 = happySpecReduce_2 13 happyReduction_28+happyReduction_28 (HappyAbsSyn6 happy_var_2)+ (HappyAbsSyn14 happy_var_1)+ = HappyAbsSyn13+ (Spatial [happy_var_1] happy_var_2+ )+happyReduction_28 _ _ = notHappyAtAll ++happyReduce_29 = happySpecReduce_2 13 happyReduction_29+happyReduction_29 (HappyAbsSyn6 happy_var_2)+ (HappyAbsSyn14 happy_var_1)+ = HappyAbsSyn13+ (Spatial [happy_var_1] happy_var_2+ )+happyReduction_29 _ _ = notHappyAtAll ++happyReduce_30 = happySpecReduce_1 13 happyReduction_30+happyReduction_30 (HappyAbsSyn6 happy_var_1)+ = HappyAbsSyn13+ (Spatial [] happy_var_1+ )+happyReduction_30 _ = notHappyAtAll ++happyReduce_31 = happySpecReduce_1 14 happyReduction_31+happyReduction_31 _+ = HappyAbsSyn14+ (ReadOnce+ )++happyReduce_32 = happySpecReduce_2 15 happyReduction_32+happyReduction_32 (HappyAbsSyn15 happy_var_2)+ (HappyAbsSyn14 happy_var_1)+ = HappyAbsSyn15+ (happy_var_1 : happy_var_2+ )+happyReduction_32 _ _ = notHappyAtAll ++happyReduce_33 = happySpecReduce_1 15 happyReduction_33+happyReduction_33 (HappyAbsSyn14 happy_var_1)+ = HappyAbsSyn15+ ([happy_var_1]+ )+happyReduction_33 _ = notHappyAtAll ++happyReduce_34 = happySpecReduce_1 16 happyReduction_34+happyReduction_34 _+ = HappyAbsSyn14+ (AtMost+ )++happyReduce_35 = happySpecReduce_1 16 happyReduction_35+happyReduction_35 _+ = HappyAbsSyn14+ (AtLeast+ )++happyReduce_36 = happySpecReduce_2 17 happyReduction_36+happyReduction_36 (HappyAbsSyn17 happy_var_2)+ (HappyTerminal (TId happy_var_1))+ = HappyAbsSyn17+ (happy_var_1 : happy_var_2+ )+happyReduction_36 _ _ = notHappyAtAll ++happyReduce_37 = happySpecReduce_1 17 happyReduction_37+happyReduction_37 (HappyTerminal (TId happy_var_1))+ = HappyAbsSyn17+ ([happy_var_1]+ )+happyReduction_37 _ = notHappyAtAll ++happyNewToken action sts stk [] =+ action 40 40 notHappyAtAll (HappyState action) sts stk []++happyNewToken action sts stk (tk:tks) =+ let cont i = action i i tk (HappyState action) sts stk tks in+ case tk of {+ TId "stencil" -> cont 18;+ TId "region" -> cont 19;+ TId "readonce" -> cont 20;+ TId "reflexive" -> cont 21;+ TId "irreflexive" -> cont 22;+ TId "atmost" -> cont 23;+ TId "atleast" -> cont 24;+ TId "dim" -> cont 25;+ TId "depth" -> cont 26;+ TId "forward" -> cont 27;+ TId "backward" -> cont 28;+ TId "centered" -> cont 29;+ TId "dependency" -> cont 30;+ TId "mutual" -> cont 31;+ TId happy_dollar_dollar -> cont 32;+ TNum happy_dollar_dollar -> cont 33;+ TPlus -> cont 34;+ TStar -> cont 35;+ TDoubleColon -> cont 36;+ TEqual -> cont 37;+ TLParen -> cont 38;+ TRParen -> cont 39;+ _ -> happyError' (tk:tks)+ }++happyError_ 40 tk tks = happyError' tks+happyError_ _ tk tks = happyError' (tk:tks)++happyThen :: () => Either AnnotationParseError a -> (a -> Either AnnotationParseError b) -> Either AnnotationParseError b+happyThen = (>>=)+happyReturn :: () => a -> Either AnnotationParseError a+happyReturn = (return)+happyThen1 m k tks = (>>=) m (\a -> k a tks)+happyReturn1 :: () => a -> b -> Either AnnotationParseError a+happyReturn1 = \a tks -> (return) a+happyError' :: () => [(Token)] -> Either AnnotationParseError a+happyError' = happyError++parseSpec tks = happySomeParser where+ happySomeParser = happyThen (happyParse action_0 tks) (\x -> case x of {HappyAbsSyn4 z -> happyReturn z; _other -> notHappyAtAll })++happySeq = happyDontSeq+++newtype Depth a = Depth a+newtype Dim a = Dim a++applyAttr :: (Int -> Int -> Bool -> Region)+ -> (Depth Int, Dim Int, Bool)+ -> Region+applyAttr constr (Depth d, Dim dim, irrefl) = constr d dim irrefl++data Specification+ = RegionDec String Region+ | SpecDec Spec [String]+ deriving (Show, Eq, Ord, Typeable, Data)++data Region+ = Forward Int Int Bool+ | Backward Int Int Bool+ | Centered Int Int Bool+ | Or Region Region+ | And Region Region+ | Var String+ deriving (Show, Eq, Ord, Typeable, Data)++data Spec+ = Spatial [Mod] Region+ | Temporal [String] Bool+ deriving (Show, Eq, Ord, Typeable, Data)++data Mod+ = AtLeast+ | AtMost+ | ReadOnce+ deriving (Show, Eq, Ord, Typeable, Data)++--------------------------------------------------++data Token+ = TDoubleColon+ | TStar+ | TPlus+ | TEqual+ | TComma+ | TLParen+ | TRParen+ | TId String+ | TNum String+ deriving (Show)++addToTokens :: Token -> String -> Either AnnotationParseError [ Token ]+addToTokens tok rest = do+ tokens <- lexer' rest+ return $ tok : tokens++stripLeadingWhiteSpace (' ':xs) = stripLeadingWhiteSpace xs+stripLeadingWhiteSpace ('\t':xs) = stripLeadingWhiteSpace xs+stripLeadingWhiteSpace ('\n':xs) = stripLeadingWhiteSpace xs+stripLeadingWhiteSpace xs = xs+++lexer :: String -> Either AnnotationParseError [ Token ]+lexer input | length (stripLeadingWhiteSpace input) >= 2 =+ case stripLeadingWhiteSpace input of+ -- Check the leading character is '=' for specification+ '=':input' ->+ -- First test to see if the input looks like an actual+ -- specification of either a stencil or region+ if (input' `hasPrefix` "stencil" || input' `hasPrefix` "region")+ then lexer' input'+ else Left NotAnnotation+ _ -> Left NotAnnotation+ where+ hasPrefix [] str = False+ hasPrefix (' ':xs) str = hasPrefix xs str+ hasPrefix xs str = isPrefixOf str xs+lexer _ = Left NotAnnotation+++lexer' :: String -> Either AnnotationParseError [ Token ]+lexer' [] = return []+lexer' (' ':xs) = lexer' xs+lexer' ('\t':xs) = lexer' xs+lexer' (':':':':xs) = addToTokens TDoubleColon xs+lexer' ('*':xs) = addToTokens TStar xs+lexer' ('+':xs) = addToTokens TPlus xs+lexer' ('=':xs) = addToTokens TEqual xs+-- Comma hack: drop commas that are not separating numbers, in order to avoid need for 2-token lookahead.+lexer' (',':xs)+ | x':xs' <- dropWhile isSpace xs, not (isNumber x') = lexer' (x':xs')+ | otherwise = addToTokens TComma xs+lexer' ('(':xs) = addToTokens TLParen xs+lexer' (')':xs) = addToTokens TRParen xs+lexer' (x:xs)+ | isLetter x = aux TId $ \ c -> isAlphaNum c || c == '_'+ | isNumber x = aux TNum isNumber+ | otherwise+ = failWith $ "Not an indentifier " ++ show x+ where+ aux f p = (f target :) `fmap` lexer' rest+ where (target, rest) = span p (x:xs)+lexer' x+ = failWith $ "Not a valid piece of stencil syntax " ++ show x++--------------------------------------------------++-- specParser :: String -> Either AnnotationParseError Specification+specParser :: AnnotationParser Specification+specParser src = do+ tokens <- lexer src+ parseSpec tokens >>= modValidate++-- Check whether modifiers are used correctly+modValidate :: Specification -> Either AnnotationParseError Specification+modValidate (SpecDec (Spatial mods r) vars) =+ do mods' <- modValidate' $ sort mods+ return $ SpecDec (Spatial mods' r) vars++ where modValidate' [] = return $ []++ modValidate' (AtLeast : AtLeast : xs)+ = failWith "Duplicate 'atLeast' modifier; use at most one."++ modValidate' (AtMost : AtMost : xs)+ = failWith "Duplicate 'atMost' modifier; use at most one."++ modValidate' (ReadOnce : ReadOnce : xs)+ = failWith "Duplicate 'readOnce' modifier; use at most one."++ modValidate' (AtLeast : AtMost : xs)+ = failWith $ "Conflicting modifiers: cannot use 'atLeast' and "+ ++ "'atMost' together"++ modValidate' (x : xs)+ = do xs' <- modValidate' xs+ return $ x : xs'+modValidate x = return x++happyError :: [ Token ] -> Either AnnotationParseError a+happyError t = failWith $ "Could not parse specification at: " ++ show t+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+{-# LINE 1 "<built-in>" #-}+{-# LINE 16 "<built-in>" #-}+{-# LINE 1 "/usr/local/lib/ghc-7.10.2/include/ghcversion.h" #-}+++++++++++++++++++{-# LINE 17 "<built-in>" #-}+{-# LINE 1 "templates/GenericTemplate.hs" #-}+-- Id: GenericTemplate.hs,v 1.26 2005/01/14 14:47:22 simonmar Exp +++{-# LINE 13 "templates/GenericTemplate.hs" #-}+++{-# LINE 46 "templates/GenericTemplate.hs" #-}++++++++++{-# LINE 67 "templates/GenericTemplate.hs" #-}+++{-# LINE 77 "templates/GenericTemplate.hs" #-}+++++++++++infixr 9 `HappyStk`+data HappyStk a = HappyStk a (HappyStk a)++-----------------------------------------------------------------------------+-- starting the parse++happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll++-----------------------------------------------------------------------------+-- Accepting the parse++-- If the current token is (1), it means we've just accepted a partial+-- parse (a %partial parser). We must ignore the saved token on the top of+-- the stack in this case.+happyAccept (1) tk st sts (_ `HappyStk` ans `HappyStk` _) =+ happyReturn1 ans+happyAccept j tk st sts (HappyStk ans _) = + (happyReturn1 ans)++-----------------------------------------------------------------------------+-- Arrays only: do the next action+++{-# LINE 155 "templates/GenericTemplate.hs" #-}++-----------------------------------------------------------------------------+-- HappyState data type (not arrays)++++newtype HappyState b c = HappyState+ (Int -> -- token number+ Int -> -- token number (yes, again)+ b -> -- token semantic value+ HappyState b c -> -- current state+ [HappyState b c] -> -- state stack+ c)++++-----------------------------------------------------------------------------+-- Shifting a token++happyShift new_state (1) tk st sts stk@(x `HappyStk` _) =+ let i = (case x of { HappyErrorToken (i) -> i }) in+-- trace "shifting the error token" $+ new_state i i tk (HappyState (new_state)) ((st):(sts)) (stk)++happyShift new_state i tk st sts stk =+ happyNewToken new_state ((st):(sts)) ((HappyTerminal (tk))`HappyStk`stk)++-- happyReduce is specialised for the common cases.++happySpecReduce_0 i fn (1) tk st sts stk+ = happyFail (1) tk st sts stk+happySpecReduce_0 nt fn j tk st@((HappyState (action))) sts stk+ = action nt j tk st ((st):(sts)) (fn `HappyStk` stk)++happySpecReduce_1 i fn (1) tk st sts stk+ = happyFail (1) tk st sts stk+happySpecReduce_1 nt fn j tk _ sts@(((st@(HappyState (action))):(_))) (v1`HappyStk`stk')+ = let r = fn v1 in+ happySeq r (action nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_2 i fn (1) tk st sts stk+ = happyFail (1) tk st sts stk+happySpecReduce_2 nt fn j tk _ ((_):(sts@(((st@(HappyState (action))):(_))))) (v1`HappyStk`v2`HappyStk`stk')+ = let r = fn v1 v2 in+ happySeq r (action nt j tk st sts (r `HappyStk` stk'))++happySpecReduce_3 i fn (1) tk st sts stk+ = happyFail (1) tk st sts stk+happySpecReduce_3 nt fn j tk _ ((_):(((_):(sts@(((st@(HappyState (action))):(_))))))) (v1`HappyStk`v2`HappyStk`v3`HappyStk`stk')+ = let r = fn v1 v2 v3 in+ happySeq r (action nt j tk st sts (r `HappyStk` stk'))++happyReduce k i fn (1) tk st sts stk+ = happyFail (1) tk st sts stk+happyReduce k nt fn j tk st sts stk+ = case happyDrop (k - ((1) :: Int)) sts of+ sts1@(((st1@(HappyState (action))):(_))) ->+ let r = fn stk in -- it doesn't hurt to always seq here...+ happyDoSeq r (action nt j tk st1 sts1 r)++happyMonadReduce k nt fn (1) tk st sts stk+ = happyFail (1) tk st sts stk+happyMonadReduce k nt fn j tk st sts stk =+ case happyDrop k ((st):(sts)) of+ sts1@(((st1@(HappyState (action))):(_))) ->+ let drop_stk = happyDropStk k stk in+ happyThen1 (fn stk tk) (\r -> action nt j tk st1 sts1 (r `HappyStk` drop_stk))++happyMonad2Reduce k nt fn (1) tk st sts stk+ = happyFail (1) tk st sts stk+happyMonad2Reduce k nt fn j tk st sts stk =+ case happyDrop k ((st):(sts)) of+ sts1@(((st1@(HappyState (action))):(_))) ->+ let drop_stk = happyDropStk k stk++++++ new_state = action++ in+ happyThen1 (fn stk tk) (\r -> happyNewToken new_state sts1 (r `HappyStk` drop_stk))++happyDrop (0) l = l+happyDrop n ((_):(t)) = happyDrop (n - ((1) :: Int)) t++happyDropStk (0) l = l+happyDropStk n (x `HappyStk` xs) = happyDropStk (n - ((1)::Int)) xs++-----------------------------------------------------------------------------+-- Moving to a new state after a reduction++++++++++happyGoto action j tk st = action j j tk (HappyState action)+++-----------------------------------------------------------------------------+-- Error recovery ((1) is the error token)++-- parse error if we are in recovery and we fail again+happyFail (1) tk old_st _ stk@(x `HappyStk` _) =+ let i = (case x of { HappyErrorToken (i) -> i }) in+-- trace "failing" $ + happyError_ i tk++{- We don't need state discarding for our restricted implementation of+ "error". In fact, it can cause some bogus parses, so I've disabled it+ for now --SDM++-- discard a state+happyFail (1) tk old_st (((HappyState (action))):(sts)) + (saved_tok `HappyStk` _ `HappyStk` stk) =+-- trace ("discarding state, depth " ++ show (length stk)) $+ action (1) (1) tk (HappyState (action)) sts ((saved_tok`HappyStk`stk))+-}++-- Enter error recovery: generate an error token,+-- save the old token and carry on.+happyFail i tk (HappyState (action)) sts stk =+-- trace "entering error recovery" $+ action (1) (1) tk (HappyState (action)) sts ( (HappyErrorToken (i)) `HappyStk` stk)++-- Internal happy errors:++notHappyAtAll :: a+notHappyAtAll = error "Internal Happy error\n"++-----------------------------------------------------------------------------+-- Hack to get the typechecker to accept our action functions++++++++-----------------------------------------------------------------------------+-- Seq-ing. If the --strict flag is given, then Happy emits +-- happySeq = happyDoSeq+-- otherwise it emits+-- happySeq = happyDontSeq++happyDoSeq, happyDontSeq :: a -> b -> b+happyDoSeq a b = a `seq` b+happyDontSeq a b = b++-----------------------------------------------------------------------------+-- Don't inline any functions from the template. GHC has a nasty habit+-- of deciding to inline happyGoto everywhere, which increases the size of+-- the generated parser quite a bit.++++++++++{-# NOINLINE happyShift #-}+{-# NOINLINE happySpecReduce_0 #-}+{-# NOINLINE happySpecReduce_1 #-}+{-# NOINLINE happySpecReduce_2 #-}+{-# NOINLINE happySpecReduce_3 #-}+{-# NOINLINE happyReduce #-}+{-# NOINLINE happyMonadReduce #-}+{-# NOINLINE happyGoto #-}+{-# NOINLINE happyFail #-}++-- end of Happy Template.+
src/Camfort/Specification/Stencils/Grammar.y view
@@ -6,6 +6,7 @@ import Data.Char (isLetter, isNumber, isAlphaNum, toLower, isAlpha, isSpace) import Data.List (intersect, sort, isPrefixOf) import Data.Data+import qualified Data.Text as T import Debug.Trace @@ -163,12 +164,6 @@ tokens <- lexer' rest return $ tok : tokens -stripLeadingWhiteSpace (' ':xs) = stripLeadingWhiteSpace xs-stripLeadingWhiteSpace ('\t':xs) = stripLeadingWhiteSpace xs-stripLeadingWhiteSpace ('\n':xs) = stripLeadingWhiteSpace xs-stripLeadingWhiteSpace xs = xs-- lexer :: String -> Either AnnotationParseError [ Token ] lexer input | length (stripLeadingWhiteSpace input) >= 2 = case stripLeadingWhiteSpace input of@@ -179,6 +174,7 @@ '<':input' -> testAnnotation input' _ -> Left NotAnnotation where+ stripLeadingWhiteSpace = T.unpack . T.strip . T.pack testAnnotation inp = -- First test to see if the input looks like an actual -- specification of either a stencil or region
src/Camfort/Specification/Stencils/InferenceFrontend.hs view
@@ -233,7 +233,7 @@ else return [] -- Not an assign we are interested in _ -> return [])- if mode == Synth && not (null specs)+ if mode == Synth && not (null specs) && specs /= [[]] then let specComment = Synth.formatSpec (Just (tabs ++ '!':marker:" ")) ?nameMap (span, Left (concat specs')) specs' = map (mapMaybe noSpecAlready) specs@@ -258,14 +258,14 @@ else return [] -- descend into the body of the do-statement- body' <- mapM (descendBiM (perBlockInfer mode marker)) body+ body' <- mapM (descendBiM (perBlockInfer mode marker)) body -- Remove any induction variable from the state return $ F.BlDo ann span lab cname lab' mDoSpec body' tlab perBlockInfer mode marker b = do -- Go inside child blocks- mapM_ (descendBiM (perBlockInfer mode marker)) $ children b- return b+ b' <- descendM (descendBiM (perBlockInfer mode marker)) $ b+ return b' genSpecifications :: Params => FAD.InductionVarMapByASTBlock@@ -349,12 +349,25 @@ genRHSsubscripts :: F.Block (FA.Analysis A) -> M.Map Variable [[F.Index (FA.Analysis A)]]-genRHSsubscripts b =- collect [ (FA.varName exp, e)- | F.ExpSubscript _ _ exp subs <- FA.rhsExprs b- , isVariableExpr exp- , let e = F.aStrip subs- , not (null e)]+genRHSsubscripts b = genRHSsubscripts' (transformBi replaceModulo b)+ where+ -- Any occurence of an subscript "modulo(e, e')" is replaced with "e"+ replaceModulo :: F.Expression (FA.Analysis A) -> F.Expression (FA.Analysis A)+ replaceModulo e@(F.ExpSubscript _ _+ (F.ExpValue _ _ (F.ValVariable "modulo")) subs) =+ -- We expect that the first parameter to modulo is being treated+ -- as an IxSingle element+ case (head $ F.aStrip subs) of+ (F.IxSingle _ _ _ e') -> e'+ _ -> e+ replaceModulo e = e++ genRHSsubscripts' b =+ collect [ (FA.varName exp, e)+ | F.ExpSubscript _ _ exp subs <- FA.rhsExprs b+ , isVariableExpr exp+ , let e = F.aStrip subs+ , not (null e)] getInductionVar :: Maybe (F.DoSpecification (FA.Analysis A)) -> [Variable] getInductionVar (Just (F.DoSpecification _ _ (F.StExpressionAssign _ _ e _) _ _))
src/Camfort/Specification/Stencils/Model.hs view
@@ -165,7 +165,7 @@ mkModel (Backward dep dim reflx) = fromList [mkSingleEntryNeg i dim ?globalDimensionality | i <- [(-dep)..i0]]- where i0 = if reflx then 0 else 1+ where i0 = if reflx then 0 else -1 mkModel (Centered dep dim reflx) = fromList [mkSingleEntryNeg i dim ?globalDimensionality | i <- [(-dep)..dep] \\ i0]
src/Camfort/Specification/Stencils/Synthesis.hs view
@@ -62,7 +62,7 @@ where realName v = v `fromMaybe` (v `M.lookup` nm) prefix' = case prefix of- Nothing -> show span ++ " \t"+ Nothing -> show span ++ " " Just pr -> pr formatSpec prefix nm (span, Left []) = ""@@ -70,7 +70,7 @@ (intercalate "\n" $ map (\s -> prefix' ++ doSpec s) specs) where prefix' = case prefix of- Nothing -> show span ++ " \t"+ Nothing -> show span ++ " " Just pr -> pr commaSep = intercalate ", " doSpec (arrayVar, spec) =
src/Camfort/Specification/Units.hs view
@@ -69,22 +69,22 @@ | Left exc <- eVars = (errReport exc, -1) where -- Format report- okReport [] = (logs ++ "\n" ++ fname ++ ":\n"- ++ "No additional annotations are necessary.\n", 0)+ okReport [] = (logs ++ "\n" ++ fname+ ++ ":No additional annotations are necessary.\n", 0) okReport vars = (logs ++ "\n" ++ fname ++ ": " ++ show numVars ++ " variable declarations suggested to be given a specification:\n"- ++ unlines [ "\t" ++ expReport ei | ei <- expInfo ], numVars)+ ++ unlines [ " " ++ expReport ei | ei <- expInfo ], numVars) where names = map showVar vars- expInfo = filter ((`elem` names) . FA.varName) $ declVariables pfUA+ expInfo = filter ((`elem` names) . FA.srcName) $ declVariables pfUA numVars = length expInfo - expReport e = "(" ++ showSrcSpan (FU.getSpan e) ++ ")\t" ++ FA.srcName e+ expReport e = "(" ++ showSrcSpan (FU.getSpan e) ++ ") " ++ FA.srcName e varReport = intercalate ", " . map showVar - showVar (UnitVar (_, s)) = s+ showVar (UnitVar (_, s)) = s showVar (UnitLiteral _) = "<literal>" showVar _ = "<bad>" @@ -106,8 +106,8 @@ | Left exc <- eCons = errReport exc where -- Format report- okReport Nothing = logs ++ "\n" ++ fname ++ "\t: Consistent. " ++ show nVars ++ " variables checked."- okReport (Just cons) = logs ++ "\n" ++ fname ++ "\t: Inconsistent:\n" ++ reportErrors cons+ okReport Nothing = logs ++ "\n" ++ fname ++ ": Consistent. " ++ show nVars ++ " variables checked."+ okReport (Just cons) = logs ++ "\n" ++ fname ++ ": Inconsistent:\n" ++ reportErrors cons reportErrors cons = unlines [ reportError con | con <- cons ] reportError con = " - at " ++ srcSpan con@@ -159,7 +159,7 @@ showVar (UnitLiteral _) = "<literal>" -- FIXME showVar _ = "<bad>" - errReport exc = logs ++ "\n" ++ fname ++ ":\t " ++ show exc+ errReport exc = logs ++ "\n" ++ fname ++ ": " ++ show exc -- run inference uOpts = uo { uoNameMap = nameMap }@@ -192,7 +192,7 @@ expReport (e, u) = " " ++ showSrcSpan (FU.getSpan e) ++ " unit " ++ show u ++ " :: " ++ FA.srcName e - errReport exc = logs ++ "\n" ++ fname ++ ":\t" ++ show exc+ errReport exc = logs ++ "\n" ++ fname ++ ": " ++ show exc -- run inference uOpts = uo { uoNameMap = nameMap }@@ -221,7 +221,7 @@ expReport (e, u) = " " ++ showSrcSpan (FU.getSpan e) ++ " unit " ++ show u ++ " :: " ++ FA.srcName e - errReport exc = logs ++ "\n" ++ fname ++ ":\t" ++ show exc+ errReport exc = logs ++ "\n" ++ fname ++ ": " ++ show exc -- run inference uOpts = uo { uoNameMap = nameMap }
src/Camfort/Specification/Units/Environment.hs view
@@ -33,6 +33,7 @@ import Data.List import Data.Matrix import Data.Ratio+import qualified Debug.Trace as D import Text.Printf @@ -76,9 +77,17 @@ UnitMul u1 u2 -> maybeParenS u1 ++ " " ++ maybeParenS u2 UnitPow u 1 -> show u UnitPow u 0 -> "1"- UnitPow u k -> printf "%s**%s" (maybeParen u) kStr- where kStr | k < 0 = printf "(%f)" k- | otherwise = show k+ UnitPow u k ->+ case doubleToRationalSubset k of+ Just r -> printf "%s**%s" (maybeParen u) (showRational r)+ Nothing -> error $+ printf "Irrational unit exponent: %s**%f" (maybeParen u) k+ where showRational r+ | r < 0 = printf "(%s)" (showRational' r)+ | otherwise = showRational' r+ showRational' r+ | denominator r == 1 = show (numerator r)+ | otherwise = printf "%s / %s" (numerator r) (denominator r) where maybeParen x | all isAlphaNum s = s | otherwise = "(" ++ s ++ ")"@@ -87,6 +96,30 @@ | otherwise = "(" ++ s ++ ")" where s = show x isUnitMulOk c = isSpace c || isAlphaNum c || c `elem` "*."++-- Converts doubles to a rational that can be expressed+-- as a rational with denominator at most 10+-- otherwise Noting+doubleToRationalSubset :: Double -> Maybe Rational+doubleToRationalSubset x | x < 0 =+ doubleToRationalSubset (abs x) >>= (\x -> return (-x))+doubleToRationalSubset x =+ doubleToRational' 0 1 (ceiling x) 1+ where+ -- The maximum common denominator, controls granularity+ n = 16+ doubleToRational' a b c d+ | b <= n && d <= n =+ let mediant = (fromIntegral (a+c))/(fromIntegral (b+d))+ in if x == mediant+ then if b + d <= n+ then Just $ (a + c) % (b + d)+ else Nothing+ else if x > mediant+ then doubleToRational' (a+c) (b+d) c d+ else doubleToRational' a b (a+c) (b+d)+ | b > n = Just $ c % d+ | otherwise = Just $ a % b -- | A relation between UnitInfos data Constraint
src/Camfort/Specification/Units/Parser.y view
@@ -11,6 +11,7 @@ import Data.Data import Data.List import Data.Char (isLetter, isNumber, isAlphaNum, toLower)+import qualified Data.Text as T } %monad { Either AnnotationParseError } { >>= } { return }@@ -127,8 +128,13 @@ deriving (Show) lexer :: String -> Either AnnotationParseError [ Token ]+lexer [] = Left NotAnnotation lexer (c:xs)- | c `elem` ['=', '!', '>', '<'] = lexer' xs+ | c `elem` ['=', '!', '>', '<'] =+ -- First test to see if the input looks like an actual unit specification+ if "unit" `isPrefixOf` (T.unpack . T.strip . T.toLower . T.pack $ xs)+ then lexer' xs+ else Left NotAnnotation | otherwise = Left NotAnnotation addToTokens :: Token -> String -> Either AnnotationParseError [ Token ]@@ -154,7 +160,7 @@ lexer' (x:xs) | isLetter x = aux (\c -> isAlphaNum c || c `elem` ['\'','_','-']) TId | isNumber x = aux isNumber TNum- | otherwise = Left NotAnnotation -- failWith $ "Not valid unit syntax at " ++ show (x:xs)+ | otherwise = failWith $ "Not valid unit syntax at " ++ show (x:xs) ++ "\n" where aux p cons = let (target, rest) = span p xs@@ -166,6 +172,6 @@ parseUnit tokens happyError :: [ Token ] -> Either AnnotationParseError a-happyError t = Left NotAnnotation -- failWith $ "Could not parse specification at: " ++ show t+happyError t = failWith $ "Could not parse unit specification at: " ++ show t ++ "\n" }
src/Main.hs view
@@ -94,7 +94,7 @@ where header = introMsg ++ usage ++ menu ++ "\nOptions:" -- * Which modes do not require an output-outputNotRequired = ["count"+outputNotRequired = ["count", "ast" , "stencils-infer", "stencils-check" , "units-infer", "units-check", "units-suggest"] @@ -128,13 +128,14 @@ ("units-synth", (unitsSynth, "unit-of-measure synthesise specs.")) ] -- * Usage and about information-version = "0.900"+version = "0.902" introMsg = "CamFort " ++ version ++ " - Cambridge Fortran Infrastructure." usage = "Usage: camfort <MODE> <INPUT> [OUTPUT] [OPTIONS...]\n" menu = "Refactor functions:\n"- ++ concatMap (\(k, (_, info)) -> "\t" ++ k ++ replicate (15 - length k) ' '- ++ "\t [" ++ info ++ "] \n") refactorings+ ++ concatMap (\(k, (_, info)) -> space ++ k ++ replicate (15 - length k) ' '+ ++ " [" ++ info ++ "] \n") refactorings ++ "\nAnalysis functions:\n"- ++ concatMap (\(k, (_, info)) -> "\t" ++ k ++ replicate (15 - length k) ' '- ++ "\t [" ++ info ++ "] \n") analyses+ ++ concatMap (\(k, (_, info)) -> space ++ k ++ replicate (15 - length k) ' '+ ++ " [" ++ info ++ "] \n") analyses+ where space = replicate 5 ' '
tests/Camfort/Specification/Stencils/ModelSpec.hs view
@@ -51,6 +51,12 @@ Nothing consistent centeredAcs spec `shouldBe` True + it "1D backward irreflexive lower bound - positive" $ do+ let spec = Single $ Bound+ (Just $ Spatial $ Sum [ Product [ Backward 1 1 False ] ])+ Nothing+ consistent (Single [[-1]]) spec `shouldBe` True+ it "1D centered irreflexive upper bound - negative" $ do let spec = Single $ Bound Nothing
− tests/Camfort/Specification/Stencils/example2.f
@@ -1,45 +0,0 @@- program example2- implicit none-- integer i, j, imax, jmax- parameter (imax = 3, jmax = 3)- real a(0:imax,0:jmax), b(0:imax,0:jmax), c, x--c= region :: r1 = centered(depth=1, dim=1)--c some kind of setup- do 1 i = 0, imax- do 2 j = 0, jmax- a(i,j) = i+j- 2 continue- 1 continue--c compute mean- do 3 i = 1, (imax-1)- do 4 j = 1, (jmax-1)- if (.true.) then-c= region :: r2 = centered(depth=1, dim=2)- x = a(i-1,j) + a(i,j) + a(i+1,j) + abs(0)-c= stencil readOnce, (reflexive(dim=1))*r2 + (reflexive(dim=2))*r1 :: a - b(i,j) = (x + a(i,j-1) + a(i,j+1)) / 5.0-c No specification should be inferred here- b(0,0) = a(i, j)- end if- 4 continue- x = a(i,0)- y = a(i-1,0)-c= stencil readOnce, backward(depth=1, dim=1) :: a - b(i,0) = (x + y)/2.0- 3 continue-- b(i,j) = a(i,j)-- do i=1, imax- do j=1, jmx- x = a(1,j+1) + a(1,j-1)- a(i,j) = a(i,1) + a(i+1 ,1) + a(i-1,1) + a(1,j) + x- a(i,j) = a(i,j) + a(1,1)- end do- end do-- end
− tests/Camfort/Specification/Stencils/example3.f
@@ -1,31 +0,0 @@- program example3- implicit none-- integer i, x, y, imax, xmax, ymax- parameter (imax = 3, jmax = 3)-- real a(0:imax,0:jmax), b(0:imax,0:jmax), c(0:imax), d(0:imax), acc-- do i=1,imax- do x=1,xmax- do y=1,ymax- acc = acc + a(x,y,i)- end do- end do- 1 b(1,i) = acc- end do-- do i=1,imax-c Label 1 should get same spec as this line- b(1,i) = a(:,:,i)- end do-- c(:) = d(:)- c(:) = a(0,:)--c No spec here- do i=1,imax- c(i) = d(:)- end do-- end
− tests/Camfort/Specification/Stencils/example4.f
@@ -1,8 +0,0 @@- program example4- logical BAR = .true.- integer X(0:5)- integer J- do J=1, 10- IF (BAR) X(J) = X(J)+1- end do- end
tests/Camfort/Specification/StencilsSpec.hs view
@@ -22,11 +22,18 @@ import Camfort.Analysis.Annotations import qualified Language.Fortran.AST as F import Language.Fortran.Util.Position+import Language.Fortran.ParserMonad+import Camfort.Reprint+import Camfort.Output import Data.Map.Strict (toList) import qualified Data.IntMap as IM import qualified Data.Set as S+import Data.Functor.Identity+import qualified Data.ByteString.Char8 as B +import System.FilePath+ import Test.Hspec import Test.QuickCheck import Test.Hspec.QuickCheck@@ -246,39 +253,65 @@ -- Some integration tests ------------------------- - let file = "tests/Camfort/Specification/Stencils/example2.f"+ let file = "tests"+ </> "fixtures"+ </> "Specification"+ </> "Stencils"+ </> "example2.f"+ let fileSynthExpected = "tests"+ </> "fixtures"+ </> "Specification"+ </> "Stencils"+ </> "example2.expected.f" program <- runIO $ readParseSrcDir file []+ programSrc <- runIO $ readFile file+ synthExpectedSrc <- runIO $ readFile fileSynthExpected describe "integration test on inference for example2.f" $ do it "stencil infer" $ fst (callAndSummarise (infer AssignMode '=') program) `shouldBe`- "\ntests/Camfort/Specification/Stencils/example2.f\n\- \(24:8)-(24:53) \tstencil readOnce, (reflexive(dim=1))*(centered(depth=1, dim=2)) \+ "\ntests/fixtures/Specification/Stencils/example2.f\n\+ \(24:8)-(24:53) stencil readOnce, (reflexive(dim=1))*(centered(depth=1, dim=2)) \ \+ (reflexive(dim=2))*(centered(depth=1, dim=1)) :: a\n\- \(32:7)-(32:26) \tstencil readOnce, (backward(depth=1, dim=1)) :: a\n\- \(40:8)-(40:62) \tstencil readOnce, (centered(depth=1, dim=1)) \+ \(32:7)-(32:26) stencil readOnce, (backward(depth=1, dim=1)) :: a\n\+ \(41:8)-(41:103) stencil readOnce, (centered(depth=1, dim=1)) \ \+ (centered(depth=1, dim=2)) :: a\n\- \(41:8)-(41:35) \tstencil readOnce, (reflexive(dim=1))*(reflexive(dim=2)) :: a"+ \(42:8)-(42:37) stencil readOnce, (reflexive(dim=1))*(reflexive(dim=2)) :: a" it "stencil check" $ fst (callAndSummarise (\f p -> (check f p, p)) program) `shouldBe`- "\ntests/Camfort/Specification/Stencils/example2.f\n\- \(23:1)-(23:86)\tCorrect.\n(31:1)-(31:56)\tCorrect."+ "\ntests/fixtures/Specification/Stencils/example2.f\n\+ \(23:1)-(23:86) Correct.\n(31:1)-(31:56) Correct." - let file = "tests/Camfort/Specification/Stencils/example3.f"+ it "stencil synth" $+ (B.unpack . runIdentity+ $ reprint (refactoring Fortran77)+ (snd . head . snd $ synth AssignMode '=' (map (\(f, _, p) -> (f, p)) program))+ (B.pack programSrc))+ `shouldBe` synthExpectedSrc++ let file = "tests"+ </> "fixtures"+ </> "Specification"+ </> "Stencils"+ </> "example3.f" program <- runIO $ readParseSrcDir file [] - let file = "tests/Camfort/Specification/Stencils/example4.f"+ let file = "tests"+ </> "fixtures"+ </> "Specification"+ </> "Stencils"+ </> "example4.f" program <- runIO $ readParseSrcDir file [] describe "integration test on inference for example4.f" $ it "stencil infer" $ fst (callAndSummarise (infer AssignMode '=') program) `shouldBe`- "\ntests/Camfort/Specification/Stencils/example4.f\n\- \(6:8)-(6:33) \tstencil (reflexive(dim=1)) :: x"+ "\ntests/fixtures/Specification/Stencils/example4.f\n\+ \(6:8)-(6:33) stencil (reflexive(dim=1)) :: x" {- Properties of `spanBoundingBox`: idempotent and associative -}
− tests/Camfort/Specification/Units/ex1.f90
@@ -1,29 +0,0 @@-program energy- != unit :: speed = m/s-- != unit (m / s** (2)) :: gravity- != unit (m) :: height- != unit (kg) :: mass- real, parameter :: mass = 3.00, gravity = 9.81, height = 4.20- != unit (kg m** (2) / s** (2)) :: potential_energy- real :: potential_energy-- != unit (1) :: half- != unit (speed) :: velocity- real, parameter :: half = 0.5, velocity = 4.00- != unit (kg m** (2) / s** (2)) :: kinetic_energy- != unit (kg m** (2) / s** (2)) :: total_energy- real :: kinetic_energy, total_energy-- potential_energy = mass * gravity * height- kinetic_energy = half * mass * square(velocity)-- total_energy = potential_energy + kinetic_energy-- contains-- real function square(x)- real x- square = x * x- end function square-end program energy
− tests/Camfort/Specification/Units/ex2.f90
@@ -1,11 +0,0 @@-program energy-- != unit (m) :: height- != unit (kg) :: mass- real, parameter :: mass = 3.00, gravity = .81, height = 4.20-- != unit (kg m** (2) / s** (2)) :: potential_energy- real :: potential_energy- - potential_energy = mass * gravity * height-end program energy
− tests/Camfort/Specification/Units/ex3.f90
@@ -1,14 +0,0 @@-program energy-- != unit (m) :: height- != unit (kg) :: mass- real, parameter :: mass = 3.00, gravity = .81, height = 4.20-- integer :: i = 0- integer :: j = i- - != unit (kg m**2 / s**2) :: potential_energy- real :: potential_energy- - potential_energy = mass * gravity * height-end program energy
− tests/Camfort/Specification/Units/param.f90
@@ -1,10 +0,0 @@- program param- implicit none- != unit(m) :: x, y- real, parameter :: x = 4, y = 5- != unit(s) :: t- real, parameter :: t = 2- real :: v1, v2- v1 = x / t- v2 = y / t- end program
tests/Camfort/Specification/UnitsSpec.hs view
@@ -21,6 +21,7 @@ import qualified Data.Array as A import qualified Numeric.LinearAlgebra as H import qualified Data.Map.Strict as M+import GHC.Real import Numeric.LinearAlgebra ( atIndex, (<>), (><), rank, (?), toLists, toList, fromLists, fromList, rows, cols, takeRows, takeColumns, dropRows, dropColumns, subMatrix, diag, build, fromBlocks,@@ -111,6 +112,9 @@ describe "Infer Variables" $ do it "testCons5" $ do inferVariables testCons5 `shouldBe` testCons5_infer+ describe "Check that (restricted) double to ratios is consistent" $ do+ it "test all in -10/-10 ... 10/10, apart from /0" $+ do and [testDoubleToRationalSubset x y | x <- [-10..10], y <- [-10..10]] -------------------------------------------------- @@ -182,6 +186,11 @@ testCons5_infer = [(("simple2_a11", "simple2_a11"),UnitMul (UnitPow (UnitName "m") 2.0) (UnitPow (UnitName "s") (-4.0))) ,(("simple2_a22", "simple2_a22"),UnitMul (UnitPow (UnitName "m") 1.0) (UnitPow (UnitName "s") (-2.0)))] +testDoubleToRationalSubset :: Integer -> Integer -> Bool+testDoubleToRationalSubset x y =+ if x <= 10 && y <= 10 && x >= -10 && y >= -10 && y /= 0+ then doubleToRationalSubset (fromIntegral x / fromIntegral y) == Just (x % y)+ else True -------------------------------------------------- litTest1 = flip fortranParser "litTest1.f90" . B.pack $ unlines
tests/Camfort/Transformation/CommonSpec.hs view
@@ -9,12 +9,9 @@ import Camfort.Functionality samplesBase :: FilePath-samplesBase = "tests" </> "Camfort" </> "Transformation" </> "samples"+samplesBase = "tests" </> "fixtures" </> "Transformation" data Example = Example FilePath FilePath--examples =- [ Example "common.f90" "common.expected.f90" ] readSample :: FilePath -> IO String readSample filename = do
tests/Camfort/Transformation/EquivalenceElimSpec.hs view
@@ -14,7 +14,6 @@ limitations under the License. -} {-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE ImplicitParams #-} {-# LANGUAGE FlexibleContexts #-} module Camfort.Transformation.EquivalenceElimSpec where@@ -30,7 +29,7 @@ import Camfort.Input samplesBase :: FilePath-samplesBase = "tests" </> "Camfort" </> "Transformation" </> "samples"+samplesBase = "tests" </> "fixtures" </> "Transformation" readExpected :: FilePath -> IO String readExpected filename = do
− tests/Camfort/Transformation/samples/common.f90
@@ -1,10 +0,0 @@-subroutine test(a,b, c)--integer :: c1, c2, c3-COMMON /cmn/ c1, c2, c3--real :: a, b, c--print *, a, b, c--end subroutine test
− tests/Camfort/Transformation/samples/equiv.f90
@@ -1,20 +0,0 @@-program wrt - implicit none- integer :: x = 97- character :: y- character :: z(20)- equivalence (x, y, z(2))-- z(1) = "c"-- write (*,'(i8,A)') x, y--- write (*,'(i8,A,A,A)') x, y, z(1), z(2)-- x = 97 + 98 * (2**8)-- write (*,'(i8,A,A,A,A)') x, y, z(1), z(2), z(3)---end program wrt
+ tests/fixtures/Specification/Stencils/example2.f view
@@ -0,0 +1,47 @@+ program example2+ implicit none++ integer i, j, imax, jmax+ parameter (imax = 3, jmax = 3)+ real a(0:imax,0:jmax), b(0:imax,0:jmax), c, x++c= region :: r1 = centered(depth=1, dim=1)++c some kind of setup+ do 1 i = 0, imax+ do 2 j = 0, jmax+ a(i,j) = i+j+ 2 continue+ 1 continue++c compute mean+ do 3 i = 1, (imax-1)+ do 4 j = 1, (jmax-1)+ if (.true.) then+c= region :: r2 = centered(depth=1, dim=2)+ x = a(i-1,j) + a(i,j) + a(i+1,j) + abs(0)+c= stencil readOnce, (reflexive(dim=1))*r2 + (reflexive(dim=2))*r1 :: a + b(i,j) = (x + a(i,j-1) + a(i,j+1)) / 5.0+c No specification should be inferred here+ b(0,0) = a(i, j)+ end if+ 4 continue+ x = a(i,0)+ y = a(i-1,0)+c= stencil readOnce, backward(depth=1, dim=1) :: a + b(i,0) = (x + y)/2.0+ 3 continue++ b(i,j) = a(i,j)++ do i=1, imax+ do j=1, jmx+ x = a(1,j+1) + a(1,j-1)+ if (.true.) then + a(i,j) = a(modulo(i,imax),1) + a(modulo(i+1,imax) ,1) + a(modulo(i-1,imax),1) + a(1,j) + x+ a(i,j) = a(i,j) + a(1,1)+ end if+ end do+ end do++ end
+ tests/fixtures/Specification/Stencils/example3.f view
@@ -0,0 +1,31 @@+ program example3+ implicit none++ integer i, x, y, imax, xmax, ymax+ parameter (imax = 3, jmax = 3)++ real a(0:imax,0:jmax), b(0:imax,0:jmax), c(0:imax), d(0:imax), acc++ do i=1,imax+ do x=1,xmax+ do y=1,ymax+ acc = acc + a(x,y,i)+ end do+ end do+ 1 b(1,i) = acc+ end do++ do i=1,imax+c Label 1 should get same spec as this line+ b(1,i) = a(:,:,i)+ end do++ c(:) = d(:)+ c(:) = a(0,:)++c No spec here+ do i=1,imax+ c(i) = d(:)+ end do++ end
+ tests/fixtures/Specification/Stencils/example4.f view
@@ -0,0 +1,8 @@+ program example4+ logical BAR = .true.+ integer X(0:5)+ integer J+ do J=1, 10+ IF (BAR) X(J) = X(J)+1+ end do+ end
+ tests/fixtures/Specification/Units/ex1.f90 view
@@ -0,0 +1,29 @@+program energy+ != unit :: speed = m/s++ != unit (m / s** (2)) :: gravity+ != unit (m) :: height+ != unit (kg) :: mass+ real, parameter :: mass = 3.00, gravity = 9.81, height = 4.20+ != unit (kg m** (2) / s** (2)) :: potential_energy+ real :: potential_energy++ != unit (1) :: half+ != unit (speed) :: velocity+ real, parameter :: half = 0.5, velocity = 4.00+ != unit (kg m** (2) / s** (2)) :: kinetic_energy+ != unit (kg m** (2) / s** (2)) :: total_energy+ real :: kinetic_energy, total_energy++ potential_energy = mass * gravity * height+ kinetic_energy = half * mass * square(velocity)++ total_energy = potential_energy + kinetic_energy++ contains++ real function square(x)+ real x+ square = x * x+ end function square+end program energy
+ tests/fixtures/Specification/Units/ex2.f90 view
@@ -0,0 +1,11 @@+program energy++ != unit (m) :: height+ != unit (kg) :: mass+ real, parameter :: mass = 3.00, gravity = .81, height = 4.20++ != unit (kg m** (2) / s** (2)) :: potential_energy+ real :: potential_energy+ + potential_energy = mass * gravity * height+end program energy
+ tests/fixtures/Specification/Units/ex3.f90 view
@@ -0,0 +1,14 @@+program energy++ != unit (m) :: height+ != unit (kg) :: mass+ real, parameter :: mass = 3.00, gravity = .81, height = 4.20++ integer :: i = 0+ integer :: j = i+ + != unit (kg m**2 / s**2) :: potential_energy+ real :: potential_energy+ + potential_energy = mass * gravity * height+end program energy
+ tests/fixtures/Specification/Units/param.f90 view
@@ -0,0 +1,10 @@+ program param+ implicit none+ != unit(m) :: x, y+ real, parameter :: x = 4, y = 5+ != unit(s) :: t+ real, parameter :: t = 2+ real :: v1, v2+ v1 = x / t+ v2 = y / t+ end program
+ tests/fixtures/Transformation/common.f90 view
@@ -0,0 +1,10 @@+subroutine test(a,b, c)++integer :: c1, c2, c3+COMMON /cmn/ c1, c2, c3++real :: a, b, c++print *, a, b, c++end subroutine test
+ tests/fixtures/Transformation/equiv.f90 view
@@ -0,0 +1,20 @@+program wrt + implicit none+ integer :: x = 97+ character :: y+ character :: z(20)+ equivalence (x, y, z(2))++ z(1) = "c"++ write (*,'(i8,A)') x, y+++ write (*,'(i8,A,A,A)') x, y, z(1), z(2)++ x = 97 + 98 * (2**8)++ write (*,'(i8,A,A,A,A)') x, y, z(1), z(2), z(3)+++end program wrt