packages feed

antlr-haskell-0.1.0.0: test/shared/Text/ANTLR/Example/Grammar.hs

{-# LANGUAGE ExplicitForAll, DeriveAnyClass, DeriveGeneric, TypeFamilies
 , DeriveDataTypeable #-}
module Text.ANTLR.Example.Grammar where
import Text.ANTLR.Set (fromList, member, (\\), empty, Generic(..), Hashable(..))
import Text.ANTLR.Grammar
import Text.ANTLR.Pretty
import Data.Data (toConstr, Data(..))

data NS0 = A  | B  | C  deriving (Eq, Ord, Generic, Hashable, Bounded, Enum, Show, Data)
data TS0 = A_ | B_ | C_ deriving (Eq, Ord, Generic, Hashable, Bounded, Enum, Show, Data)
a = A_
b = B_
c = C_

-- TODO: boilerplate identity type classes for bounded enums
instance Ref NS0 where
  type Sym NS0 = NS0
  getSymbol = id
instance Ref TS0 where
  type Sym TS0 = TS0
  getSymbol = id
instance Prettify NS0 where prettify = rshow . toConstr
instance Prettify TS0 where prettify = rshow . toConstr
dG :: Grammar () NS0 TS0
dG = defaultGrammar C

mattToolG :: Grammar () NS0 TS0
mattToolG = dG
  { ns = fromList [A, B, C]
  , ts = fromList [a, b, c]
  , s0 = C
  , ps =
          [ Production A $ Prod Pass [T a, T b]
          , Production A $ Prod Pass [T a]
          , Production B $ Prod Pass [NT A, T b]
          , Production B $ Prod Pass [T b]
          , Production C $ Prod Pass [NT A, NT B, NT C]
          ]
  }

dG' :: Grammar () String String
dG' = defaultGrammar "A"

dragonBook428 :: Grammar () String String
dragonBook428 = dG'
  { ns = fromList ["E", "E'", "T", "T'", "F"]
  , ts = fromList ["+", "*", "(", ")", "id"]
  , s0 = "E"
  , ps = [ Production "E"  $ Prod Pass [NT "T", NT "E'"]
         , Production "E'" $ Prod Pass [T "+", NT "T", NT "E'"]
         , Production "E'" $ Prod Pass [Eps] -- Implicitly epsilon
         , Production "T"  $ Prod Pass [NT "F", NT "T'"]
         , Production "T'" $ Prod Pass [T "*", NT "F", NT "T'"]
         , Production "T'" $ Prod Pass [Eps]
         , Production "F"  $ Prod Pass [T "(", NT "E", T ")"]
         , Production "F"  $ Prod Pass [T "id"]
         ]
  }

dragonBook41 :: Grammar () String String
dragonBook41 = dG'
  { ns = fromList ["E'", "E", "T", "F"]
  , ts = fromList ["+", "*", "(", ")", "id"]
  , s0 = "E"
  , ps =  [ Production "E" $ Prod Pass [NT "E", T "+", NT "T"]
          , Production "E" $ Prod Pass [NT "T"]
          , Production "T" $ Prod Pass [NT "T", T "*", NT "F"]
          , Production "T" $ Prod Pass [NT "F"]
          , Production "F" $ Prod Pass [T "(", NT "E", T ")"]
          , Production "F" $ Prod Pass [T "id"]
          ]
  }

dragonBook455 :: Grammar () String String
dragonBook455 = dG'
  { ns = fromList ["S", "C"]
  , ts = fromList ["c", "d"]
  , s0 = "S"
  , ps =  [ Production "S" $ Prod Pass [NT "C", NT "C"]
          , Production "C" $ Prod Pass [T "c", NT "C"]
          , Production "C" $ Prod Pass [T "d"]
          ]
  }

dumbGrammar :: Grammar () String String
dumbGrammar = dG'
  { ns = fromList ["S", "A", "B", "I", "D"]
  , ts = fromList ["1","2","3","+","-","*"]
  , s0 = "S"
  , ps = [ Production "S" $ Prod Pass [NT "A"]
         , Production "S" $ Prod Pass [NT "B"]
         , Production "S" $ Prod Pass [NT "D"]
         , Production "A" $ Prod Pass [NT "I", T "+", NT "I"]
         , Production "B" $ Prod Pass [NT "I", T "-", NT "I"]
         , Production "I" $ Prod Pass [T "1"]
         , Production "I" $ Prod Pass [T "2"]
         , Production "I" $ Prod Pass [T "3"]
         , Production "D" $ Prod Pass [NT "I", T "*", NT "I"]
         ]
  --, us = [(\_ -> True)]
  }