module FormalLanguage.GrammarProduct.QQ where import Language.Haskell.TH import Language.Haskell.TH.Quote import Text.Trifecta.Delta (Delta (Directed)) import Text.Trifecta (parseString) import Text.Trifecta.Result (Result (..)) import Control.Monad.Trans.State.Strict (evalStateT) import Data.Default (def) import Data.ByteString.Char8 (pack) import Control.Lens import FormalLanguage.CFG.QQ (trim, parseFormalLanguage) import FormalLanguage.CFG.PrettyPrint.ANSI import FormalLanguage.CFG.Parser import FormalLanguage.CFG.TH import FormalLanguage.CFG.Grammar import FormalLanguage.GrammarProduct.Parser (parseGrammarProduct) grammarProductF = quoteFile grammarProduct grammarProduct = QuasiQuoter { quoteDec = parseFormalLanguage parseGrammarProduct , quoteExp = err , quotePat = err , quoteType = err } where err = error "there is only a Dec quoter" {- parseGrammarProduct :: String -> Q [Dec] parseGrammarProduct s = do loc <- location let (lpos,cpos) = loc_start loc let r = parseString ((evalStateT . runGrammarP) P.productParser def) (Directed (pack "via QQ") (fromIntegral lpos) 0 0 0) $ trim s case r of (Failure f) -> do runIO . printDoc $ f fail "aborting parseGrammarProduct" (Success g') -> do let g = reverse g' runIO . mapM_ (printDoc . grammarDoc) $ g zs <- thCodeGen $ last g return zs -}