GrammarProducts-0.1.0.0: FormalLanguage/GrammarProduct/QQ.hs
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
-}