module Happy.Backend.LALR where

import Paths_happy_lib
import Data.Char

lalrBackendDataDir :: IO String
lalrBackendDataDir :: IO String
lalrBackendDataDir = IO String
getDataDir

magicFilter :: Maybe String -> String -> String
magicFilter :: Maybe String -> String -> String
magicFilter Maybe String
magicName = case Maybe String
magicName of
    Maybe String
Nothing -> String -> String
forall a. a -> a
id
    Just String
name' -> let
        small_name :: String
small_name = String
name'
        big_name :: String
big_name = Char -> Char
toUpper (String -> Char
forall a. HasCallStack => [a] -> a
head String
name') Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
forall a. HasCallStack => [a] -> [a]
tail String
name'
        filter_output :: String -> String
filter_output (Char
'h':Char
'a':Char
'p':Char
'p':Char
'y':String
rest) = String
small_name String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
filter_output String
rest
        filter_output (Char
'H':Char
'a':Char
'p':Char
'p':Char
'y':String
rest) = String
big_name String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
filter_output String
rest
        filter_output (Char
c:String
cs) = Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
filter_output String
cs
        filter_output [] = []
      in String -> String
filter_output

importsToInject :: Bool -> String
importsToInject :: Bool -> String
importsToInject Bool
debug = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String
"\n", String
import_prelude, String
import_array, String
import_bits, String
import_glaexts, String
debug_imports, String
applicative_imports]
    where
      debug_imports :: String
debug_imports  | Bool
debug     = String
import_debug
                     | Bool
otherwise = String
""
      applicative_imports :: String
applicative_imports        = String
import_applicative

      import_glaexts :: String
import_glaexts     = String
"import qualified GHC.Exts as Happy_GHC_Exts\n"
      _import_ghcstack :: String
_import_ghcstack   = String
"import qualified GHC.Stack as Happy_GHC_Stack\n"
      import_array :: String
import_array       = String
"import qualified Data.Array as Happy_Data_Array\n"
      import_bits :: String
import_bits        = String
"import qualified Data.Bits as Bits\n"
      import_debug :: String
import_debug       = String
"import qualified System.IO as Happy_System_IO\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
                           String
"import qualified System.IO.Unsafe as Happy_System_IO_Unsafe\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
                           String
"import qualified Debug.Trace as Happy_Debug_Trace\n"
      import_applicative :: String
import_applicative = String
"import Control.Applicative(Applicative(..))\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++
                           String
"import Control.Monad (ap)\n"
      import_prelude :: String
import_prelude     = [String] -> String
unlines ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\ String
x -> [String] -> String
unwords [String
"import qualified", String
x, String
"as Happy_Prelude"]) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$
        [ String
"Data.Function"
        , String
"Data.Bool"
        , String
"Data.Function"
        , String
"Data.Maybe"
        , String
"Data.Int"
        , String
"Data.String"
        , String
"Data.List"
        , String
"Control.Monad"
        , String
"Text.Show"
        , String
"GHC.Num"
        , String
"GHC.Err"
        ]

langExtsToInject :: [String]
langExtsToInject :: [String]
langExtsToInject = [String
"MagicHash", String
"BangPatterns", String
"TypeSynonymInstances", String
"FlexibleInstances", String
"PatternGuards", String
"NoStrictData", String
"UnboxedTuples", String
"PartialTypeSignatures"]

defines :: Bool -> Bool -> String
defines :: Bool -> Bool -> String
defines Bool
debug Bool
coerce = [String] -> String
unlines [ String
"#define " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
d String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" 1" | String
d <- [String]
vars_to_define ]
  where
  vars_to_define :: [String]
vars_to_define = [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [ [ String
"HAPPY_DEBUG"  | Bool
debug ]
    , [ String
"HAPPY_COERCE" | Bool
coerce ]
    ]