{-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies#-} {-# OPTIONS_GHC -Wno-missing-signatures #-} module Grammar where import Data.Char (Char) import qualified Data.Functor as Functor import qualified Grammar.Brainfuck import qualified Grammar.Nandlang import Symantic.Parser data G = forall a. G ( forall repr. Grammar Char repr => repr a ) rawGrammars :: [G] rawGrammars = [ G g1 , G g2 , G g3 , G g4 , G g5 , G g6 , G g7 , G g8 , G g9 , G g10 , G g11 , G g12 , G g13 , G g14 , G g15 , G g16 ] grammars :: [G] grammars = (\(G g) -> G (observeSharing g)) Functor.<$> rawGrammars g1 = char 'a' g2 = string "abc" g3 = many (char 'a') g4 = some (string "abcd") g5 = some (string "abcd") <* eof g6 = traverse char "aa" <|> traverse char "ab" g7 = string "aa" <|> string "ab" g8 = many (char 'r') <* eof g9 = eof g10 = char 'a' <|> char 'b' g11 = many (char 'a') <* char 'b' g12 = many (oneOf ['a', 'b', 'c', 'd']) <* eof g13 = Grammar.Brainfuck.grammar g14 = Grammar.Nandlang.grammar g15 = (char 'a' <|> char 'b') <* char 'c' g16 = (char 'a' <|> char 'b' <|> char 'c') <* char 'd'